Hur styra en stegmotor med en uC

Planering och tankar kring eventuella framtida projekt.
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 9112
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Re: Hur styra en stegmotor med en uC

Inlägg av AndersG »

Att läsa en 4x4 är inte så himla svårt. Jag har exempel i assembler om du vill ha :)

Att styra stegmotorn är inte heller svårt. Du måste veta pulser/mm bara. Anta sedan att du är i 0.0.0 och skall till 100.0.0 och att du har 200 pulser/mm, då skall du bara sätta DIR hög (eller låg) och sedan mata ut 100*200 pulser på step.

Problemet är ju bara att du kanske har 200,25 pulser per mm så du måste kunna räkna med decimaltal. Hellre fasta decimaler än flyttal som ofta blir ganska hårigt på en 8-bitars MCU.

Jag fattar nog hur du menar med knapparna, men jag skulle definitivt välja en knappsats före. Det blir mera lättanvänt.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hur styra en stegmotor med en uC

Inlägg av sodjan »

> I princip är det bara Step och Dir behöver kopplas.

Helt rätt. Men sen så måste det ju finnas en viss logik bakom också.
Alltså hur/när "step" och "dir" ska sättas hit eller dit eller pulsas o.s.v.

> Problemet är ju bara att du kanske har 200,25 pulser per mm så du måste kunna räkna med decimaltal.

Nja, du kan ju aldrig mata ut en fjärdedels puls hur du en räknar. Det spelar ingen
som helst roll att du räknar med decimaltal, hur ska du få ut en kvarts puls ?
(eller en halv eller trekvarts puls ?)

Enklare är att helt enkelt bortse med det lilla felet och lägga till en extra puls för
var fjärde mm. Felet under de tre millimetrarna blir ganska litet och sedan kommer
du i fatt efter 4 mm. Så för t.ex 100 mm så blir det alltså först 200*100 pulser sedan
plus 25*1 pulser för att kompensera för felet. Lätt att räkna ut med vanlig heltals matte.

Hade det varit 199,75 pulser per mm så hade du istället fått räkna bort 1 puls per 4 mm.
Eller byta växellåda så att du får ett *helt* antal pulser per mm.

Men detta blir ju väldigt mycket spekulation och hypotetiska funderingar, det är bättre
att lösa det med de faktiska förutsättningarna.

EDIT: Såg nu att det ju var AndersG som talade som 200.25 pulser per mm... :-)
Senast redigerad av sodjan 3 april 2010, 23:48:19, redigerad totalt 1 gång.
Användarvisningsbild
jojje
Gått bort
Inlägg: 6380
Blev medlem: 20 januari 2006, 01:53:33
Ort: Stockholms utkant
Kontakt:

Re: Hur styra en stegmotor med en uC

Inlägg av jojje »

Jag har exempel i assembler om du vill ha
Nope, jag fattar ännu mindre än i Basic. :wink:

Jag tror och vet att man kan gott å väl använda heltal. Allt blir bättre än det dom använder idag. :D

Föresten det om Basic. Jag har inte helt kommit överens med PBP. Jag tycker den har för mycket olika sätt för att göra samma sak. Tex High PORTC.0 och Low PORT.0 för att sätta en utgång till hög eller låg. Det finns väl en standard att gå efter som kan se ut som PORTC.0 = 1 eller PORTC.0 = 0.

Jag för min del gillar nog MicroBASIC Pro bättre. Den verkar iaf vara lite mer lik Assembler i strukturen. Vad tycker ni som har erfarenhet?
Hade jag vart lite yngre (59 år nu) å mer tålmodig hade jag nog hoppat på ASM på en gång, men jag vill komma fort igång och ska bara göra helt enkla saker. "Normal" Basic-programering har jag hållt på med sen mitten på 70-talet, och nu senast skrivit mycket i Access.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hur styra en stegmotor med en uC

Inlägg av sodjan »

> Tex High PORTC.0 [...] PORTC.0 = 1...

Skillnaden i syntax är ju liten, kommandona gör ju samma sak.
Jag tror att det får vara större/viktigare skillnader för att välja produkt.

Jag har ingen som helst synpunkt på olika BASIC produkter, jag har inte
heller något som helst emot dom i princip. Så länge som det fungerar
att bygga det man vill så. Det är lite som om man föredrar att köra SAAB
eller Volvo, båda tar dig hur som helst till målet för resan.

