Étape 13 : Arduino démo : sortie PWM
La fonctionnalité de sortie de comparer minuterie du minuteur est utilisée pour générer des signaux PWM. Lorsque la minuterie atteint 0, il tourne sur un axe, lorsqu’il atteint un certain nombre (que nous indiquions), il s’éteint le code pin. Cela génère une onde carrée avec un rapport cyclique variable.
Bien que les signaux de servo normal ont habituellement une période d’environ 20 ms (ce qui signifie une fréquence de 50 Hz environ), la sortie de notre microcontrôleur disposent d’un délai plus court (donc une fréquence plus élevée, environ 250 à 300 Hz). Les Turnigy Plush ces (et le HobbyKing marque clones) ont été signalés à être capable de gérer la fréquence plus élevée et donc plus réglages de vitesse du moteur peuvent être effectués par seconde, à cet effet la quadrocopter deviendra plus stable.
J’ai également joint des captures d’écran de mon analyseur logique pour vous montrer à quoi ressemblent les 4 signaux.
Voici le code :
#define PWM_FREQUENCY 300 / / en Hz#define PWM_PRESCALER 8
#define PWM_COUNTER_PERIOD (F_CPU/PWM_PRESCALER/PWM_FREQUENCY)
void setup()
{
broches en sortie
DDDR | = (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7) ;
par défaut de largeur d’impulsion de 1000 microsecondes
OCR1A = 1000 * 2 ;
OCR1B = 1000 * 2 ;
OCR2A = 1000 / 16 ;
OCR2B = 1000 / 16 ;
le programme d’installation est :
Claire OCnA/OCnB sur comparer match, fixé OCnA/OCnB à fond (mode non inversé)
minuterie d’installation 1
TCCR1A = (1 << WGM11) | (1 << COM1A1) | (1 << COM1B1) ;
TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11) ;
ICR1 = PWM_COUNTER_PERIOD ;
minuterie d’installation 2
TCCR2A = (1 << WGM20) | (1 << WGM21) | (1 << COM2A1) | (1 << COM2B1) ;
TCCR2B = (1 << CS22) | (1 << CS21) ;
le délai est fixé pour minuterie 2, c’est environ 244 Hz
Notez que timer1 est un temporisateur de 16 bits et timer2 est une minuterie de 8 bits
}
void loop()
{
int pw ;
pour (pw = 1000 ; pw < = 2000 ; pw += 20)
{
OCR1A = pw * 2 ;
OCR1B = pw * 2 ;
OCR2A = pw / 16 ;
OCR2B = pw / 16 ;
Delay(10) ;
}
pour (pw = 2000 ; pw > = 1000 ; pw-= 20)
{
OCR1A = pw * 2 ;
OCR1B = pw * 2 ;
OCR2A = pw / 16 ;
OCR2B = pw / 16 ;
Delay(10) ;
}
}
Autres belles pages à lire :