Schrittmotorsteuerung

Pitlem

Neues Mitglied
05. Sep. 2008
21
0
1
Sprachen
Schrittmotorsteuerung L6208

Mahlzeit,

da hier rumgenöhlt wird wenn man mal ein Jahr keine Zeit hat, :vroam:
stell ich mal bissele Code für eine Endstufenplatine on.

Platinengröße 80mm*25mm. (nur SMD1206) Pitch min.0.8

Atmel M88, Treiber L6208.

1/64 Microstepping, umschaltbar während des Laufs auf 1/32, 1/16, 1/8, 1/4, 1/2, 1/1.
Richtungsumkehr, Backlash, PEC, Stromanpassung 10-100% (max. 2A pro Strang!)

Schnittstellen SPI, I², Rs232 TTL Pegel.

Code mit Bascom erstellt.

Hier mal der nicht vollständige Code (ca. 31kB) . Code ist nicht optimiert aber einigermaßen Übersichtlich. Es fehlen auch die Kommunikations-Subs, Backlash und Pec. Es soll einfach nur ein Grundcode sein auf den man aufbauen kann.


Code:
$regfile = "m88def.dat"
$crystal = 16000000
$baud = 9600
$hwstack = 32
$swstack = 32
$framesize = 40

Dim Dirall As bit
Dim Dirin As bit
dim dirinflanke as bit

Dim Pwm0amer As Byte
Dim Pwm0bmer As Byte
Dim sinuscounter As Byte
Dim Steprange As Byte
Dim Stepamp As Single
Dim Sinusdown As Single
Dim Sinusup As Single
dim stepcounter as Long
dim prescalesoftcounter as word
dim prescalesoft as word

Config portc.0 = Output
Config portc.1 = Output
Config portc.2 = Output
Config portc.3 = Output
Config portd.2 = Output
Config portd.5 = Output
Config portd.6 = Output

Clockamp alias portc.0
CCWamp alias portc.1
Controlamp alias portc.2
Enableamp alias portc.3
Resetamp alias portd.2

Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Serialin = Buffered , Size = 15
Config Serialout = Buffered , Size = 15

Config Timer0 = Pwm , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Config Timer1 = Counter , Prescale = 1 , Compare A = Disconnect , Compare B = Disconnect , Clear Timer = 1

On Compare1a Stepint

Enable Compare1a

'######################
'# Testwerte          #
'######################


Dirin = 0
Compare1a = 3988
Steprange = 1
Stepamp = 40
prescalesoft = 100

'######################
'# Main
'######################


ccwamp = 0
controlamp = 0
enableamp = 1
resetamp = 1
sinuscounter = 1
stepcounter = 0
prescalesoftcounter = 0



Open "com1:" For Binary As #1
pulseout resetamp , 2 , 10
wait 1



enable Interrupts

Print #1 , "Start"

Do


'if stepcounter = 12800 then
'stepcounter = 0
'stop TIMER1
'wait 2
'start TIMER1
'end IF
'waitms 1
'gosub STEPINT
'Print #1 , "  " ; Stepcounter ; "   " ; sinuscounter ; "   " ; pwm0amer ; "   " ; pwm0bmer ; "   " ; ccwamp



nop

Loop


'######################
'# Int für Steps #
'######################

Stepint:
If prescalesoftcounter = prescalesoft then




if dirin = 0 then
gosub RIGHTSTEP
else
gosub LEFTSTEP
endif

If sinuscounter = 64 Then pulseout clockamp , 0 , 2
ccwamp = dirin
Pwm0a = pwm0amer
Pwm0b = pwm0bmer



prescalesoftcounter = 0
else
prescalesoftcounter = prescalesoftcounter + 1
end if
Return


'######################
'# Subs               #
'######################

Rightstep:
stepcounter = stepcounter + steprange
Sinusup = Lookup(sinuscounter , Sinusup) : Pwm0amer = Sinusup * Stepamp
Sinusdown = Lookup(sinuscounter , Sinusdown) : Pwm0bmer = Sinusdown * Stepamp
If sinuscounter = 128 Then
pulseout clockamp , 0 , 2
sinuscounter = 0
End If
sinuscounter = sinuscounter + Steprange
return



