Hallo,

Ik ben bezig met servo motoren, ik wil deze aansturen met een PIC16F877A met de 2 PWM kanalen de uC draait op een 20Mhz kristal.

PWR period = [(PR2)+1].4Tosc.(TMR2 prescale value)
PR2 = (Period/(4 * Tosc * TMR2 Prescale)) - 1

Als ik dat invul komt er een te groot getal uit voor het PR2 register

PR2=(0.02/(4x5x10^-8x16))-1=6249

Wie kan mij hier bij helpen ?

volgens mij kan je niet met een HW pwm uitgang een servo aansturen omdat deze niet 50Hz kunnen draaien.
je zou dit gewoon met een timertje kunnen doen.

Op 9 april 2006 19:51:54 schreef ymoona:
volgens mij kan je niet met een HW pwm uitgang een servo aansturen omdat deze niet 50Hz kunnen draaien.
je zou dit gewoon met een timertje kunnen doen.

Dus ik kan die PWM niet gebruiken voor dat, en hoe moet ik dat dan met timer doen

Dan kan je het handigst een functie maken:


void timertje(int duration)
{
 int counter;

 for (counter=0; counter<duration; counter++)
 {
  // een 1msec tijdsduur maken hier
 }
}

En dan roep je die bijv zo aan:
void main()
{
 int tijd;
 tijd=10;

 timertje(tijd); //nu gaat je functie dmv die for loop 10x die 1msec tijdsduur aanroepen
}

Meer info: http://www.seattlerobotics.org/guide/servos.html

/edit
Voor die servo kun je beter een kleinere delay dan 1msec maken dus. Kijk maar wat mooi uitkomt.

[Bericht gewijzigd door JuuL op ]

ik he nu een frequentie van 1.22khz met PR2=255 en voor CCPR1L 82 en 52 en soms draait de servo dan. kan dit mss werken of gaat dat nooit lukken

Op 9 april 2006 19:51:54 schreef ymoona:
volgens mij kan je niet met een HW pwm uitgang een servo aansturen omdat deze niet 50Hz kunnen draaien.
je zou dit gewoon met een timertje kunnen doen.

Maar als ik dan een timer interupt gebruik Timer0 of Timer1
en die om de 20ms een interupt maar waarin die een pin voor 1ms tot 2ms (afhankelijk van de richting en snelheid) d.m.v een variable hoog maak en dan laag.

of gaat dat zo niet werken ?