Varvtalsreglera motor
Koncept
Konceptet här är att använda
pulsbreddsmodulerad signal för att reglera hastigheten på motorn och verktyget för att göra detta och samtidigt styra i vilken riktning motorn roterar, det är att använda en
H-brygga. Nedan är sedan 2 olika kodexempel, dels med analogWrite's pulsbreddsmodulerade signal och dels med mjukvarugenererad puls.
Uppkoppling
På det röda L298 -kretskortet är
enA samt
enB byglade, så de är alltid aktiverade.
analogWrite
Koden nedan sätter upp 2 pinnar som utsignaler. Jag väljer 5 och 6 eftersom jag där kan skriva analoga utsignaler, vilket i detta fall blir en pulsbreddsmodulerad utsignal. Vi läser av potentiometern, som är kopplad som en spänningsdelare som ger spänning 0-5V på pinne A0, vilket vi sedan kan läsa av i mjukvaran som ett värde 0-1023. Vi vill att mittenläget på potentiometern skall innebär att motorn står still. Vrider man åt vänster eller höger skall man få en rotiation medurs eller moturs med ökande hastighet.
#define in3 5
#define in4 6
int pot;
int motorSpeed;
void setup()
{
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
}
void loop()
{
pot = analogRead(0); // 0-1023
pot -=512; // -512 till 511
motorSpeed = abs(pot/2)-1; // -1-254
if(motorSpeed<0)
motorSpeed=0; // 0-254
if(pot>=0)
{
analogWrite(in4,motorSpeed);
analogWrite(in3,0);
}
else
{
analogWrite(in4,0);
analogWrite(in3,motorSpeed);
}
}
Exprimentresultat
Jag kopplar in logikanalysatorn på
enA samt
enB. Om potentiometern vrids mycket åt höger snurrar motorn fort medurs och det ser ut såhär på logikanalysatorn.

Om potentiometern vrids lite åt vänster snurrar motorn långsamt moturs och det ser ut såhär på logikanalysatorn.
Skapa pulsbredd i mjukvara
Det går att ändra den frekvens som analogWrite använder men om man ändå är inne och kodar om kan man lika gärna skapa hela vågformen själv. Nedan exempel ger lite större möjligheter att exprimentera med olika frekvenser på pulsbredden genom att ändra FREQ. Speciellt lägre frekvenser kan vara intressant exprimentera med. En lägre frekvens, t.ex. 50 Hz, är i princip en förutsättning för att få väldigt långsamma varvtal. Samtidigt blir motorn väldigt "ryckig" eller "skakig" vid dessa lägre frekvenser. Observera att p.g.a. hur timern räknar ut interruptet så kommer högre värden på FREQ inte skapa en pulsbredd på den frekvensen utan mycket högre, så det skall inte betraktas som exakt frekvens. Vid låga frekvenser stämmer det någorlunda, vid högre stämmer det dåligt.
Hursom helst. Nedan är ett exempel där vi skapar ett interrupt och sedan bygger vi ihop pulsen. Metoden jag snickrat ihop här (det finns många sätt) är att tänka mig en högre frekvens med vilken interrupt genereras. Jag bygger sedan ihop pulsen genom att vid varje interrupt studera om jag skall skicka ut en hög eller låg signal. Jag avgör detta genom att räkna upp ett värde vid varje interrupt, en förkalkylerad pulsbredd beroende på potentiometern, och se om detta värde är högre eller lägre än en hel pulsbredd (100% duty). Pulsen som skapas blir en bråkdel av interruptfrekvensen.
#define in3 5
#define in4 6
#define DUTYCYCLESLOTS 10
#define FREQ 50
int pot;
int motorSpeed;
byte dutyCWC=0;
byte thiscycle=0;
void setISRFreq(int freq)
{
cli();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = int(15625/freq)-1;
TCCR1B |= (1 << WGM12); // CTC mode
TCCR1B |= (1 << CS12) | (1 << CS10); // 1024
TIMSK1 |= (1 << OCIE1A); // timer comp inter.
sei();
}
ISR(TIMER1_COMPA_vect)
{
dutyCWC++;
dutyCWC%=DUTYCYCLESLOTS;
if(pot>=0)
{
digitalWrite(in3,0);
digitalWrite(in4,(thiscycle<=dutyCWC)?HIGH:LOW);
}
else
{
digitalWrite(in3,(thiscycle<=dutyCWC)?HIGH:LOW);
digitalWrite(in4,0);
}
}
void setup()
{
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
setISRFreq(DUTYCYCLESLOTS*FREQ);
Serial.begin(9600);
}
void loop()
{
noInterrupts();
pot = analogRead(0); // 0 till 1024
pot -=512; // -512 till 512
motorSpeed = abs(pot)-1; // -1-254
thiscycle=DUTYCYCLESLOTS-
byte(motorSpeed/5/(100/DUTYCYCLESLOTS));
interrupts();
delay(100);
}
Exprimentresultat
Jag kopplar in logikanalysatorn på
enA samt
enB. Om potentiometern vrids mycket åt höger snurrar motorn fort medurs och det ser ut såhär på logikanalysatorn.

Om potentiometern vrids lite åt vänster snurrar motorn långsamt moturs och det ser ut såhär på logikanalysatorn.
Varvtalsreglera en eller flera dcmotorer med en motorshield.
Annons
Egen domän, epost & webbsida
Från 120 + 140 = 260 kr per år + moms för Brons -konto med .com -domän.
Bästa sättet att lära sig något, är att 1) ha något att Meka med 2) Meka.
Detsamma gäller förstås internet och webbsidor.
Vill du lära dig göra roliga saker, t.ex. en fixa en egen hemsida på en egen domän eller installera en hemma-server på egen domän? Skaffa ett konto på ett billigt hjälpsamt webbhotell, där du kan ställa många dumma frågor till supporten. Välkommen!
Kontrollpanel (Direct Admin), där du kan lägga till epostadresser, installera wordpress för en företagssida eller privat blogg, lägga till subdomäner, tanka upp filer, ändra DNS -pekare och massor med annat. Behöver du hjälp fixa webbsida? Vi hjälper dig. Börjar ditt nuvarande webbhotell bli störande dyrt? Hör av dig, vi kan troligtvis hjälpa dig med flytten.
Karla Hosting AB • https://karlahosting.se