Objectif
L’objectif du tuto est l’implémentation sur Arduino des trois approximations suivantes de la dérivée première. T indique la période d’échantillonnage inverse de la fréquence d’échantillonnage :
- Approximation avance: f’(n)=[ f(n+1) – f(n)]/T
- Approximation arrière: f’(n)=[ f(n) – f(n-1)]/T
- Approximation centrée: f’(n)=[ f(n+1) + 0 – f(n-1)]/(2T)
Comment implémenter la dérivée ?
Principe
Les deux premières approximations tiennent en considération deux enchantions successifs. En revanche, la dernière approximation nécessite deux échantillons f(n+1) et f(n-1) symétriques par rapport à f(n). Par conséquent, durant l’implémentation on va utiliser un tableau de trois élément pour stocker les échantillons f(n), f(n-1) et f(n+1).
Attention, l’ordre des échantillons est primordial durant le calcul de la dérivée !
Démarche d’implémentation
On déclare un tableau Tab[3] de trois élément ordonnés de la façon suivante [x(n) x(n-1) x(n-2)]. Pour chaque itération de la boucle on va effectuer les opérations suivantes :
- Acquisition de nouveau échantillon x(n)
- Décaler les éléments du tableaux Tab:
- Tab[2] <= Tab[1]
- Tab[1] <= Tab[0]
- Incrustation du nouvel échantillon dans le tableau
- Tab[0] <= x(n)
- Calcul des approximations de la dérivée première :
- x1_n=(Tab[0]- Tab[1])/T
- x1_n=(Tab[1]- Tab[2])/T
- x1_n=(Tab[0]- Tab[2])/ (2T)
Implémentation des approximations
On dispose de deux fonctions diff1( ) et diff1_3() pour le calcul de la dérivée première. Ci-dessous la déclaration et la définition des deux fonctions.
La fonction diff1( )
La fonction prend en entrée le nouvel échantillon x(n), la période d’échantillonnage en milliseconde et le type de l’approximation. Puis, elle renvoie la valeur de l’approximation.
- Type=0 : Approximation avance
- Type=1 : Approximation arrière
- Type=2: Approximation centrée
- Type=x : Renvoie x(n)
La fonction renvoie un résultat à la fois, du coup on ne peut pas savoir les trois résultats au même temps. Il faut trois itérations de la boucle (Type=0 , Type=1 et Type=2) pour connaitre les trois résultats, du coup il faut prévoir un décalage entre les approximations. D’où l’utilisation de la deuxième fonction. Ci-dessous la définition de la fonction diff1( ).
Le mot static permet de préserver les échantillons du tableau x[ ] entre les appels de la fonction. Sans utilisation du mot static, les échantillons d’avant seront perdus.
La fonction diff1_3( )
diff1_3() est une fonction compacte, rapide qui renvoie les trois approximations au même temps en une seule itération sous forme d’un tableau *diff (pointeur) de trois éléments. Ci-dessous la définition de la fonction.
Test du programme
Pour tester les approximations on a besoin de générer une fonction f(n), puis on calcul sa dérivée en utilisant les trois approches. L’astuce consiste à générer une fonction triangulaire sous forme d’un compteur qui monte de 0 à une valeur maximale, puis décroit de la même façon à zéro. Du coup on obtient une fonction f(n)=n croissante et décroissante. Le résultat de la dérivée doit être sous forme d’un signal rectangulaire (voir la vidéo pour plus des détails). Ci-dessous un extrait du code dédié à la génération d’un signal triangulaire.
2 réponses sur « Asservissement | Arduino #4: Discrétisation de la dérivée première – Partie 2/2 »
Bonjour. SVP est ce possible d’avoir de nouveau accès aux différents code? Ils ne sont plus affichés.
Merci pour ton commentaire, c’est bon, j’ai réglé le soucis d’affichage 🙂