// Réglage proportionnel d'un moteur à courant continu // Lecrure de la position par signaux XY: // X sur INT0 = PD2 (pin 16), Y sur INT1 = PD3 (pin 17 de l'ATmega32) // La position s'affiche sur le port C // Comande en PWM sur OC0 = PB3 (pin 4) // et direction sur PB4 (pin 5) // Si le moteur part dans le mauvais sesn, inversez X et Y ! #include #include #include #define k 10 volatile int Position; volatile char AncienX; void GereXY() { char XY=(PIND>>2)&3; // les bits X et Y remis en position 0 et 1 if ((XY>>1)==AncienX) Position++; // compare Y et ancienX else Position--; AncienX=XY&1; PORTC=Position; } ISR (INT0_vect) { GereXY(); } ISR (INT1_vect) { GereXY(); } int main () { int Consigne; DDRC=0xFF; // Port C en sortie DDRB=0xFF; // Port B en sortie PORTD=0xFF; // Port D en entrée, avec pull-up TCCR0|=(0<>2)&1; OCR0=0; while (1) { // le programme principal calcule la consigne et commande le moteur Consigne=Position * k; if (Position>0) { PORTB|=(1<255) Consigne=255; // limite à la consigne maximale OCR0=Consigne; // valeur du PWM } }