| Riferimento | Attuatore |
![]() |
![]() |
| Retroazione |
![]() |
// Tmin a 3500 RPM = 60000/3500 =17mS
// Tmax a 500 RPM = 60000/500 =120mS
#define enc 2
#define K 60000.0 // 60/10e-3
unsigned long ot=0;
unsigned long t;
void setup()
{
pinMode(enc, INPUT);
attachInterrupt(0, int_srv, RISING);
Serial.begin(9600);
}
void loop()
{
Serial.print(t);
Serial.print(" mS ");
Serial.print(K/t);
Serial.print(" RPM");
}
void int_srv()
{
unsigned long tmp;
tmp=millis();
t=tmp-ot;
ot=tmp;
}Realizzare il software per controllo della velocità dell'albero motore:
Arduino(A0) a 0V, RPM=0
Arduino(A0) a 5V, RPM=3300
#define enc 2
#define K 60000000.0 // costante per l'elaborazione della velocità RPM
#define A 1/8 // costante che determina la velocità di reazione (un aumento di A corrisponde ad un aumento della velocità di reazione)
unsigned long ot=0;
unsigned long t;
int u;
void setup()
{
pinMode(enc, INPUT);
attachInterrupt(0, int_srv, RISING);
Serial.begin(9600);
}
void loop()
{
long int ref,retro,err;
ref=analogRead(A0); // ref =0..1023
retro=K/t/3.3; // K/t=0..3300 RPM, retro=0..1000
err=(ref-retro); // elaborazione errore
u+=err*A; // elaborazione uscita
if (u>255) // limitazione uscita
u=255;
else
if (u<0)
u=0;
analogWrite(3,u); // output uscita
if (micros()>(ot+300000)) // forzatura di t in caso di albero fermo
t=300000;
delay(200); // ritardo per ottenere la misura di velocità fedele
Serial.print("v:");
Serial.print(K/t);
Serial.print(" RPM ");
Serial.print(" rif:");
Serial.print(ref);
Serial.print(" retro:");
Serial.print(retro);
Serial.print(" err:");
Serial.print(err);
Serial.print(" out:");
Serial.println(u);
}
void int_srv()
{
unsigned long tmp;
tmp=micros();
t=tmp-ot; // t=tempo in uS tra due impulsi su canale C
ot=tmp;
}