DIY 18 port Servo Controller (föråldrad) (1 / 2 steg)
Steg 1: Bakgrund/prototyp
eftersom servon fungerar (typicaly) mellan 1ms och 2ms, förstår ja jag det finns variationer till den faktiska perioden för varje servo men du får idén. det ställs in så att 3 utgång compairs finns endast på en särskild pin för 2ms innan de flyttas till nästa stift. denna cykel fortsätter tills det finns inga mer servo stift kvar och fiender till en "dummy" stat, och sedan efter 20ms har förflutit systemet startas servo kontroll. Jag under stativ jag inte kan ha sagt att helt rätt men ohwell, ill bifoga några exempelkod som visar att jag menar.
Jag har 2 mönster Inlagd, 1 på skärbräda var orriginal bevis på konceptet innan jag utformade styrelsen
den slutliga utformningen efterlyser en 5v regulator servon och en 3v regulator för pic24fj64gb004 och allt däremellan
=======================================================================================
Koden nedan
=======================================================================================
void __attribute__ ((avbrott, no_auto_psv)) _T1Interrupt(void) / / 20ms
{
aktivera de ursprungliga inställningarna för ett avbrott
clock2ms = 0;
initiera/Reset på 2ms timer
Init2msTimer();
_T2IF = 1;
_T1IF = 0; Avmarkera flaggan avbrott
}
void __attribute__ ((avbrott, no_auto_psv)) _T2Interrupt(void) / / 2 MS
{
0-5 representerar 6 servon per jämför utgångsstift
varje fall flyttar produktionen jämför till respektive stift
gör servo pin
anger jämför produktionsvärde till servo curpos
standard är att alla 6 servo set behandlas och inaktivera timern
/ * fall x:
* Aktivera output jämför för respektive stift
* slå på servo pin
* Ställ in output jämför värde
* Inaktivera utmatning jämför på tidigare stift
*
*/
Switch(clock2ms)
{
fall 0:
Konfigurera den PIN-kod
flytta OC till servopp
S1G1PP = OC1_PPS;
S2G1PP = OC2_PPS;
S3G1PP = OC3_PPS;
Konfigurera OC
OC1CON1 = 0X0002;
OC2CON1 = 0X0002;
OC3CON1 = 0X0002;
Ladda värde i OC
OC1R = OneMs;
OC2R = OneMs + OneMs/2.
OC3R = 2 * OneMs;
bryta;
fall 1:
S1G1PP = NO_OC;
S2G1PP = NO_OC;
S3G1PP = NO_OC;
Konfigurera den PIN-kod
flytta OC till servopp
S1G2PP = OC1_PPS;
S2G2PP = OC2_PPS;
S3G2PP = OC3_PPS;
Konfigurera OC
OC1CON1 = 0X0002;
OC2CON1 = 0X0002;
OC3CON1 = 0X0002;
Ladda värde i OC
OC1R = OneMs;
OC2R = OneMs + OneMs/2.
OC3R = 2 * OneMs;
bryta;
fall 2:
S1G2PP = NO_OC;
S2G2PP = NO_OC;
S3G2PP = NO_OC;
Konfigurera den PIN-kod
flytta OC till servopp
S1G3PP = OC1_PPS;
S2G3PP = OC2_PPS;
S3G3PP = OC3_PPS;
Konfigurera OC
OC1CON1 = 0X0002;
OC2CON1 = 0X0002;
OC3CON1 = 0X0002;
Ladda värde i OC
OC1R = OneMs;
OC2R = OneMs + OneMs/2.
OC3R = 2 * OneMs;
bryta;
standard:
ta bort OC från sista servo gruppen att använda den.
S1G3PP = NO_OC;
S2G3PP = NO_OC;
S3G3PP = NO_OC;
Disable2msTimer();
bryta;
}
clock2ms ++;
_T2IF = 0; Avmarkera flaggan avbrott
}