Sida 3 av 5
Re: Hur styra en stegmotor med en uC
Postat: 3 april 2010, 23:22:23
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.
Re: Hur styra en stegmotor med en uC
Postat: 3 april 2010, 23:34:44
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...

Re: Hur styra en stegmotor med en uC
Postat: 3 april 2010, 23:40:00
av jojje
Jag har exempel i assembler om du vill ha
Nope, jag fattar ännu mindre än i Basic.
Jag tror och vet att man kan gott å väl använda heltal. Allt blir bättre än det dom använder idag.
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.
Re: Hur styra en stegmotor med en uC
Postat: 3 april 2010, 23:55:23
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...
Re: Hur styra en stegmotor med en uC
Postat: 4 april 2010, 00:00:57
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.
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).
Re: Hur styra en stegmotor med en uC
Postat: 4 april 2010, 00:48:33
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.
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.
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
}
Re: Hur styra en stegmotor med en uC
Postat: 4 april 2010, 01:06:03
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.
Re: Hur styra en stegmotor med en uC
Postat: 4 april 2010, 09:11:31
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.
Re: Hur styra en stegmotor med en uC
Postat: 4 april 2010, 15:11:35
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.

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

Bild2.

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

Bild4.

Bild5.

Bild6.

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

Bild8.

Bild9.

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å.
Re: Hur styra en stegmotor med en uC
Postat: 4 april 2010, 15:48:45
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.
Re: Hur styra en stegmotor med en uC
Postat: 4 april 2010, 15:59:47
av jojje
Kanske man först ska prova med den där sodjan-grejjen. Den har jag
dokumentation på tom.
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.

Re: Hur styra en stegmotor med en uC
Postat: 4 april 2010, 19:12:56
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.
Re: Hur styra en stegmotor med en uC
Postat: 4 april 2010, 19:16:37
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.
Re: Hur styra en stegmotor med en uC
Postat: 4 april 2010, 19:22:02
av jojje
Kan det vara det dom gjort till BasicStampen?
Re: Hur styra en stegmotor med en uC
Postat: 4 april 2010, 19:24:12
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
Titta här förresten:
http://elektronikforumet.com/forum/view ... =3&t=15375