Stap 1: Achtergrond/Prototype
omdat servo's (typicaly) tussen 1ms en 2ms werken, begrijp ja ik er zijn variaties op de werkelijke periode voor elke servo maar je krijgt het idee. het instellen is zodanig dat de uitvoer van de 3 compairs alleen op een specifieke pin voor 2ms zijn voordat ze worden verplaatst naar de volgende pin. deze cyclus gaat door tot er geen meer servo pennen links en vijanden aan een "dummy" staat, en vervolgens na de 20ms verstreken de systeem wordt opnieuw opgestart de servo-control. Ik heb onder staan die kan niet gezegd dat helemaal recht maar ohwell, slecht wat voorbeeldcode die laat zien hechten dat bedoel ik.
Ik heb 2 ontwerpen gepost, 1 op het breadboard was de orriginal bewijs van concept voordat ik ontwierp de Raad van bestuur
het uiteindelijke ontwerp vraagt om een 5v regelgever de servo's, en een 3v regelgever voor de pic24fj64gb004 en alles daartussen
=======================================================================================
Onderstaande code
=======================================================================================
VOID __attribute__ ((interrupt, no_auto_psv)) _T1Interrupt(void) / / 20ms
{
de begininstellingen voor een interrup inschakelen
clock2ms = 0;
initialiseren/Reset de 2ms timer
Init2msTimer();
_T2IF = 1;
_T1IF = 0; de interrupt-markering wissen
}
VOID __attribute__ ((interrupt, no_auto_psv)) _T2Interrupt(void) / / 2ms
{
0-5 vertegenwoordigen de 6 servo's per uitgang vergelijk pinnen
elk geval beweegt de uitvoer te vergelijken op de respectieve pinnen
Laat de servo-pin
de uitvoer vergelijk waarde ingesteld op servo curpos
standaard vertegenwoordigt dat alle 6 servo sets hebben zijn onderhouden en uitschakelen van de timer
/ * geval x:
* output vergelijken voor respectieve pin inschakelen
* inschakelen servo pin
* set output waarde vergelijken
-de uitschakelen van uitvoer vergelijken op voorgaande pin
*
*/
switch(clock2ms)
{
Case 0:
configureren van de pin
OC verplaatsen naar de servopp
S1G1PP = OC1_PPS;
S2G1PP = OC2_PPS;
S3G1PP = OC3_PPS;
Configureren van de OC
OC1CON1 = 0X0002;
OC2CON1 = 0X0002;
OC3CON1 = 0X0002;
laden van de waarde in het OC
OC1R = OneMs;
OC2R = OneMs + OneMs/2;
OC3R = 2 * OneMs;
breken;
Case 1:
S1G1PP = NO_OC;
S2G1PP = NO_OC;
S3G1PP = NO_OC;
configureren van de pin
OC verplaatsen naar de servopp
S1G2PP = OC1_PPS;
S2G2PP = OC2_PPS;
S3G2PP = OC3_PPS;
Configureren van de OC
OC1CON1 = 0X0002;
OC2CON1 = 0X0002;
OC3CON1 = 0X0002;
laden van de waarde in het OC
OC1R = OneMs;
OC2R = OneMs + OneMs/2;
OC3R = 2 * OneMs;
breken;
Case 2:
S1G2PP = NO_OC;
S2G2PP = NO_OC;
S3G2PP = NO_OC;
configureren van de pin
OC verplaatsen naar de servopp
S1G3PP = OC1_PPS;
S2G3PP = OC2_PPS;
S3G3PP = OC3_PPS;
Configureren van de OC
OC1CON1 = 0X0002;
OC2CON1 = 0X0002;
OC3CON1 = 0X0002;
laden van de waarde in het OC
OC1R = OneMs;
OC2R = OneMs + OneMs/2;
OC3R = 2 * OneMs;
breken;
standaard:
Verwijder de OC uit laatste servo-groep om het te gebruiken.
S1G3PP = NO_OC;
S2G3PP = NO_OC;
S3G3PP = NO_OC;
Disable2msTimer();
breken;
}
clock2ms ++;
_T2IF = 0; de interrupt-markering wissen
}