Controllo di velocitÓ PWM per motore cc con retroazione ad encoder con scheda Arduino

Riferimento Attuatore

 

Retroazione

 

 

Lettura velocitÓ tramite Encoder usando l'interrupt

// 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; 
}