MAL4X Научно-технический форум разработчиков симуляторов и автоматики


Симуляторы перегрузок. DIY электроника. ЭВМ. Компьютерные сети.
Up

Данные: что передавать и как регулировать

Строим реалистичный симулятор перегрузок своими руками. Рекомендации. Советы.

Модераторы: Death_Morozz, null, Ale

Re: Данные: что передавать и как регулировать

Сообщение taran_ob » 24 ноя 2012, 02:43

taran_ob
Комсорг
 
Сообщения: 137
Зарегистрирован: 27 окт 2012, 22:05
Откуда: Ukraine
Благодарил (а): 5 раз.
Поблагодарили: 11 раз.
Баллы репутации: 19
Новичок

Re: Данные: что передавать и как регулировать

Сообщение taran_ob » 24 ноя 2012, 10:15

Ale писал(а):Как бы эту теорию проверить???


Было бы здорово, чтоб в программе управления была возможность подгрузить семпл - текстовый файл с произвольной траекторией, включающей в с себя максимальные перегрузки. Эту траекторию отображаем на графике одним цветом. Шлем координаты из траектории в контроллер. В ответ на координату, контроллер возвращает текущую координату, по которой программа рисует траекторию другим цветом. Настройка контроллера (всякие коэффициенты) сводится к тому чтоб графики эталонной и реальной траекторий максимально совпадали. При таком подходе, сим сможет настроить и ребенок, не понимающий ни чего в ПИД.
taran_ob
Комсорг
 
Сообщения: 137
Зарегистрирован: 27 окт 2012, 22:05
Откуда: Ukraine
Благодарил (а): 5 раз.
Поблагодарили: 11 раз.
Баллы репутации: 19
Новичок

Re: Данные: что передавать и как регулировать

Сообщение taran_ob » 24 ноя 2012, 10:44

Еще одно практическое пожелание к регулятору. Номинальное напряжение моих движков 48В. Есть трансформаторы с обмоткой 56В, после выпрямителя с конденсатором 56*1.4=78.4В. Хотелось бы иметь возможность задавать максимальное значение ШИМ, тем самым программно ограничивать ток через двигатель, так как аппаратного ограничения тока в мостовом драйвере может и не быть. Но для этого желательно иметь ШИМ с большей разрядностью, хотя бы 512.
taran_ob
Комсорг
 
Сообщения: 137
Зарегистрирован: 27 окт 2012, 22:05
Откуда: Ukraine
Благодарил (а): 5 раз.
Поблагодарили: 11 раз.
Баллы репутации: 19
Новичок

Re: Данные: что передавать и как регулировать

Сообщение Ale » 24 ноя 2012, 11:49

taran_ob писал(а):желательно иметь ШИМ с большей разрядностью, хотя бы 512.

Сейчас реализован 10-битный шим - 1024 значения. Ограничить - нет проблем
Аватара пользователя
Ale
Разработчик
 
Сообщения: 1477
Зарегистрирован: 01 фев 2011, 20:48
Откуда: Дубна
Благодарил (а): 570 раз.
Поблагодарили: 595 раз.
Баллы репутации: 277
ТехнарьТехнарьТехнарь

Re: Данные: что передавать и как регулировать

Сообщение Ale » 24 ноя 2012, 11:50

taran_ob писал(а):Было бы здорово, чтоб в программе управления была возможность подгрузить семпл - текстовый файл с произвольной траекторией

Уже реализовано в отладочной программе xSimCTRL.exe
Аватара пользователя
Ale
Разработчик
 
Сообщения: 1477
Зарегистрирован: 01 фев 2011, 20:48
Откуда: Дубна
Благодарил (а): 570 раз.
Поблагодарили: 595 раз.
Баллы репутации: 277
ТехнарьТехнарьТехнарь

Re: Данные: что передавать и как регулировать

Сообщение taran_ob » 24 ноя 2012, 11:54

Пардон, не доглядел...
А что скажешь по поводу rs485, с раздельными контроллерами?
taran_ob
Комсорг
 
Сообщения: 137
Зарегистрирован: 27 окт 2012, 22:05
Откуда: Ukraine
Благодарил (а): 5 раз.
Поблагодарили: 11 раз.
Баллы репутации: 19
Новичок

Re: Данные: что передавать и как регулировать

Сообщение Ale » 24 ноя 2012, 12:09

taran_ob писал(а):А что скажешь по поводу rs485, с раздельными контроллерами?

Нет абсолютно никаких проблем. Но я все еще считаю это избыточным. Самый простой AVRmega имеет на борту ДВА канала аппаратных ШИМ. И уж поверь, расчетных мощностей вполне хватит для реализации ДВУХ даже самых навороченных ПИД каналов. Так что я проголосую за один контроллер на два движка.
А про RS485 - вполне здравая идея. НО требующая доп вложений. На компах такого интерфейса нет. Поэтому по любому придется делать переходник USB-RS на FTDI. Есть несколько путей-
1 - покупка (наверняка есть, я не качал)
2- реализация прямо на плате контроллера, как сейчас есть, но пустить канал 485-й дальше на выход, к которому можно цепочкой подключать следующие контроллеры уже без USB преобрезователей,
3 - изготовление своего преобразователя, автономного, тогда на всех контроллерах вместо USB преобразователя набо будет ставить по две микрухи 485 (на вход и выход)
Аватара пользователя
Ale
Разработчик
 
