Pierre Provent
/
Filtre_RII_Valeur_Moyenne_Nucleo_F429ZI
Filtre RII pour calcul en temps réel de valeur moyenne
main.cpp@0:ccad817e9e12, 2020-10-22 (annotated)
- Committer:
- pierreprovent
- Date:
- Thu Oct 22 12:23:05 2020 +0000
- Revision:
- 0:ccad817e9e12
Valeur moyenne
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
pierreprovent | 0:ccad817e9e12 | 1 | #include "mbed.h" |
pierreprovent | 0:ccad817e9e12 | 2 | |
pierreprovent | 0:ccad817e9e12 | 3 | #define fech 40000 // Fréquence d'échantillonnage souhaitée |
pierreprovent | 0:ccad817e9e12 | 4 | |
pierreprovent | 0:ccad817e9e12 | 5 | Serial pc(USBTX, USBRX); |
pierreprovent | 0:ccad817e9e12 | 6 | |
pierreprovent | 0:ccad817e9e12 | 7 | /* Entrées sorties */ |
pierreprovent | 0:ccad817e9e12 | 8 | AnalogIn entree(PF_10); // A5 connecteur Arduino |
pierreprovent | 0:ccad817e9e12 | 9 | PwmOut monpwm(PD_14); // D10 Arduino |
pierreprovent | 0:ccad817e9e12 | 10 | |
pierreprovent | 0:ccad817e9e12 | 11 | /* Timer et Ticker */ |
pierreprovent | 0:ccad817e9e12 | 12 | Ticker read_sample_ticker ; |
pierreprovent | 0:ccad817e9e12 | 13 | |
pierreprovent | 0:ccad817e9e12 | 14 | /* Interruptions */ |
pierreprovent | 0:ccad817e9e12 | 15 | InterruptIn button(USER_BUTTON); |
pierreprovent | 0:ccad817e9e12 | 16 | |
pierreprovent | 0:ccad817e9e12 | 17 | /* Variables globales */ |
pierreprovent | 0:ccad817e9e12 | 18 | float in = 0 ; |
pierreprovent | 0:ccad817e9e12 | 19 | float moy = 0 ; |
pierreprovent | 0:ccad817e9e12 | 20 | int pwmperiode = 500 ; // us |
pierreprovent | 0:ccad817e9e12 | 21 | int pwmpulsewidth = 250 ; // us |
pierreprovent | 0:ccad817e9e12 | 22 | |
pierreprovent | 0:ccad817e9e12 | 23 | /* Programmes d'interruption */ |
pierreprovent | 0:ccad817e9e12 | 24 | void pressed() |
pierreprovent | 0:ccad817e9e12 | 25 | { |
pierreprovent | 0:ccad817e9e12 | 26 | pwmpulsewidth += 0.1*pwmperiode ; |
pierreprovent | 0:ccad817e9e12 | 27 | if (pwmpulsewidth > pwmperiode ) pwmpulsewidth = 0 ; |
pierreprovent | 0:ccad817e9e12 | 28 | monpwm.pulsewidth_us(pwmpulsewidth); |
pierreprovent | 0:ccad817e9e12 | 29 | } |
pierreprovent | 0:ccad817e9e12 | 30 | |
pierreprovent | 0:ccad817e9e12 | 31 | void read_sample() { |
pierreprovent | 0:ccad817e9e12 | 32 | in = 3.3f*entree.read(); // Conversion en volts |
pierreprovent | 0:ccad817e9e12 | 33 | moy = 0.0001f*in + 0.9999f*moy ; |
pierreprovent | 0:ccad817e9e12 | 34 | /* Calcul de la valeur moyenne avec un filtre récursif d'ordre 1 */ |
pierreprovent | 0:ccad817e9e12 | 35 | /* y(n) = (1 + a)*x(n) - a*y(n-1) */ |
pierreprovent | 0:ccad817e9e12 | 36 | /* a = -0.9999 pour un lissage fort */ |
pierreprovent | 0:ccad817e9e12 | 37 | } |
pierreprovent | 0:ccad817e9e12 | 38 | |
pierreprovent | 0:ccad817e9e12 | 39 | int main() |
pierreprovent | 0:ccad817e9e12 | 40 | { |
pierreprovent | 0:ccad817e9e12 | 41 | button.rise(&pressed); |
pierreprovent | 0:ccad817e9e12 | 42 | pc.printf("\033[2J"); // Sequence escape pour effacer la console |
pierreprovent | 0:ccad817e9e12 | 43 | pc.printf("\033[0;0H"); // Curseur en 0 ; 0 |
pierreprovent | 0:ccad817e9e12 | 44 | pc.printf("Mesure de valeur moyenne d'un signal analogique injecte sur la broche PF_10(A5)\n"); |
pierreprovent | 0:ccad817e9e12 | 45 | pc.printf("Calcul par filtre numerique passe-bas recursif RII premier ordre\n"); |
pierreprovent | 0:ccad817e9e12 | 46 | pc.printf("Signal test interne disponible : PWM sur broche PD_14 (D10)\n"); |
pierreprovent | 0:ccad817e9e12 | 47 | pc.printf("Entrer la periode du signal PWM : 500 us < T < 50 000 us : "); |
pierreprovent | 0:ccad817e9e12 | 48 | pc.scanf("%d",&pwmperiode) ; pc.printf("\n"); |
pierreprovent | 0:ccad817e9e12 | 49 | pwmpulsewidth = pwmperiode/2 ; |
pierreprovent | 0:ccad817e9e12 | 50 | monpwm.period_us(pwmperiode); |
pierreprovent | 0:ccad817e9e12 | 51 | monpwm.pulsewidth_us(pwmpulsewidth); |
pierreprovent | 0:ccad817e9e12 | 52 | pc.printf("Relier le signal analogique externe ou le signal test interne sur PF_10(A5)\n"); |
pierreprovent | 0:ccad817e9e12 | 53 | pc.printf("Bouton USER pour modifier le rapport cyclique du signal test si necessaire\n"); |
pierreprovent | 0:ccad817e9e12 | 54 | pc.printf("fech = %d Hz\n",fech); |
pierreprovent | 0:ccad817e9e12 | 55 | read_sample_ticker.attach_us(&read_sample,1000000/fech); |
pierreprovent | 0:ccad817e9e12 | 56 | while (1) { |
pierreprovent | 0:ccad817e9e12 | 57 | pc.printf("\nFrequence signal test PWM = %d Hz Rapport cyclique = %4d %%\n", |
pierreprovent | 0:ccad817e9e12 | 58 | 1000000/pwmperiode,(100*pwmpulsewidth)/pwmperiode); |
pierreprovent | 0:ccad817e9e12 | 59 | pc.printf("Valeur moyenne du signal sur PF_10(A5) = %10.3f volts\n",moy) ; |
pierreprovent | 0:ccad817e9e12 | 60 | pc.printf("\033[3A"); // Sequence escape qui remonte le curseur de 3 lignes sur la console |
pierreprovent | 0:ccad817e9e12 | 61 | wait(0.2) ; // pause affichage |
pierreprovent | 0:ccad817e9e12 | 62 | } |
pierreprovent | 0:ccad817e9e12 | 63 | } |