Catégories
Projets électroniques

Comment mesurer la vitesse d’un actionneur linéaire rapide ? Partie 2

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.

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

Laisser un commentaire

L'Avenir de l'Électronique : Des Projets Innovants Vous Attendent !