Leftstep:
stepcounter = stepcounter - steprange
If sinuscounter = 0 Then
pulseout clockamp , 0 , 2
sinuscounter = 128
End If
sinuscounter = sinuscounter - Steprange
Sinusup = Lookup(sinuscounter , Sinusup) : Pwm0amer = Sinusup * Stepamp
Sinusdown = Lookup(sinuscounter , Sinusdown) : Pwm0bmer = Sinusdown * Stepamp
return


Close #1

End

'######################
'# Sin Cos Werte      #
'######################

Sinusup:
data 0.00! , 0.06! , 0.13! , 0.19! , 0.25! , 0.31! , 0.37! , 0.44! , 0.50! , 0.56! , 0.62! , 0.68! , 0.74! , 0.80! , 0.86! , 0.92! , 0.98! , 1.03! , 1.09! , 1.15! , 1.20! , 1.26! , 1.31! , 1.36! , 1.42! , 1.47! , 1.52! , 1.57! , 1.62! , 1.67! , 1.71! , 1.76! , 1.80! , 1.85! , 1.89! , 1.93! , 1.97! , 2.01! , 2.05! , 2.08! , 2.12! , 2.15! , 2.19! , 2.22! , 2.25! , 2.28! , 2.31! , 2.33! , 2.36! , 2.38! , 2.40! , 2.42! , 2.44! , 2.46! , 2.47! , 2.49! , 2.50! , 2.51! , 2.52! , 2.53! , 2.54! , 2.54! , 2.55! , 2.55!
data 2.55! , 2.55! , 2.55! , 2.54! , 2.54! , 2.53! , 2.52! , 2.51! , 2.50! , 2.49! , 2.47! , 2.46! , 2.44! , 2.42! , 2.40! , 2.38! , 2.36! , 2.33! , 2.31! , 2.28! , 2.25! , 2.22! , 2.19! , 2.15! , 2.12! , 2.08! , 2.05! , 2.01! , 1.97! , 1.93! , 1.89! , 1.85! , 1.80! , 1.76! , 1.71! , 1.67! , 1.62! , 1.57! , 1.52! , 1.47! , 1.42! , 1.36! , 1.31! , 1.26! , 1.20! , 1.15! , 1.09! , 1.03! , 0.98! , 0.92! , 0.86! , 0.80! , 0.74! , 0.68! , 0.62! , 0.56! , 0.50! , 0.44! , 0.37! , 0.31! , 0.25! , 0.19! , 0.13! , 0.06! , 0.00!

sinusdown:
data 2.55! , 2.55! , 2.55! , 2.54! , 2.54! , 2.53! , 2.52! , 2.51! , 2.50! , 2.49! , 2.47! , 2.46! , 2.44! , 2.42! , 2.40! , 2.38! , 2.36! , 2.33! , 2.31! , 2.28! , 2.25! , 2.22! , 2.19! , 2.15! , 2.12! , 2.08! , 2.05! , 2.01! , 1.97! , 1.93! , 1.89! , 1.85! , 1.80! , 1.76! , 1.71! , 1.67! , 1.62! , 1.57! , 1.52! , 1.47! , 1.42! , 1.36! , 1.31! , 1.26! , 1.20! , 1.15! , 1.09! , 1.03! , 0.98! , 0.92! , 0.86! , 0.80! , 0.74! , 0.68! , 0.62! , 0.56! , 0.50! , 0.44! , 0.37! , 0.31! , 0.25! , 0.19! , 0.13! , 0.06!
data 0.00! , 0.06! , 0.13! , 0.19! , 0.25! , 0.31! , 0.37! , 0.44! , 0.50! , 0.56! , 0.62! , 0.68! , 0.74! , 0.80! , 0.86! , 0.92! , 0.98! , 1.03! , 1.09! , 1.15! , 1.20! , 1.26! , 1.31! , 1.36! , 1.42! , 1.47! , 1.52! , 1.57! , 1.62! , 1.67! , 1.71! , 1.76! , 1.80! , 1.85! , 1.89! , 1.93! , 1.97! , 2.01! , 2.05! , 2.08! , 2.12! , 2.15! , 2.19! , 2.22! , 2.25! , 2.28! , 2.31! , 2.33! , 2.36! , 2.38! , 2.40! , 2.42! , 2.44! , 2.46! , 2.47! , 2.49! , 2.50! , 2.51! , 2.52! , 2.53! , 2.54! , 2.54! , 2.55! , 2.55! , 2.55!


