====== Introduction ====== Le timer 0 est un compteur 8 bits qui permet de générer un signal PWM. Nous allons utiliser la carte Arduino Duemilanove. ===== Mode « Fast PWM » et « Phase correct PWM » ===== En mode « Fast PWM », le compteur compte de BOTTOM à TOP puis recommence à compter de BOTTOM. Les bits WGM2:0 des registres TCCR0x permettent de définir la valeur de TOP (0xFF ou OCR0x) : WGM2:0 = 3 pour TOP = 0xFF et WGM2:0 = 7 pour TOP = OCR0A. En mode « Phase correct PWM », le compteur compte de BOTTOM à TOP puis décompte de TOP à BOTTOM. Les bits WGM2:0 des registres TCCR0x permettent de définir la valeur de TOP (0xFF ou OCR0x) : WGM2:0 = 1 pour TOP = 0xFF et WGM2:0 = 5 pour TOP = OCR0A. ===== Mode direct et inverse ===== Il existe 2 mode possibles pour les sorties OC0x. Les bits COM0x1:0 du registre TCCR0A permettent de configurer ces modes : COM0x1:0 = 2 pour le mode direct et COM0x1:0 = 3 pour le mode inverse. La figure suivante montre les chronogrammes des signaux TCNT0, OC0A en mode direct et OC0A en mode inverse. TCNT0 est comparé à chaque instant à OCR0x. En mode direct, la sortie OC0x passe à « 1 » quand TCNT0 < OCR0x et passe à « 0 » quand TCNT0 > OCR0x. En mode inverse, la sortie OC0x passe à « 1 » quand TCNT0 > OCR0x et passe à « 0 » quand TCNT0 < OCR0x. {{:robotics:computing:schema_phase_correct_pwm.jpg?500|}} ===== Fréquence ===== Il est possible de configurer la fréquence du signal PWM : En mode « Fast PWM », la fréquence est FPWM = FCLK/(N.256) En mode « Phase correct PWM », la fréquence est FPWM = FCLK/(N.510) N = 1, 8, 64, 256 ou 1024. Les bits CS02:0 du registre TCCR0B permettent de configurer N. ====== Implémentation ====== ===== Registres ===== TCCR0A et TCCR0B : registres qui configure le timer 0 en mode PWM. TCNT0 : registre qui contient la valeur du compteur. OCR0A : registre qui contient la valeur référence pour la comparaison avec TCNT0. ===== Exemple ===== L'exemple suivant permet la génération de 2 signaux PWM sur OC0A et OC0B en mode « Phase correct PWM » direct à une fréquence de 31.4 KHz (N=1). TCNT0 compte de 0 à 255. Le seuil sur OCR0A est 127 (PWM de 50% sur OC0A et le seuil sur OCR0B est 64 (PWM de 25% sur OC0B). /* * pwm.c * * Created on: Mar 7, 2012 * Author: ldo * * arduino duemilanove ATMEGA328P * crystal 16MHz */ #include /* TIMER0 */ #define DDR_TIM0 DDRD /* TIMER0 : PORTD */ #define DD_OC0A 6 /* OC0A : PD6 */ #define DD_OC0B 5 /* OC0B : PD5 */ void initTimer0(void) { DDR_TIM0 = (1<