Upcycle borstlösa DC-motorer från skrivare (3 / 4 steg)
Steg 3: Speed Control kod
I föregående steg fastställt vi som var följande input stiften på motorn
- / DEC (inte avta, så drar det höga orsakar motorn köra)
- / ACC (inte accelerera, så 100% arbetscykel är 0 hastighet)
- REV styr riktningen (hög är ett sätt, låg är den andra)
- + 24VDC
- GND
Jag har använt MediaTek LinkIt en eller Arduino styrelserna för detta steg, eftersom alla tillgängliga bibliotek gör det snabbt och enkelt. Eftersom detta är inte precis en nybörjares ska jag anta att du vet hur att ladda upp koden till dem (om inte, kolla den komma igång-guide).
Denna kod använder funktionen för att arbeta med högfrekventa PWM, som ville att min motor.
Jag har använt TimerOne biblioteket göra inställningen för PWM lätt på Arduino styrelser tidigare.
Denna enkla kod tillhandahåller ett gränssnitt för testning, ansluta till styrelsen via en seriell anslutning och du kommer att kunna styra motorn genom att skicka följande tecken
- "w" att öka hastigheten
- 's "att minska hastigheten
- hade "att växla bromsen på eller av
- "r" för att växla riktning
definiera pin-koder
int accPin = 9;
int decPin = 13.
int revPin = 10;
int fgPin = 12;
här sparar vi de nuvarande pin staterna
int accLevel = 0;
booleska decState = låg;
booleska revState = låg;
vissa PWM variabler att öka frekvensen
Du kan behöva röra runt för att hitta en freq som tycker om din motor
int cykel = 1600; Dela upp produktionen i 9 + 1 = 10 portioner
int sourceClock = PWM_SOURCE_CLOCK_13MHZ;
int divider = PWM_CLOCK_DIV8; PWM frekvensen blir 13MHz / 8 / 10 = 162,5 KHz
void setup() {
starta en seriell port
Serial.BEGIN(9600);
setup stiften
pinMode (accPin, produktionen);
pinMode (decPin, produktionen);
pinMode (revPin, produktionen);
pinMode (fgPin, ingång);
se till att motorn inte startar upp direkt
digitalWrite (decPin, låg);
}
tull: 0-100
void setPwm (unsigned char duty)
{
int __duty = karta (tull, 0, 100, 0, 1600);
analogWriteAdvance (accPin, sourceClock, avdelare, cykel, __duty);
}
void loop()
{
om (Serial.available() > 0) {
char inByte = Serial.read(); inkommande seriell byte
om (inByte == "w") {
accLevel = låg;
accLevel = min (accLevel + 10, 100); 100% PWM är noll hastighet
}
annars om (inByte == 's ") {
accLevel = hög;
accLevel = max (accLevel - 10, 0); 0% PWM är full fart
}
annars om (inByte == "r") {
omvänd riktning
revState =! revState;
}
annars om (inByte == hade ") {
broms
decState =! decState;
}
Serial.Print ("revState:");
Serial.println(revState);
digitalWrite(revPin,revState);
Serial.Print ("decState:");
Serial.println(decState);
digitalWrite(decPin,decState);
Serial.Print ("accLevel:");
Serial.println(accLevel);
setPwm(accLevel);
digitalWrite(accPin,accLevel);
}
}