Filtre RII pour calcul en temps réel de valeur moyenne

Dependencies:   mbed

Committer:
pierreprovent
Date:
Thu Oct 22 12:23:05 2020 +0000
Revision:
0:ccad817e9e12
Valeur moyenne

Who changed what in which revision?

UserRevisionLine numberNew 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 }