Сообщения: 1477
Зарегистрирован: 01 фев 2011, 20:48
Откуда: Дубна
Благодарил (а): 570 раз.
Поблагодарили: 595 раз.
Баллы репутации: 277
ТехнарьТехнарьТехнарь

Re: Данные: что передавать и как регулировать

Сообщение taran_ob » 24 ноя 2012, 12:18

Ale писал(а):Самый простой AVRmega имеет на борту ДВА канала аппаратных ШИМ. И уж поверь, расчетных мощностей вполне хватит для реализации ДВУХ даже самых навороченных ПИД каналов.


А как быть если движков 4? Хватит ли мощностей для программной реализации 4ШИМ, 4энкодеров ?
taran_ob
Комсорг
 
Сообщения: 137
Зарегистрирован: 27 окт 2012, 22:05
Откуда: Ukraine
Благодарил (а): 5 раз.
Поблагодарили: 11 раз.
Баллы репутации: 19
Новичок

Re: Данные: что передавать и как регулировать

Сообщение Ale » 24 ноя 2012, 12:31

taran_ob писал(а):А как быть если движков 4? Хватит ли мощностей для программной реализации 4ШИМ, 4энкодеров ?

Стоп. Если 4 движка - ставим 2 контроллера (ты ведь вообще на 4 движка 4 контроллера предлагаешь :D ). Это во-первых. Во-вторых - контроллер типа mega644 (в дип корпусе) имеет два канала 16-битных ШИМ (мы из них делаем 10-бит) + два канала 8-битных ШИМ. А вот контроллер mega64 в корпусе tqfp-64 - уже 6 каналов аппаратных 16-битных ШИМ. Но плату под его в домашних условиях трудно изготовить. Я себе сделал, но я на заводе заказываю.
Так что на atmega64 ресурсов хватит и на 4 канала.
Аватара пользователя
Ale
Разработчик
 
Сообщения: 1477
Зарегистрирован: 01 фев 2011, 20:48
Откуда: Дубна
Благодарил (а): 570 раз.
Поблагодарили: 595 раз.
Баллы репутации: 277
ТехнарьТехнарьТехнарь

Re: Данные: что передавать и как регулировать

Сообщение taran_ob » 24 ноя 2012, 13:00

В принципе согласен, но есть несколько доводов:
1 ЛУТом сделать 4 одинаковые, маленькие платки, скажем с мега8 или вообще с тини2313 если отказаться от аналоговых датчиков, гораздо проще чем одну с монстром с 64 ногами.
2 У меня есть отрицательный опыт в управлении несколькими мощными индуктивными нагрузками от одного МК. Считаю, что гальванически развязывать мосты друг от друга нужно обязательно. Да это и удобно, потому что найти блок питания, скажем, на 800 Вт для 4х движков сложнее чем 4х200 Вт. При реализации управления от одного МК придется ШИМить через оптроны, а это не совсем правильно. А если появится необходимость в обратной связи по току - вообще труба. Проще и правильней развязать rx232.
3 Написать программу МК для управления одним двигателем проще чем для 4х.
4 С разделением - конструкция становится модульной, что тоже +.
taran_ob
Комсорг
 
Сообщения: 137
Зарегистрирован: 27 окт 2012, 22:05
Откуда: Ukraine
Благодарил (а): 5 раз.
Поблагодарили: 11 раз.
Баллы репутации: 19
Новичок

Re: Данные: что передавать и как регулировать

Сообщение taran_ob » 24 ноя 2012, 13:03

Мы наверно не много офтопим?
taran_ob
Комсорг
 
Сообщения: 137
Зарегистрирован: 27 окт 2012, 22:05
Откуда: Ukraine
Благодарил (а): 5 раз.
Поблагодарили: 11 раз.
Баллы репутации: 19
Новичок

Re: Данные: что передавать и как регулировать

Сообщение kuzevan » 28 ноя 2012, 13:09

Выкладываю программку для Ардуино управления двигателем.
Код: Выделить всё
/*
Программа управления одним двигателем
от управляющей программы Ale
c kuzevan
*/
//ноги Ардуино
#define INA 8
#define INB 9
#define _PWM 10
#define AT 0

#define DEG 300.0
#define K1 57.0
#define K2 42.0
#define MAX_TIME 34

String inputString = "";         // a string to hold incoming data
boolean stringComplete = false;  // whether the string is complete

int pmax,pmin;//мин и макс потенциометра
int dest,dest_p,pot,pos,last_pos,dir;
byte speed_pwm;
float acc,v0;
long pwm, pwm_d;
float max_acc;
int timer;
char outputString[]="[000000000000000000000000]";

