Catégories
Algorithme Arduino Onduleur Projets Arduino Projets électroniques pwm spwm

Commande sPWM : Partie 3

Objectifs de la vidéo

  • Analyses des performances d’un signal sPWM avec Arduino
  • Savoir mesurer la fréquence réelle d’un onduleur en utilisant le signal sPWM
  • Savoir les limitations du code Arduino
  • Savoir paramétrer un signal sPWM avec Arduino
  • Analyse des d’un signal sPWM avec le port série
  • Comprendre la  le principe du signal sPWM : PWM de type sinusoïdal
  • Connaitre les paramètres d’un signal SPWM

Voir la vidéo pour plus de détails

Le Programme Arduino

#define   R_PWM       5       // Commande 1 pont H 
#define L_PWM 6 // Commande 2 pont H

#define TestFreq 7 // Mesure de la fréquence

#define TimerBit 7 // Amplitude du signal sinusoïdal 2^8
#define N 256 // Nombre d’échantillons du tableau) 512=2^9
#define TimerStep 16 // Pas d'incrémentation du Timer
#define T0_us 100 // Période d'incrémentation du Timer
// Période globale T=2*N*T0_us => F=1/F: Fréquence Onduleur




unsigned long MedSine[N];
unsigned long TimerSPWM=0;
unsigned long i_sin=0;
bool sPWM_l=false;
bool sPWM_r=true;
bool sinePolar=false;
double sine_val=0;

void setup()
{
// Init sortie
pinMode(R_PWM, OUTPUT);
pinMode(L_PWM, OUTPUT);
pinMode(TestFreq, OUTPUT);



// Génération du signal sinusoïdal: 1/2 Période (2*N échantillons/période)
for (unsigned int i=0; i<N; i++)
{
sine_val=(double)((2<<TimerBit)-1)*sin(PI*(double)i/(double)N);
MedSine[i]=(unsigned int)round((sine_val));
}


// Port série affichage des signaux (sPWM + Sine )
Serial.begin(9600);
}

void loop()
{
// Prévisualisation des signaux de l'onduleur + sin(t)
/*
Serial.print(MedSine[i_sin]); Serial.print(",");
Serial.print(((2<<TimerBit)-1)*sPWM_l); Serial.print(",");
Serial.println(((2<<TimerBit)-1)*sPWM_r);
*/

// Incrémentation du Timer: Compteur rapide (signal triangulaire)
TimerSPWM+=TimerStep;
TimerSPWM%=N-1;

// Incrémentation du Timer du signal: Compteur long (signal sinusoïdal)
i_sin+=1;
i_sin%=N-1;

// Changement d'état
if(!i_sin) sinePolar=!sinePolar;

// Géneration des signaux PWM
if(sinePolar)
{
sPWM_l =MedSine[i_sin] > TimerSPWM;
sPWM_r =false;
}
else
{
sPWM_l = false;
sPWM_r =MedSine[i_sin] > TimerSPWM;
}

// Affectation des sorties PWM
digitalWrite(R_PWM,sPWM_r);
digitalWrite(L_PWM,sPWM_l);

// Mise à jour signal du test
digitalWrite(TestFreq,sinePolar);

}

Tout les projets Arduino

4 réponses sur « Commande sPWM : Partie 3 »

Bonjour,
Je veux commandé un moteur pap par une télécommande rc FLYSKY qui envoie ses signaux en pwm, le problème que le driver de mon moteur est commandé en fréquence, est ce que avec l’arduino je peux convertir la valeur de l’état Haut (0..255) en signal de fréquence variable, j’ai déja essayé avec pulseIn() mais ça marche pas, Merci.

Bonjour, je viens de voir votre message! L’idée consiste à récupérer le signal PWM (0-255), ensuite générer un signal carré ayant la fréquence désirée. Tu peux utilisé la fonction DeLay ou DeLay micros pour activer (ou désactiver) un pin digital..

Laisser un commentaire