Schrittmotorsteuerung L6208
Mahlzeit,
da hier rumgenöhlt wird wenn man mal ein Jahr keine Zeit hat,
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.
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
Mahlzeit,
da hier rumgenöhlt wird wenn man mal ein Jahr keine Zeit hat,
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