'if dirin = dirall then
'dirinflanke = 0
'else
'dirinflanke = 1
'dirall = dirin
'endif

Sodele, hab mal ne Stunde Zeit und mach ein paar Erklärungen.

Ich hab jetzt verschiedene Quellen durch und bekomme unterschiedliche Aussagen zur Berechnung der Microstepps.
Da für vier Schritte vier unterschiedlich Zustände im Vollschrittmodus gebraucht werden, jeder einzelne aber noch in Unterschritte unterteilt werden kann, scheint die Angabe der Microstepps für manche Leute sehr schwierig zu sein. Für mich sind die Unterschritte (Microstepps) pro Schritt maßgebend und nicht die ganze Sache mal vier. Egal und ich lass mich gerne eines Besseren belehren.

Im Code unter Testwerte:

Dirin = 0 Richtungsumkehr Linkslauf=0 Rechtslauf=1 (an jeder Stellung des Steppers umschaltbar)
Compare1a = 3988 Zeit des Interrupts
Steprange = 1 Schrittweite der Microstepps. 1=1/64, 2=1/34, 4=1/16, 8=1/8, 16=1/4, 32=1/2 und 64=1/1 (nur bei entsprechender Stellung umschalten)
Stepamp = 40 Der Strom der einen Motorstrang durchfließt in %. (unter 10% werden die Werte aber so klein das der Offset des internen Comperators ein Wörtchen mitreden will)
prescalesoft = 100 Ein Soft-Prescaler der einen festen Compare1a-Werte teilen kann.

Ich lasse mir Platinen ätzen, wer möchte PN an mich.

Preis ca. Platine 6.-, L6208D (pitch 1,27 oder wie man das nennt) 10.- , ATMega88 (pitch 0,8) 2,- und klein Sch... 4,-. Alles in Euro und SMD 1206


Grüße Pit


Upps:
Revision01: CRA und CRB entsprechen 40nF und nicht wie im Schaltplan angegeben 10nF.
Revision02: R2 10kOhm
 

Anhänge

  • treiber6208.jpg
    treiber6208.jpg
    111,9 KB · Aufrufe: 225
Hi Pit,

da hier rumgenöhlt wird wenn man mal ein Jahr keine Zeit hat, :vroam:
wer nöhlt denn hier ? :hmpf: Hier wird nicht genöhlt ! :D
Wenn man mal keine Zeit hat, dann ist das eben so ... ;)

stell ich mal bissele Code für eine Endstufenplatine on.
Platinengröße 80mm*25mm. (nur SMD1206) Pitch min.0.8
Atmel M88, Treiber L6208.

1/64 Microstepping, umschaltbar während des Laufs auf 1/32, 1/16, 1/8, 1/4,
1/2. Richtungsumkehr, Backlash, PEC, Stromanpassung 10-100% (max. 2A
pro Strang!)

Schnittstellen SPI, I², Rs232 TTL Pegel.
Code mit Bascom erstellt.
Das hört sich nicht schlecht an ... :)
Nen 6209 (ich glaub in DIP) hab ich hier wohl noch liegen. Und
Schrittmotoren auch ... :D

Gruß
Dino
 
Nabend,

hab den Code vervollständigt und den Schaltplan angehängt.

Alles im ersten Posting.

@Dino Was ist den der L6209 für ein kleiner Übeltäter.:p

Grüße Pit
 
Hi,
ja ne doch, aber nicht viel.:D