Helt oavsett vad man använder för verktyg så får man antingen ha en bra
bild av vad man vill åstakomma i förväg och förshoppningsvis börja skriva
på "rätt" applikation på en gång, eller sätta igång och koda och prova sig fram
men då vara beredd på att kanske börja om på nytt ett par gånger under resan.
Vilken metod som är bäst hör till den mer religösa sidan av programmeringen och
jag låter det vara osagt vilket jag föredrar...
Användarvisningsbild
jojje
Gått bort
Inlägg: 6380
Blev medlem: 20 januari 2006, 01:53:33
Ort: Stockholms utkant
Kontakt:

Re: Hur styra en stegmotor med en uC

Inlägg av jojje »

OK, jag håller på att titta i bådas hjälpfiler, och det verkar iaf som MicroBASIC Pro kan få igång gammelgubben lättare. :badgrin:

Mera, bättre och mer utförligare hjälp, och det är det jag behöver i uppstartfasen, sen glider väl på av sig själv (förhoppningsvis).
Användarvisningsbild
LaRdA
EF Sponsor
Inlägg: 3766
Blev medlem: 9 september 2003, 14:10:46
Ort: Jämtland

Re: Hur styra en stegmotor med en uC

Inlägg av LaRdA »

På tal om enkla sätt att läsa av en keypad så provade jag just en keypad med i2c interface, riktigt smidigt faktiskt.
Ett snabbt exempel till arduino som läser av den över i2c och sedan skickar ut knapptryckningen på serieporten, kanske inte snyggaste koden men kanske hjälpa någon. :humm:
Provade också 7-segment displayerna med i2c interface, smidigt att sköta både keypad och 8 siffror med 7-segment display med bara två pinnar. :tumupp:
http://www.byvac.co.uk/downloads/datash ... aSheet.pdf

Kod: Markera allt

#include <Wire.h> // i2c

void setup()
{
  int key;
  
  Wire.begin();   // start Wire library as I2C-Bus Master
  Serial.begin(9600);
}
void loop()
{
 
{ 
  int key = 0;                    //Nollställer key
  Wire.beginTransmission(0x31);    //7-bitarsa adress till keypad, adress i 8-bitar är 0x62
  Wire.send(4);                    //Getkey-funktionen i keypaden
  Wire.endTransmission();          
  delayMicroseconds(45);           //Vänta 45us
  Wire.beginTransmission(0x31);    //Förbered hämtning från keypad
  Wire.requestFrom(int(0x31), 1);  //hämta från keypad (adress), register 1)
}

  if (Wire.available()) {          //Finns värde tillgängligt?
    key = Wire.receive();         //För över värde till till Key
  }
 
  Wire.endTransmission();

if (key < 255)                    // Om Key inte är lika med 255, dvs ingen knapptryckning registrerad
{ 
  Serial.print(key);              // Skriv innehållet i Key seriellt
}

delay (50) ; //vänta 50ms

}
Användarvisningsbild
jojje
Gått bort
Inlägg: 6380
Blev medlem: 20 januari 2006, 01:53:33
Ort: Stockholms utkant
Kontakt:

Re: Hur styra en stegmotor med en uC

Inlägg av jojje »

Just det finns bra beskrivet i MicroBasic Pro också. En annan sak som jag gillar med MBP är HW Connection längst ner i nästan varje hjälpavsnitt, som visar exempel på hur man gör hårdvarumässigt också.

Koden nedanför:
This is a simple example of using the Keypad Library. It supports keypads with 1..4 rows and 1..4 columns. The code being returned by Keypad_Key_Click() function is in range from 1..16. In this example, the code returned is transformed into ASCII codes [0..9,A..F] and displayed on Lcd. In addition, a small single-byte counter displays in the second Lcd row number of key presses.

Kod: Markera allt

program Keypad_Test
dim kp, cnt, oldstate as byte
    txt as byte[7]

' Keypad module connections
dim keypadPort as byte at PORTC
' End Keypad module connections

