Start Elkretssimulator


Driva stegmotor med h-brygga



H-brygga för att driva stegmotor

Jag kommer här nedan visa hur man kan driva en stegmotor med en populär h-brygga runt L298.

Unipolär eller Bipolär ?

Om du har bipolär stegmotor med 4 sladdar eller en unipolär med 5 sladdar spelar inte så stor roll för nedanstående beskrivning hur du får igång den. Dock måste du veta vilka sladdar som är vilka och när det gäller en stegmotor med 5 sladdar måste du veta vilken av dem som är mittpunkt (GND), den sladden ska du isåfall strunta i.

"Fel" men fungerar ändå

Observera att om du har en bipolär med 4 trådar så kan man byta plats på trådarna till A och B-lindningen och det kommer fungera ändå. Detsamma om man byter plats på +/- förutsatt att man byter på både A och B. En av flera konsekvenser här, det är att du kan chansa på att koppla in stegmotorn om du inte vet hur man gör. Inte att rekommendera, men kan funka.

Den stegmotor jag har, har följande färger på sladdar. Om du har andra färger, försök hitta nedanstående bild i databladet för din stegmotor och översätt sedan dina färger till nedanstående koppling.



Några exempel på stegmotorer och exempel på fungerande sladdbyten.

Typ Exempel A+ Acom A- B+ Bcom B-
Uni 5 BYJ48 Rosa Röd Orange Gul Röd Blå
Uni 6 Nema 23 Svart Gul Grön Röd Vit Blå
Bi 4 Nema 16 Svart Grön Röd Blå
Bi 4 Orange Blå Röd Gul
Bi 4 Röd Gul Grå Grön
Bi 4 Blå Gul Röd Grön
Byter A & B Röd Grön Blå Gul
Byter A & B Green Grå Gul Röd
Byter + / - Grå Grön Röd Gul


H-brygga L298

Förutsatt ovan färger, så blir uppkopplingen med h-bryggan som nedan. Observera att h-bryggan måste matas med en separat spänning som driver den anslutna motorn, i detta fall en stegmotor.

En testuppkoppling




Kod med Stepper.h

Det finns ett färdigt bilbliotek att leka med i arduino -miljön. Det är bara att inkludera Stepper.h överst i filen och man får då tillgång till några enkla funktioner. Nedan kod får stegmotorn att snurra. Nu tycker jag inte det är så intressant inkludera ett bibliotek för en såhär enkel grej eftersom man snarast tappar kontroll än skapar kontroll. Men det är en bra start för att testa.

#include <Stepper.h>

#define HB1 8
#define HB2 9
#define HB3 10
#define HB4 11

#define stepsPerRev 200

Stepper stepper(stepsPerRev, HB1, HB2, HB3, HB4);

void setup()
{
	stepper.setSpeed(60);
}

void loop() 
{
	stepper.step(200);
	delay(500);
}

Styra varvtal med riktningar

Jag blev inte alls kompis med ovanstående bibliotek, även om det fungerade, så jag skrev lite egen kod som jag tror är bättre bygga vidare på. Jag kopplade sedan in en joystick som låg och skräpade. Observera att anslutningarna verkar skilja sig lite. Min joystick har följande anslutningar.


Eftersom en joystick är 2 stycken potentiometrar kan du göra samma uppkoppling med en potentiometer, som t.ex. nedan.


Kod


class ElstStepper
{
  public:
  ElstStepper(int p1, int p2, int p3, int p4)
  {
    pinMode(pin1 = p1, OUTPUT);
    pinMode(pin2 = p2, OUTPUT);
    pinMode(pin3 = p3, OUTPUT);
    pinMode(pin4 = p4, OUTPUT);
    lastStep = 0;
  }
  
  void StepMotor(int dir)
  {
    digitalWrite(pin1,pin1_phase[lastStep]);
    digitalWrite(pin2,pin2_phase[lastStep]);
    digitalWrite(pin3,pin3_phase[lastStep]);
    digitalWrite(pin4,pin4_phase[lastStep]);    
    lastStep+=dir;
    if(lastStep<0)
      lastStep =3;    
    lastStep%=4;
  }

  private:

  int lastStep;
 
  int pin1;
  int pin2;
  int pin3;
  int pin4;

  int pin1_phase[4]={HIGH,LOW,LOW,HIGH};
  int pin2_phase[4]={LOW,HIGH,HIGH,LOW};
  int pin3_phase[4]={HIGH,HIGH,LOW,LOW};
  int pin4_phase[4]={LOW,LOW,HIGH,HIGH};  
};

long val;
int stepSpeed = 1;
int stepDir = 1;
ElstStepper stepmotor( 8,9,10,11);

void setup()
{
  //Serial.begin(9600);
  // initialize timer1 
  noInterrupts(); 
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = stepSpeed;
  TCCR1B |= (1 << CS11); // prescaler = 8
  TIMSK1 |= (1 << TOIE1);
  interrupts(); 
}

ISR(TIMER1_OVF_vect)
{
  TCNT1 = stepSpeed;
  stepmotor.StepMotor(stepDir);
}

void loop() 
{
  val=analogRead(0) -520;
  if(val>510)
    val = 510;
  if(val<-510)
    val=-510;

  stepSpeed = abs(val) * 75;
  if(val>0)
    stepDir=1;
  else
    stepDir=-1;  

  
  //delay(100);
  //Serial.println(val);
  
}

Det som händer här ovan är alltså att jag läser spänningen från en potentiometer, kopplad som en spänningsdelare så att värdet 0-5 volt blir ett värde 0-1023 på en analog ingång. När potentiometern står i mitten så står stegmotorn stilla, är tanken. När jag vrider åt ena eller andra hållet så skall stegmotorn snurra åt detta hål med stigande hastighet ju mer jag vrider. Jag sätter alltså stepSpeed till ett värde mellan 0 och max cirka 38000 (dvs 510 x 75 = 38250). Detta blir räknaren i interrupt-rutinen som räknas ner med en hastighet som är ungefär klockfrekvensen dividerat med prescalern.

Nu går det att rotera stegmotorn åt båda håll och dessutom reglera farten. Koden skapar alltså ett interrupt och frekvensen (antal anrop per sekund) beror på vad potentiometern står någonstans. Varje anrop av interrupt -funktionen stegar stegmotorn i den riktning vi önskar.



Framöver får vi hitta på något mer avancerat här.

Lycka till!