Muschte halt die State-Maschine vom L6208 mit den I1a und I2a, wie auch immer, simulieren.

Gruß Pit
 
Ich habe ein kleines Problem. Ich bin Anfänger und hab jetzt zumindest ein paar Grundlagen drauf und wollte mal diese Schaltung aufbauen. Beim Compilieren mit Bascom bekomme ich aber folgende Fehler:

Error: 369 Line: 171 Duplicate label name used by const or variable [sinusup], in File: .......
Error: 369 Line: 175 Duplicate label name used by const or variable [sinusdown], in File: .......

Ich weiss mir selber dabei nicht zu helfen. Wo liegt der Fehler? Das Programm selber habe ich komplett unverändert gelassen.
 
Hallo,

Ich habe ein kleines Problem. Ich bin Anfänger und hab jetzt zumindest ein paar Grundlagen drauf und wollte mal diese Schaltung aufbauen. Beim Compilieren mit Bascom bekomme ich aber folgende Fehler:

Error: 369 Line: 171 Duplicate label name used by const or variable [sinusup], in File: .......
Error: 369 Line: 175 Duplicate label name used by const or variable [sinusdown], in File: .......

Ich weiss mir selber dabei nicht zu helfen. Wo liegt der Fehler? Das Programm selber habe ich komplett unverändert gelassen.
Der letzte Beitrag war von 2009. Da hat sich in der Zwischenzeit bei Bascom was geändert. Man darf nicht mehr Sprunglabel (für Goto, Call, Gosub, ...) und Variablennamen mit gleichem Namen anlegen. Ein Name muß eindeutig sein. Such mal ob du Sprungziele und Variablen mit gleichem Namen findest.

Gruß
Dino
 
Hallo Jan!

Willkommen im AVR-Praxis Forum! :ciao:


Die Fehlermeldung besagt, dass eine Variable bzw. Constante den selben Namen aufweist wie eine Subroutine.
Das darf seit BASCOM 2.0.6.0 (meine ich jetzt so aus dem Kopf, muss sonst mal genau nachsehen) nicht mehr sein!

EDIT:
Es wurde ab Version 2.0.3.0 geändert! :cool:


Für einen genaueren Hinweis müsste ich mir das Programm erst noch ansehen......
Vielleicht kommst du aber nun auch von selber drauf. :wink:


Grüße,
Cassio
 
Danke für die schnellen Antworten. Ich wäre nie darauf gekommen, dass sich in Bascom so etwas grundlegendes geändert hat. Ich habe es jetzt endlich geschafft alle Fehlermeldungen los zu werden und habe endlich das Programm vollständig verstanden. Aller Anfang ist halt schwer.
 
Hat noch jemand hier weitergemacht, ich ueberlege eine Schrittmotorsteuerung mit 'diskreter' H-Bruecke
zu bauen zb. 8 St. irfx3206 (0.003ohm) damit sollte kein Kuehlkoerper bei ~5A-10A noetig sein

was haltet ihr davon ?

Gruss
Charly
 
Hi Charly,

Hat noch jemand hier weitergemacht, ich ueberlege eine Schrittmotorsteuerung mit 'diskreter' H-Bruecke
zu bauen zb. 8 St. irfx3206 (0.003ohm) damit sollte kein Kuehlkoerper bei ~5A-10A noetig sein

was haltet ihr davon ?
zum Experimentieren OK. Für Nutzzwecke ... nix. Viel zu viel Aufwand.

Sieh mal hier ...
sorotec.de - Analoge Endstufen
und hier ...
sorotec.de - Digitale Endstufen
Die sind sogar für Mikroschrittbetrieb geeignet. Was soll man sich für Nutzanwendungen bei dem Preis noch an Arbeit antun. Und das ist noch nichtmal nach niedrigem Preis gesucht sondern war nur mal nen Schnellschuss. Für Nutzanwendungen sollte man sowieso um die 60-80V Betriebsspannung für den Motor einplanen. Je mehr desto besser.

Die günstigste auf der Seite ...