' Lcd module connections
dim LCD_RS as sbit at RB4_bit
    LCD_EN as sbit at RB5_bit
    LCD_D4 as sbit at RB0_bit
    LCD_D5 as sbit at RB1_bit
    LCD_D6 as sbit at RB2_bit
    LCD_D7 as sbit at RB3_bit

    LCD_RS_Direction as sbit at TRISB4_bit
    LCD_EN_Direction as sbit at TRISB5_bit
    LCD_D4_Direction as sbit at TRISB0_bit
    LCD_D5_Direction as sbit at TRISB1_bit
    LCD_D6_Direction as sbit at TRISB2_bit
    LCD_D7_Direction as sbit at TRISB3_bit
' End Lcd module connections

main:
  oldstate = 0
  cnt = 0                             ' Reset counter
  Keypad_Init()                       ' Initialize Keypad
  ANSEL  = 0                          ' Configure AN pins as digital I/O
  ANSELH = 0
  Lcd_Init()                          ' Initialize Lcd
  Lcd_Cmd(_LCD_CLEAR)                 ' Clear display
  Lcd_Cmd(_LCD_CURSOR_OFF)            ' Cursor off
  Lcd_Out(1, 1, "Key  :")             ' Write message text on Lcd
  Lcd_Out(2, 1, "Times:")

  while TRUE
    
    kp = 0                            ' Reset key code variable

    ' Wait for key to be pressed and released
    while ( kp = 0 )
      kp = Keypad_Key_Click()         ' Store key code in kp variable
    wend
    ' Prepare value for output, transform key to it"s ASCII value
    select case kp
      'case 10: kp = 42   ' "*"       ' Uncomment this block for keypad4x3
      'case 11: kp = 48   ' "0"
      'case 12: kp = 35   ' "#"
      'default: kp += 48
      
    case 1
      kp = 49  ' 1                    ' Uncomment this block for keypad4x4
    case 2
      kp = 50  ' 2
    case 3
      kp = 51  ' 3
    case 4
      kp = 65  ' A
    case 5
      kp = 52  ' 4
    case 6
      kp = 53  ' 5
    case 7
      kp = 54  ' 6
    case 8
      kp = 66  ' B
    case 9
      kp = 55  ' 7
    case 10
      kp = 56  ' 8
    case 11
      kp = 57  ' 9
    case 12
      kp = 67  ' C
    case 13
      kp = 42  ' *
    case 14
      kp = 48  ' 0
    case 15
      kp = 35  ' #
    case 16
      kp = 68  ' D
       
    end select

    if (kp <> oldstate) then        ' Pressed key differs from previous
      cnt = 1
      oldstate = kp
    else                            ' Pressed key is same as previous
      Inc(cnt)
    end if
    Lcd_Chr(1, 10, kp)              ' Print key ASCII value on Lcd

    if (cnt = 255) then             ' If counter varialble overflow
      cnt = 0
      Lcd_Out(2, 10, "     ")
    end if

    WordToStr(cnt, txt)             ' Transform counter value to string
    Lcd_Out(2, 10, txt)             ' Display counter value on Lcd
  wend
end.
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 9112
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Re: Hur styra en stegmotor med en uC

Inlägg av AndersG »

Nja, du kan ju aldrig mata ut en fjärdedels puls hur du en räknar. Det spelar ingen
som helst roll att du räknar med decimaltal, hur ska du få ut en kvarts puls ?
(eller en halv eller trekvarts puls ?)
Sorry, vad jag menade var naturligtvis inte att man skall mata ut en kvarts puls. Stegmotorn kan tex ha 200/varv, men sedan har man kulskruvarnas stigning etc. Så när man kalibrerar så kör man tex en känd sträcka (passbit) och räknar pulser och sedan dividerar man och då kan man tex få resultatet 200,25/mm. Det betyder ju då att om man skall transportera 100mm skall man mata ut 20 025 pulser.

Bara för att förtydliga vad jag menade. Joje vet nog detta :)

Sodjan:
Stegmotorstyrkort har två signaler, STEP och DIR. För att gå åt ena hållet sätter man DIR hög och pulsar sedan STEP så många steg man vill gå. Pulesen kan vara negativ eller positiv, beroende på kortet och tajmingen brukar ej vara kritisk.
Användarvisningsbild
jojje
Gått bort
Inlägg: 6380
Blev medlem: 20 januari 2006, 01:53:33
Ort: Stockholms utkant
Kontakt:

Re: Hur styra en stegmotor med en uC

Inlägg av jojje »

Dessa pryttlar har jag till förfogande + lite annat småtjafs.
Kan man tex göra lite större siffror på nån av displayerna?
Tyvärr har jag inget 4x4 tagentbord, men det går att köpa.
Sen har jag fyra 7-segmentare och en exprimentplatta.

Bild
Bild1. Helst skulle jag vilja använda denna. Jag har ca 10st.

Bild
Bild2.

Bild
Bild3. Fick av sodjan. Fint med knappar, men det kanske är bättre med 4x4 eller 4x3.

Bild
Bild4.

Bild
Bild5.

Bild
Bild6.

Bild
Bild7. Kommer från nån telefon tror jag. (Protte's kanske?)

Bild
Bild8.

Bild
Bild9.

Bild
Bild10. Fick av POS. omer från en videospelare. Har en yttre ring som kan snurras en bit åt varje håll. Den inre, med fingerhål, finns inget stopp på.
Användarvisningsbild
LaRdA
EF Sponsor
Inlägg: 3766
Blev medlem: 9 september 2003, 14:10:46
Ort: Jämtland

Re: Hur styra en stegmotor med en uC

Inlägg av LaRdA »

Visst borde det fungera med den första, verkar vara en standard alfanumrerisk LCD.
Den, ett par knappar samt "pulsgivare 20 puls" så kan du nog fixa ett ganska snyggt och lättanvänt interface.
Användarvisningsbild
jojje
Gått bort
Inlägg: 6380
Blev medlem: 20 januari 2006, 01:53:33
Ort: Stockholms utkant
Kontakt:

Re: Hur styra en stegmotor med en uC

Inlägg av jojje »

Kanske man först ska prova med den där sodjan-grejjen. Den har jag dokumentation på tom. :vissla:
Sen det däringa 4x3 bordet för att knappa in siffrorna.

Undrar om han har flera, men om det blir bra, kan man kanske testa med dom andra displayerna och lösa tryckisar.

Börja med det enklaste först. :D
Användarvisningsbild
jojje
Gått bort
Inlägg: 6380
Blev medlem: 20 januari 2006, 01:53:33
Ort: Stockholms utkant
Kontakt:

Re: Hur styra en stegmotor med en uC

Inlägg av jojje »

Som ni säkert såg, så har jag massa OPTREX DMC2034 displayer. Enligt helpen i MicroBasic Pro så måste man ha en MCP23S17 mellan processorn och den HD44780 kompatibla kontrollern. Jag hittade också hur man kan koppla den direkt till en BasicStamp. Där verkar man inte behöva någon krets emellan. Har man mellankretsen för att spara in/ut-gångar på processorn eller finns allt på kortet jah fått tag i? BasicStampen är väl i princip samma som en PIC, eller?

Om det inte funkar, så kan man lika bra köra med en grafisk display så kan man kanske få allt på samma. Bara man kan ha tillräckligt stora siffror så man slipper förstoringsglas. Kanske inte så farligt, armarna är väl inte längre än man ser det i alla fall. Vad tycker ni som har erfarenhet?
Swech har väl några bra för 199:- Den kan man också köra direkt från uC'n.
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: Hur styra en stegmotor med en uC

Inlägg av v-g »

Du ska normalt inte behöva ha något mellan en display och en µc nej. Däremot drar ju en display precis som du sa en herrans massa portar MEN man kan minska detta genom att köra 4-bit mode, men det är krångligare. Det går även att minska ner portarna mha ett shiftregister då behövs egentligen bara 4 anslutningar + jord.
Användarvisningsbild
jojje
Gått bort
Inlägg: 6380
Blev medlem: 20 januari 2006, 01:53:33
Ort: Stockholms utkant
Kontakt:

Re: Hur styra en stegmotor med en uC

Inlägg av jojje »

Kan det vara det dom gjort till BasicStampen?
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: Hur styra en stegmotor med en uC

Inlägg av v-g »

Du nu ska jag inte svara då jag inte vet 100 men det är troligt, den displayen är supersvindyr iaf det var vad jag minns av den :tumner:

Titta här förresten: http://elektronikforumet.com/forum/view ... =3&t=15375
Skriv svar