Bonjour à tous,
Je suis sur un PIC 18F et je rencontre un problème avec l'utilisation d'un servo moteur....
Quartz = 4MHz
J'utilise le Timer 0 et cherche donc à générer des impulsions de 1 à 2ms avec une période de 20ms.
Je l'ai configuré comme suis :
Code:****//TIMER*0 T0CON1bits.T0CS*=*0b010;*******//FOSC/4 T0CON1bits.T0ASYNC*=*0;*********//The*input*to*the*TMR0*counter*is*synchronized*to*FOSC/4 T0CON1bits.T0CKPS*=*0b0000;****//Préscaler*1:1 TMR0H*=*200*;*******************//TIMER0*COUNT*REGISTER T0CON0bits.T0EN*=*1;***********//*The*module*is*enabled*and*operating T0CON0bits.T016BIT*=*0;*********//TMR0*is*an*8-bit*timer T0CON0bits.T0OUTPS*=*0b0000;****//1:1*Postscaler PIE0bits.TMR0IE=1;***************//Timer*0*interrupt*enable /*INTERRUPTIONS*/ INTCONbits.GIEH=1;*****//Global*Interrupt*Enable*bit INTCONbits.PEIE=1;*****//Peripheral*Interrupt*Enable*bit INTCONbits.IPEN=0;*****//Interrupt*Priority*Enable*bit counterB*=*10;*//*2ms counterB=5 pour du 1ms *
Dans l'interruption :
4MHZ / 4 ==> 1µsCode:if(PIR0bits.TMR0IF == 1) // Timer 0 { counter = counter + 1; if (counter == counterB) { TEST = 0; // Sortie PWM } if (counter == 100) { counter = 0; TEST = 1; // Sortie PWM } PIR0bits.TMR0IF = 0; }
Pas de préscaler/post scaler
J'attends 200 cycles => 200µs puis encore 100 cycles ==> 20ms.
En cours de route, counterB permet de monter ou baisser la pwm.
PS : si en parallèle je fais un bête DELAY de 2 secondes... mon délais réel fait presque 4 secondes... et cela m'étonne d'une si grande différence...
Résultat :
A l'oscilloscope, j'obtiens exactement ce que je souhaite en terme de forme de courbe.
Le servo se rends bien à la bonne position, MAIS il a ensuite la tremblote.
(dur a expliquer)
Une fois a la bonne position, le servo va faire trois petites secousses, une pause, puis recommencer. C'est quelque chose de très périodique.
Cela fait la même chose sur n'importe quel servo.
Auriez vous des conseils ?
Merci par avance !!
Hoffmann
-----