M542 V2.0 Schrittmotorkarte Leadshine - 52,90 EUR
- Phasenstrom von 1,0-4,2A (peak) in 8 Schritten per Dip-Schalter einstellbar
- Dauerstrom ( RMS) 3,0 A
- Motorspannung 20-50 Volt
- Mikroschritt Auflösungen von 1/2 Schritt bis 1/128Schritt (400 - 25600 Schritte/Umdrehung)
- Automatische Stromabsenkung (50%). Per Dipschalter auch abschaltbar
- Taktfrequenz bis 300Khz
- Überspannungs und Kurzschlussfest
- Optokoppler Eingänge
- Anschluß an PC-Parallelport über Interfaceplatine oder Mikrocontroller
- Durch neueste und patentierte Schaltungstechnologie geringe Hitzeentwicklung an Endstufe und Motor
- Komplettes Metallgehäuse, einschließlich integriertem Kühlkörper
- Abmessungen: 118 x 75,5 x 33 mm (L x B x H) ( Ohne Stecker gemessen)
- Gewicht ca 280gr

Die digitale fängt bei noch kleinerem Preis an ...
DM422C Leadshine Digital 20-36VDC 0,3-2,2A - 42,50 EUR

Also wie gesagt ... für Experimente OK. Wenn du eine für Nutzbetrieb mit den Werten selber bauen willst ... viel Spaß ;) Lohnt nach meiner Meinung nicht wirklich. Der Preis der Bauteile und die Arbeit die man damit hat bis alles gut läuft steht in keinem Verhältnis zum Preis der fertig gekauften.

Gruß
Dino
 
Hallo,
ich weiß, dass der Thread schon was älter ist, aber wenn man nach L6208 und Mickroschritt googelt, steht dieser Beitrag recht weit oben.
Meine Frage ist, ob die gepostete L6208-Schaltung mit dem BASCOM-Code-Schnipsel wirklich im Mikroschrittbetrieb funktioniert? Hat das mal jemand nachgebaut?
Ach ja, wenn ich nach 40nF Kondensatoren suche, finde ich keine. Es gibt nur 33 oder 47nF. Ist das ein Schreibfehler gewesen?

Vielleicht ist der Thread-Ersteller hier noch aktiv und kann mir ein paar Tipps zum Nachbau geben. Das würde mich echt freuen!

D
 
Hi,

ich hab jetzt nicht mehr den gesamten Thread durchgesehen ...

Bei mir liegen die ICs noch in der Tüte. War grad nen anderes Projekt wichtiger ;)

Meine Frage ist, ob die gepostete L6208-Schaltung mit dem BASCOM-Code-Schnipsel wirklich im Mikroschrittbetrieb funktioniert? Hat das mal jemand nachgebaut?
Wenn ich mich recht entsinne, dann arbeitet der L6208 normal nur bis maximal Halbschritt. Also so wie der L298/297. Man kann Mikroschrittbetrieb damit machen wenn man die Eingänge für die Stromregelung mitbenutzt und dadurch die Wicklungen mit anderen Strömen fährt. Mikroschrittbetrieb geht also sozusagen durch die Hintertür.

Ach ja, wenn ich nach 40nF Kondensatoren suche, finde ich keine. Es gibt nur 33 oder 47nF. Ist das ein Schreibfehler gewesen?
Ich weiß jetzt nicht genau wo der 40nF im Schaltplan steckt. Es gibt aber Keramik und Folien(MKT) Kondensatoren mit E12-Reihe. Also 33, 39, 47nF. Man könnte also zB 39nF nehmen. Werte wie 20nF, 30nF, 40nF, 50nF ... findet man oft in amerikanischen oder japanischen Geräten/Schaltbildern. Die haben da manchmal sonderbare Bauteilwerte bei Kondensatoren und Widerständen drin. Je nach Zweck des Bauteile kann man aber gefahrlos eine andere Größe nehmen oder sollte zB bei zeitbestimmenden Bauteilen die Werte möglichst gut annähern.

Gruß
Dino
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)