Модераторы: Death_Morozz, null, Ale
Ale писал(а):Как бы эту теорию проверить???
taran_ob писал(а):желательно иметь ШИМ с большей разрядностью, хотя бы 512.
taran_ob писал(а):Было бы здорово, чтоб в программе управления была возможность подгрузить семпл - текстовый файл с произвольной траекторией
taran_ob писал(а):А что скажешь по поводу rs485, с раздельными контроллерами?
Ale писал(а):Самый простой AVRmega имеет на борту ДВА канала аппаратных ШИМ. И уж поверь, расчетных мощностей вполне хватит для реализации ДВУХ даже самых навороченных ПИД каналов.
taran_ob писал(а):А как быть если движков 4? Хватит ли мощностей для программной реализации 4ШИМ, 4энкодеров ?
/*
Программа управления одним двигателем
от управляющей программы 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;
}
}
kuzevan писал(а):Программа Ale дала такую картинку:
Вернуться в X-SIMULATOR и RU-SIMULATOR & SimTools
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 25