Servo Math (2 / 3 steg)
Steg 2: SetUp
90 * 8 = 720 + 450 = 1170us / 5 = 234 pulsout port, 234 är 90 grader på detta servo.
Jag hittade en fix för flytande punkt multiplikation och division i heltal math i Picaxe programmering manual under matematik. Min formel 90 * 5.556 blir 90 / 10 * 56 i heltal matte. Det fungerar men det är inte så exakt. 56 om en fix och lägga till 1 gillar 90 / 10 + 1 * 56 är lite mer exakt. Jag har inte några servon med en UPD av 5.556 eller som har ett lågt antal 1000. Ingen av min kod använder detta längre. Det var en rolig Sök och det fungerar.
90 / 10 * 56 = 504 + 450 = 954 är ca 90 på en servo
90 / 10 + 1 * 56 = 560 + 450 = 1010 är närmare. Det är därför jag inte använder det längre.
90 * 8 = 720 + 450 = 1170 är 90 på Tower Pro Micro SG90
Flytande punkt processorer som Arduino gör detta enkelt. Arduinoen har inte ett pulsout kommando, men det har delayMicroseconds(). Arduinoen har också en servo-bibliotek som kan göra ganska mycket något med ett servo.
digitalWrite (pPin, hög);
delayMicroseconds ((unsigned int) pulsAng); ' pulsAng = 1170
digitalWrite (pPin, låg)
Zip-filen innehåller program för grundläggande frimärken 1 & 2, Picaxe och Arduino. Porträtt bilder för enkel utskrift av binära siffror och detaljer.
Min Arduino Servo Math funktion
void pulsePin (int pPin, int pAng) {
om (bitRead (sFlags, svr1On) == 0) {
bitWrite (sFlags, svr1On, 1);
}
om (lastAng! = pAng) {
cntSetSrv = svrSetR;
RfhSetSrv = 1;
lastAng = pAng;
om (pAng == 0) {
pAng = svr1Lrng;
}
annat {
pAng pAng = * curUPD; //Angle * UPD (us per grad)
pAng = pAng + svr1Lrng, //Add låg utbud att göra
} //servo vinkel
pulsAng = (unsigned int) pAng;
}
digitalWrite (pPin, hög), //Set Servo vinkel
delayMicroseconds(pulsAng);
digitalWrite (pPin, låg);
hemkomst.
}
BASIC Stamp 2 Servo Math funktion
angToInt:
OM sLastAng <> sAngle sedan
"Hit paus & besöksräknare
sLastAng = sAngle
svoHitT = srvo1Hits
svoRfrsh = srvo1Hpaus
wTmp1 = sAngle
"Ändra vinkel till en PulsOut Int
OM wTmp1 = 0 då
wTmp1 = sRangeLow / srvo1Pu
ANNAT
wTmp1 = wTmp1 * curUPD
wTmp1 = wTmp1 + sRangeLow / srvo1Pu
ENDIF
ENDIF
PULSOUT srvo1, wTmp1
RETURNERA