void setup()
{
  pmin=(unsigned int)(1024.0*((DEG-180.0)/2)/DEG);
  pmax=(unsigned int)(1024.0*((DEG-180.0)/2+180.0)/DEG);
  v0=0.0;
  max_acc=(255.0-K2)/K1;
  last_pos=map(analogRead(AT),pmin,pmax,0,255);
  dir=0;
  speed_pwm=0;
  inputString.reserve(32);
  Serial.begin(115200);
}

void loop()
{
  if(stringComplete){
    dest=(byte)inputString.charAt(3);
    timer=millis();
    dest_p=map(dest,0,255,pmin,pmax);
    pos=map(analogRead(AT),pmin,pmax,0,255);
    acc=2.0*((float)(dest-pos)-v0);
    //вычисление ШИМ
    if(v0>=0)
        pwm=(long)(K1*acc+K2);//вверх
    else
        pwm=(long)(K1*acc-K2);//вниз
    //перезапуск двигателя
    Restart();
    if(pwm==255)
        v0=(float)(pos-last_pos)+max_acc*1.5;
    else if(pwm==-255)
        v0=(float)(pos-last_pos)-max_acc*1.5;
    else
        v0=(float)(dest-pos)+acc/2.0;
    last_pos=pos;
    inputString = "";
    stringComplete = false;
  }
  pot=analogRead(AT);
  if((millis()-timer)>MAX_TIME){
    Go(0,0);
  }
  ToString(2,outputString+1,dest);
  ToString(4,outputString+3,map(pot,pmin,pmax,0,255));
  ToString(4,outputString+7,pwm_d+255);
  Serial.print(outputString);
}

void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    inputString += inChar;
    delayMicroseconds(100);
  }
  if((byte)inputString.charAt(2)==0xFF){
    stringComplete = true;
  }
  else
    inputString = "";
}

void Restart(void)
{
  int d;
  if(pwm<0) d=-1;
  else d=1;
  if(pwm>255)
    pwm=255;
  else if(pwm<-255)
    pwm=-255;
  Go(d,(byte)(d*pwm));
}

void ToString(int n,char *buf, int val)
{
  int i,k;
  for(i=n-1;i>=0;i--){
    k=val%16;
    if(k>9) buf[i]=(char)k+'A'-10;
    else buf[i]=(char)k+'0';
    val/=16;
  }
}

void Go(int d,byte s)
{
  if(d!=dir){
    analogWrite(_PWM,0);
    speed_pwm=0;
    digitalWrite(INA, LOW);
    digitalWrite(INB, LOW);
    if(d==1)
      digitalWrite(INA, HIGH);
    else if(d==-1)
      digitalWrite(INB, HIGH);
    dir=d;
  }
  if(s!=speed_pwm){
    analogWrite(_PWM,s);
    speed_pwm=s;
  }
}

Написана без изысков, по теории, изложенной в первом посте.
При использовании надо поправить цифры в #define:
-ноги Ардуино
- рабочий оборот потенциометра DEG
- параметры двигателя К1 и К2, они здесь для газелевского. Программку для их определения выложу позже.
Управлять двигателем можно из программы Ale http://mal4x.ru/viewtopic.php?f=6&t=209, или любой, дающей стандартный выход на контроллер.
Программа Ale дала такую картинку:
Изображение
Заметно, что значения ШИМ почти всегда занимают крайние положения, запаса по мощности нет, можно, даже, релейное управление применять.
Если кто-нибудь потестит, прошу отписаться.
Аватара пользователя
kuzevan
Парторг
 
Сообщения: 60
Зарегистрирован: 25 окт 2011, 17:17
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Баллы репутации: -6

Re: Данные: что передавать и как регулировать

Сообщение null » 28 ноя 2012, 14:09

kuzevan писал(а):Программа Ale дала такую картинку:

Это картинка с реального мотора под нагрузкой?
Русский X-Simulator
Изображение
За пределами форума. Мой инстаграмм.
Аватара пользователя
null
SIMER
 
Сообщения: 1041
Зарегистрирован: 03 мар 2010, 18:42
Откуда: Ростов-на-Дону
Благодарил (а): 219 раз.
Поблагодарили: 160 раз.
Баллы репутации: 138
ТехнарьТехнарь

Re: Данные: что передавать и как регулировать

Сообщение kuzevan » 28 ноя 2012, 14:12

Без нагрузки. Пока нагрузить нечем, симулятора нет, а городить что-то лень.
Аватара пользователя
kuzevan
Парторг
 
Сообщения: 60
Зарегистрирован: 25 окт 2011, 17:17
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Баллы репутации: -6

Re: Данные: что передавать и как регулировать

Сообщение null » 28 ноя 2012, 14:18

а что за мотор и что использовано в качестве обратной связи? потенциометр?
Русский X-Simulator
Изображение
За пределами форума. Мой инстаграмм.
Аватара пользователя
null
SIMER
 
Сообщения: 1041
Зарегистрирован: 03 мар 2010, 18:42
Откуда: Ростов-на-Дону
Благодарил (а): 219 раз.
Поблагодарили: 160 раз.
Баллы репутации: 138
ТехнарьТехнарь

Пред.След.

Вернуться в X-SIMULATOR и RU-SIMULATOR & SimTools

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 159

cron
x

#{title}

#{text}