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 : Tout sélectionner
//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
Dans l'interruption :
Code : Tout sélectionner
if(PIR0bits.TMR0IF == 1) // Timer 0
{
counter = counter + 1;
if (counter == counterB)
{
TEST = 0;
}
if (counter == 100)
{
counter = 0;
TEST = 1;
}
PIR0bits.TMR0IF = 0;
}
4MHZ / 4 1µs
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 périodique.
Cela fait la même chose sur n'importe quel servo.
Auriez vous des conseils ?
Merci par avance !!
Hoffmann