Objectif
Ce tutoriel présente une technique fiable pour mesurer en temps réel la vitesse de rotation d’un actionneur linéaire. Faisant suite à un précédent tutoriel qui traitait des problèmes de seuil et de composante continue affectant la précision de telles mesures, celui-ci propose une solution robuste.
VIDEO
Programme Arduino
#define PWM_PIN 3 #define NUM_MEAN 16 #define ADC_SEUIL 1450.0 #define VITESSE_TR_MIN 95.0 #define STEP_PWM 0.5 #define PWM_MIN 250.0 #define PWM_MAX 250.0 #define DELAY_uS 100000 const unsigned long NUM_MEAN_DC=4096; unsigned long T0, T; unsigned long count_iter=0; double T_s; double F_s=0.0; static byte pwm_i=PWM_MIN; double pwm_f=PWM_MIN; double adc_mv=0.0, adc_mv_diff=0.0; double somme=0.0; bool res_status=false; double vitesse=0.0; unsigned long T_0_pwm; double mean_dc=0.0, somme_dc=0.0; unsigned long count_dc=0; void setup() { //Interface série (tests) Serial.begin(115200); //PWM pinMode(PWM_PIN, OUTPUT); analogWrite(PWM_PIN, PWM_MIN); //Init T0=micros(); T_0_pwm=micros(); } void loop() { //1. Filtrage for(int i=0;i<NUM_MEAN;i ) somme =(double)analogRead(A0); adc_mv=somme/(double)NUM_MEAN; adc_mv=1000.0*adc_mv*5.0/1023.0; somme=0.0; //2. Seuillage res_status= adc_mv_diff>0.0; //res_status= adc_mv>ADC_SEUIL; //Serial.println(String(ADC_SEUIL*res_status) " ," String(adc_mv)); return; //3. Mesure de la vitesse if(res_status!=0) count_iter ; else{ if(count_iter!=0){ T=micros(); T_s=1.0E-6*((double)T-(double)T0)*(double)count_iter; if(T_s!=0.0){ F_s=1.0/(2.0*T_s); vitesse=60.0*F_s; Serial.println("Vitesse(Tr/Min)=" String(vitesse)); } } count_iter=0; } //Composante DC if(count_dc >=NUM_MEAN_DC){ mean_dc=somme_dc/((double)NUM_MEAN_DC); count_dc=0; somme_dc=0.0; }else{ count_dc ; somme_dc =adc_mv; } adc_mv_diff=adc_mv-mean_dc; //Serial.println(String(adc_mv) " ," String(mean_dc) " ," String(adc_mv_diff)); //Serial.println(adc_mv_diff); //Serial.println(String(adc_mv_diff) " ," String(250.0*res_status)); //Init T0 T0=micros(); }
Mesure de la vitesse