PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anfängerprojekt Schrittmotor steuern



p@ty
05.10.2016, 10:31
Hallo zusammen!

Nachdem ich einige neue Maschinen mein eigen nennen darf, darunter auch eine konventionelle Fräse von
Optimum (MH 28V) und ich etwas Zeit im Alltag zur Verfügung gestellt bekomme (von meiner Chefin :o), möchte ich gern ein "kleines?"
Projekt starten.

Ich möchte gerne an besagter Fräse eine Achse (X) mit einem Schrittmotor verfahren.
Es geht hier nur um einen Achsvorschub und nicht um eine CNC Steuerung.
(evtl. können auch mehrere Achsen vefahren werden aber ich will es ersteinmal nur mit einer testen)

Sollte es solch ein Thema schon gegeben haben dann bitte ich um entschuldigung und um versetzung an die richtige Stelle. Danke!

Mein größtes Problem ist wie immer die Programmierung... :(
Da ich mit Bascom aber schon ein paar Erfahrungen sammeln konnte (danke Searcher, danke Kampi :)) würde ich dieses Projekt auch gerne damit proggen.

Zur Hardware...
Es stehen zur Verfügung:
1. Schrittmotor: Nema23 Stepper Motor 23HS8430, 3.0A
2. Treiber: Nema23 Schrittmotor-Controller-Treiber 2M542 4.2A
3. Atmega 168 (RN- Mini Control)
4. Bascom (Demo)
5. Fräse natürlich... :)

Eine genauere Auflistung der Verwendeten Teile kommt am Ende des Projektes.

Zur Funktion:
Der Schrittmotor soll die Achse der Fräse antreiben.
Die Geschwindigkeit des Schrittmotors wird über ein Poti gesteuert.
Ein Taster läst beim schließen den Motor laufen, beim öffnen bleibt der Motor stehen (evtl. Bremsen)
Ein Schalter zum umschalten links / rechtslauf
Mehr erst einmal nicht.

Natürlich habe ich keine Ahnung wie ich mit dem Code anfangen soll - werde aber heute Abend etwas probieren
und euch den (schreckens-) Code :rolleyes: zeigen.

Vielen Dank für eure Unterstützung / Hilfe / Tipps / Infos!

Viele Grüße, :)
P@

i_make_it
05.10.2016, 15:50
Hm, Z-Achse fräst auch gerne mal in den Tisch rein (Erfahrung aus der Lehre).

Als erstes mal einstellbare Stop Nocken und entsprechende Schalter als Öffner.
(zusätzlich zu den Endschaltern in den Endlagen die die Spindel etc. schützen sollen)

Eventuell geht analog zum Hebel an einerer Fräse mit mechanischem Vorschub ein Digitaler Joystik oder ein Tastschalter (ON OFF ON)
Wobei ich nicht weis ob es sowas heute noch gibt.
Das waren Schalter die aus beiden Stellungen zurück in Mittelstellung gefallen sind.
Damit läuft der Vorschub solange man hält.
Oder einfach ein Schalter (ON OFF ON) der fährt dann bis ein Endschalter ausgelöst wird oder er von Hand in Mittelstellung gebracht wird.
Das Poti ist dann für die Geschwindigkeitsvorgabe.
Und die beiden Schaltkontakte für die Richtung und Enable.

p@ty
05.10.2016, 19:28
Danke für dein Infos,

da ich es aber alles erst einmal auf dem Tisch aufbauen möchte vernachlässige ich die End- und Referenzschalter fürs erste.
Auch damit ich und andere den Code - das Ansteuern des Schrittis mit Bascom verstehen und es nicht schon von Anfang an zu überladen wird.

Bin grade dabei mich wieder mit Bascom an zu freunden... Aber lange ist es her...
Hier das Material...

3207632077

- - - Aktualisiert - - -

So,
erst mal alles angeschlossen. Sollte klappen.
32078

Hier mal ein Code den ich im Netz gefunden habe und ausprobieren wollte da kurz und "Übersichtlich". (Gibt´s aber noch ne Menge Fragezeichen :o)

Läuft leider nicht - war ja klar! :)





$regfile = "M168def.dat"
$crystal = 16000000
$hwstack = 100
$swstack = 100
$framesize = 100
$baud = 9600



'Programmkonfiguration

' r16 laden
!STS MCUCSR, R16 ' Zweimal wiederholen
!STS MCUCSR, R16

Config Portc = Output

Dim Anzahl_s As Long 'Schritte (zähler)

'Minus an GND oder frei lassen (läuft ohne.. )
Puls Alias Portc.0 'Pul
Richtung Alias Portc.1 'Dir
Freigabe Alias Portc.2
Freigabe = 0
'Ena (es gibt noch die Möglichkeit, die Leistung über PWM zu steuern)


'Programmkonfiguration
Do
'Schleife oder mit Timer
Puls = 1 'Signal erzeugen

Gosub Schritte 'Zählen

Waitus 400 'Impulsbreite

Puls = 0
Waitus 100 'Abstand zwischen Impulsen
Loop
Schritte:

If Anzahl_s > 400 Then
If Richtung = 1 Then
Gosub Links 'Richtung wechseln
Else
Gosub Rechts
End If
Waitms 1
End If

Anzahl_s = Anzahl_s + 1 'Schritte addieren
Return

Rechts: ' Rechts drehen
Richtung = 1 'Richtung auf 1 oder 0
Anzahl_s = 0 ' Schritte Reset
Waitms 100 'Haltepause/Bremszeit Motor braucht mindestens 5-30 ms
Return

Links: 'Links drehen
Richtung = 0 'Richtung auf 1 oder 0
Anzahl_s = 0 'Schritte/Bremszeit Reset
Waitms 100
Return

End
'Ende des Programms

i_make_it
06.10.2016, 06:07
Ich habe zwar noch nie Bascom programmiert, aber ich würde im ersten Schritt mal folgenden Code testen.


$regfile = "M168def.dat"
$crystal = 16000000
$hwstack = 100
$swstack = 100
$framesize = 100
$baud = 9600



'Programmkonfiguration

' r16 laden
!STS MCUCSR, R16 ' Zweimal wiederholen
!STS MCUCSR, R16

Config Portc = Output

Dim Anzahl_s As Long 'Schritte (zähler)

'Minus an GND oder frei lassen (läuft ohne.. )
Puls Alias Portc.0 'Pul
Richtung Alias Portc.1 'Dir
Freigabe Alias Portc.2
Freigabe = 0
'Ena (es gibt noch die Möglichkeit, die Leistung über PWM zu steuern)


'Programmkonfiguration
Do
'Schleife oder mit Timer
Puls = 1 'Signal erzeugen

Waitus 400 'Impulsbreite
Puls = 0
Waitus 100 'Abstand zwischen Impulsen
Loop

End


Eventuell die Zeiten größer machen und mit einer LED ansehen ob da ein entsprechendes Rechtecksignal an Portc.0 raus kommt. Ansonsten per Osziloskop prüfen.

Im zweiten Schritt dann:


$regfile = "M168def.dat"
$crystal = 16000000
$hwstack = 100
$swstack = 100
$framesize = 100
$baud = 9600



'Programmkonfiguration

' r16 laden
!STS MCUCSR, R16 ' Zweimal wiederholen
!STS MCUCSR, R16

Config Portc = Output

Dim Anzahl_s As Long 'Schritte (zähler)

'Minus an GND oder frei lassen (läuft ohne.. )
Puls Alias Portc.0 'Pul
Richtung Alias Portc.1 'Dir
Freigabe Alias Portc.2
Freigabe = 0
'Ena (es gibt noch die Möglichkeit, die Leistung über PWM zu steuern)


'Programmkonfiguration
Do
'Schleife oder mit Timer
Puls = 1 'Signal erzeugen
Gosub Schritte 'Zählen
Waitus 400 'Impulsbreite
Puls = 0
Waitus 100 'Abstand zwischen Impulsen
Loop

Schritte:
If Anzahl_s > 400 Then

Anzahl_s = 0
Waitms 100
End If
Anzahl_s = Anzahl_s + 1 'Schritte addieren
Return

End


Natürlich mit der korrekten Fassung der DO LOOP Schleife die aus dem ersten Schritt entstehen müsste.
Hier sollte ja nach 400 Pulsen eine Pause entstehen und dann wieder 400 Pulse kommen.
Wenn das klappt. Kann man DIRection und Enable hinzunehmen.
Kommen die Signale alle aus dem Controller, kann man den Motortreiber anschließen.
Dazu dann aber mal bei verschiedenen CNC Threads reinschauen, mit diesem Typ Motortreiber gabs glaube ich schon öfters Probleme. Da kann etwas Nacharbeit erforderlich sein.

p@ty
06.10.2016, 08:15
Hey i_make_it,

danke für dein geprogge - werde ich heute Nachmittag ausprobieren. Morgen hab ich frei da kann
ich schön den ganzen Tag zum testen investieren! :)

Ein Osziloskop habe ich leider nicht - die Led muss reichen.
Danke für die Tips und deine Unterstützung!

Viele Grüße,
p@

p@ty
06.10.2016, 19:40
Noch ne kleine Frage...

Müssen der Treiber und der Atmega eigentlich gleiches Potenzial / Spannungsversorgung haben?

Hab alles zusammen gerödelt aber der Motor Summt nur leise vor ich hin...

Hab Enable, Direction, und Puls in Bascom erzeugt.
Enable steht auf 0 aber ob ich 0 oder 1 setzte interessiert den Treiber nicht...Motor Summt weiter.

Direction steht auf 0 = Linkslauf / 1 = Rechtslauf

S1 ist ein Taster um den Puls ein / aus zu schalten.

Kontrol- Led für Puls Blinkt bei Tasterdruck lustig alle 50ms. Liegt hier der Fehler?

Zum Testen mal diesen ganz einfachen...


$regfile = "M168def.dat"
$crystal = 16000000
$hwstack = 100
$swstack = 100
$framesize = 100
$baud = 9600



'Programmkonfiguration

Config Portb.4 = Output
Config Portc.1 = Output
Config Portb.1 = Output

Config Pinc.0 = Input
Config Pind.4 = Input


Puls Alias Portb.1 'Pul
Puls = 0

Richtung Alias Portc.1 'Dir
Richtung = 0

Freigabe Alias Portb.4 'Ena
Freigabe = 0

S1 Alias Pind.4
S1 = 1

'Hauptprogramm

Do

If S1 = 0 Then

Waitms 40
Puls = 0
Waitms 10
Puls = 1

Else

Puls = 0

End If

Loop

End



Vielen Dank für eure Unterstützung!
p@

i_make_it
06.10.2016, 21:02
Eine gemeinsame Masse braucht es schon.
Wenn der GND vom Atmega z.B. 2V niedriger liegt wie der GND vom Motortreiber, wird dieser bei 5V niemals ein High Signal bekommen, da das ja mehr wie 3,7V braucht.

p@ty
06.10.2016, 22:35
Ok, das war mir jetzt etwas zu schnell... :rolleyes:

Habe ein Netzteil 48V für den Treiber und ein Netzteil 5V für den Atmega...

GND vom Atmega mit GND vom Treibernetzteil verbinden?

i_make_it
07.10.2016, 06:26
GND vom Atmega mit GND vom Treibernetzteil verbinden?

Ja, genau das.

Alle Masse bezogenen Signale müssen ein gemeinsames Bezugspotential (GND) haben sonst wird das nichts.

Nur differentielle Signale sind bezugslos. und nur durch die Spannungsdifferenz zwichen der positiven und der negativen Leitung definiert.
Wobei es egal ist ob so ein Signal dann symetrisch z.B. +15V - -15V ist oder +30V - 0V oder 0V - -30V ist, in allen Fällen ist die Differenz 30V.
Ein Massebezogenes Signal wie ein 5V Logikpegel, hat bei unterschiedlichen Bezugspotentialen an verschiedenen Schaltungsteilen halt nur da 5V wo das Bezugspotential genau 5V negativer als das Signal ist.
Stell es Dir vor wie ein Fluß der an verschiedenen Stellen unterschiedlich Tief ist (Ground). Der Wasserspiegel ist zwar von oben gesehen überall gleich, aber spätestens da wo ein Schiff auf Grund läuft, reicht die Wassertiefe (Signalpegel) nicht aus damit das Signal (Schiff) durch kommt.
Das Bespiel ist nicht richtig zutreffend und etwas blöd, aber was anderes ist mir auf die Schnelle nicht eingefallen.

p@ty
07.10.2016, 09:45
Danke für deine Ausführung - macht Sinn! :)

Also mit diesem kleinen Code läuft der Motor schon mal...




$regfile = "M168def.dat"
$crystal = 16000000
$hwstack = 100
$swstack = 100
$framesize = 100
$baud = 9600


'Programmkonfiguration

Config Portb.4 = Output
Config Portc.1 = Output
Config Portb.1 = Output

Config Pind.4 = Input

Puls Alias Portb.1 'Pul
Puls = 0

Richtung Alias Portc.1 'Dir
Richtung = 1

Freigabe Alias Portb.4 'Ena
Freigabe = 1

S1 Alias Pind.4 'Taster
S1 = 1

'Hauptprogramm

Do

If S1 = 0 Then

Waitms 1
Puls = 0
Waitms 1
Puls = 1

Else

Puls = 0

End If

Loop

End



Den Schrittmotor habe ich parallel an den Treiber angeschlossen. Ansonsten wie im Code zu sehen:

PinB.4 = Freigabe (obwohl der Motor auch ohne diesen Anschluss läuft - warum?)
PinC.1 = Richtung (das klappt mit 1 = Linkslauf / 0 = Rechtslauf)
PinB.1 = Puls (die Frequenz die hier einfach über ein waitms erzeugt wird - hier 2ms => 500Hz => 0.5kHz richtig?)
PinD.4 = Taster S1 (die Frequenz soll erst erzeugt werden wenn Taster gedrückt wird)

Den Treiber habe ich so eingestellt:
Current RMS = 3A
Puls / Schritte = 400
400 Schritte finde ich recht wenig aber bei den anderen Einstellungen läuft er nur sehr viel langsamer - habt ihr irgendwelche Tipps dazu?

...und macht das denn überhaupt Sinn die Frequenz so zu erzeugen oder sollte man da besser eine PWM nutzen?

Der nächste Schritt wäre die Geschwindigkeit über ein Poti zu steuern - aber da hört es jetzt erstmal völlig auf bei mir...:(

Hab ja frei heute - ich probier mal rum! :)

Danke für deine Unterstützung i_make_it

- - - Aktualisiert - - -

...ok, hab mal ein wenig mit dem waitms gespielt - den 2. Wert durch 10 geteilt. Bei 400 Schritten läuft der Motor sehr viel schneller...


https://youtu.be/1OUd3eI_yZc

Wenn ich die Schrittweite am Treiber von 400 auf z.B. 6400 umstelle läuft der Motor entsprechend langsamer. Klar, er muss ja mehr Schritte bei gleicher Frequenz machen. Ok, dachte ich Frequenz nochmals erhöhen - aber bringt nix - Geschwindigkeit bleibt gleich. Wenn man es mit der Frequenz übertreibt z.B. 0,2ms (5kHz) dann steht der Motor und Summt nur laut...

:?

...irgendwelche Ideen wie ich es besser machen könnte?

Greez,
p@

- - - Aktualisiert - - -

...hier mal der Code mit Schalter für Richtungswechsel...




$regfile = "M168def.dat"
$crystal = 16000000
$hwstack = 100
$swstack = 100
$framesize = 100
$baud = 9600


'Programmkonfiguration

Config Portb.4 = Output
Config Portc.1 = Output
Config Portb.1 = Output

Config Pind.4 = Input
Config Pind.5 = Input


Puls Alias Portb.1 'Pul
Puls = 0

Richtung Alias Portc.1 'Dir
Richtung = 1

Freigabe Alias Portb.4 'Ena
Freigabe = 1

T1 Alias Pind.4 'Taster zum Frequenzerzeugen
T1 = 1

S1 Alias Pind.5 'Schalter zum Richtungswechsel
S1 = 1

'Hauptprogramm

Do

If T1 = 0 Then

Waitms 1
Puls = 0
Waitms 0.1
Puls = 1

Else

Puls = 0

End If

If S1 = 1 Then
Richtung = 1

Else

Richtung = 0

End If

Loop

End

i_make_it
07.10.2016, 12:52
400 Pulse pro Umdrehung ist Halbschritt Betrieb.
Der Motor hat ja eine feste Schrittzahl pro Umdrehung im Vollschritt.
Üblicherweise 200 Schritte mit einem Schrittwinkel von 1,8° (ich habe jetzt nicht nach Deinem konkreten Stepper gesehen sondern nehme den Wert der am häufigsten vorkommt)

Im Handbuch:
http://www.leadshine.com/uploadfile/down/m542v2m.pdf
Auf Seite 5-7 findet sich der Anschluß von 4 -Draht , 6-Draht und 8-Draht Steppern.
Auf Seite 8 die Mikroschritt Einstellung basierend auf 1,8° Motoren.
Bei Halbschritt, wie Du es eingestellt hast, läuft der Motor am schnellsten.
Auf Seite 10 ist die Verdrahtung.
Nach dem Timing Diagramm auf Seite 11 ist ENA High aktive. Der Motor sollte also nicht laufen wenn der Controller Pin auf Low geht.
Da Du mit DIR arbeitest ist die linke Hälfte des Diagrams für Dich zutreffend.
Dort siehst Du auch die von mir genannte Notwendigkeit des gemeinsamen GND.
Ein low Signal wird von 0V bis 0,5V erkannt. Ein High Signal ab 3,5V aufwärts.
Auch das Timing siehst Du in dem Diagram.
Also DIR auf High, PUL auf High und ENA auf Low.
Wenn ENA auf High geht mindestens 5µs warten bis DIR auf Low gehen darf.
und wenn DIR den Pegel wechselt, mindestens 5µs warten bis Bei PUL ein Rechtecksignal anliegen darf.
Die PWM Frequenz darf von 0Hz bis maximal 300kHz gehen.
Die Austastung also auf 50% (genauso lang High wie Low)
und zwichen 2 Pegelwechseln müssen minimal 1,6667µs vergehen.
Das müssten die Grenzdaten sein.
Die alternative Ansteuerung die der Treiber kann wäre anstelle von PUL(s) und DIR(ection) mit Clockwise (CW) und Counter Clockwise (CCW) zu arbeiten.

p@ty
09.10.2016, 19:13
Danke dir für die Infos! 👍 Klasse!

Jetzt muss ich nur noch mit meinen begrenzten Kenntnissen im proggen die passende Pwm erzeugen und aufpassen das ich beim umschalten der Richtung die nötigen Wartezeiten einhalte um den Motor nicht zu zerstören.... 😐

Ich fange morgen an die Pwm in den Griff zu bekommen. Danke nochmal! 👍

Gruß,
p@

021aet04
10.10.2016, 07:28
Den Motor wirst du nicht zerstören, eher die Ansteuerung (Leistungshalbleiter) durch Kurzschluss.
Und der Eingang ist kein PWM Eingang sondern ein Puls Eingang. Bei PWM stellst du das Verhältnis zwischen Einschalt- und Ausschaltzeit ein. Das hat mit der Pulsfrequenz nichts zu tun. Am leichtesten ist es wenn du dir Diagramme anschaust.

MfG Hannes

p@ty
10.10.2016, 10:40
Hallo und Danke!

Hat mich etwas weiter gebracht eure Infos! :)
Hab mir alles (Treiber Spezi und Pwm Artikel in RN- Wissen) durchgelesen und gehe nochmal einen Schritt zurück.




$regfile = "M168def.dat"
$crystal = 16000000
$hwstack = 100
$swstack = 100
$framesize = 100
$baud = 9600


'Programmkonfiguration

'Port/Pin Konfiguration

Config Portb.1 = Output
Portb.1 Alias Pwm

'PWM Konfiguration

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = clear Up , Prescale = 1
'(16000000/1) / (256*2) = 31250Hz = 31,25kHz
'Jetzt soll also ein Puls (Rechtecksignal) von 31kHz am Portb.1 ankommen

'Hauptprogramm

Do

Pwm = 128 'Compare1a = 128 also Tastverhältniss 50%

Loop

End



Alles richtig soweit für die Pwm eingegeben?
Wenn ja dann sollte jetzt ein Tastverhältniss von 50% eingestellt sein und damit ein gleichmäßiges Rechtecksignal.
Welcher Wert ist den nun aber für die Geschwindigkeit zuständig wenn das Tastverhältniss immer 50% sein soll?
Dachte das wäre Compare1a = 0 - 255?:confused:
Danke schon mal für die Infos!

p@

i_make_it
10.10.2016, 11:10
Die Frequenz des Rechtecksignals.
Wenn PWM vom Controller eine Festfrequenz nutzt kann man es nicht nutzen.
Dann muß man einen Rechteck-Signalgenerator programmierne der bis maximal 300kHz gehen darf.

p@ty
10.10.2016, 11:20
....das ist ja gar-nicht-mal so einfach fürn ollen Mechaniker... :)
Dachte ich komm´ der Sache etwas näher. :(
Also keine Hardware PWM sondern einen Softwaresignalgenerator proggen?
...jetzt fange ich wieder an mit waitms? Könnt ihr mir bitte noch etwas auf die Sprünge helfen wie sowas in Bascom ausehen könnte?
Bin jetzt etwas verwirrt... :confused:

Oder muss man irgendwie den Prescale mit einer Variablen verknüpfen... :confused:

i_make_it
10.10.2016, 11:46
Da ich ja kein Bascom mache,
http://www.mikrocontroller.net/topic/152966
Da wird ein Frequenzgenerator mit Bascom programmiert.
Eventuell mal da im Code und in den Posts nach Hinweisen schauen.
Ein Timerrinterrupt der nach einer der Frquenz entsprechenden Zeit einen Ausgang toggelt sollte da gehen.
Dann bleibt zwichen den IRQs noch zeit für anderes.

p@ty
10.10.2016, 12:08
Ok, danke für den Hinweis.

An die Bascom Progger:
Steuert jeder so "kompliziert" seinen Schrittmotor über einen Frequenzgenerator an?

Tja, dann muss ich nochmal back to the roots und mich einarbeiten...
Danke bis hier hin an euch beiden! :)

i_make_it
10.10.2016, 12:52
Habe grad mal die Suche bemüht.
Hier im Forum gabs das auch schon:
https://www.roboternetz.de/community/threads/33346-atmega-als-variabler-rechteckgenerator

Eventuell mal einen der Poster kontaktieren.

p@ty
12.10.2016, 11:40
...ok, also ich versuche als erstes mal nur einen Takt über den Timer1 an einem Pin zu erzeugen - den maximalen Takt (oder annähernd) für den den Leadshinetreiber.

Der Hersteller sagt ja von 0 - max. 300kHz...

Hier mal der Code:



$regfile = "M168def.dat"
$crystal = 16000000
$hwstack = 100
$swstack = 100
$framesize = 100
$baud = 9600


'Programmkonfiguration

'Timer konfigurieren
Config Timer1 = Timer
On Timer1 Frequenzerzeugung
Enable Timer1
Enable Interrupts

'16000000 (systemtakt ohne Prescaler) / 65535 (16Bit Timer) = 244Hz (kleinster Takt)

'Port/Pin Konfiguration

Config Portd.2 = Output
Portd.2 Alias Frequenzausgang



'Hauptprogramm

Do

!NOP

Loop

End

Frequenzerzeugung:

Timer1 = 55 '16000000/55=290909Hz ca.300kHz (der max. Takt für den Leadshintreiber)
Toggle Frequenzausgang

Return



....ähm, was sagt ihr? :confused:

Searcher
22.10.2016, 20:06
...ok, also ich versuche als erstes mal nur einen Takt über den Timer1 an einem Pin zu erzeugen - den maximalen Takt (oder annähernd) für den den Leadshinetreiber.
....ähm, was sagt ihr? :confused:

Hallo p@ty,

es gibt so viele Möglichkeiten einen Takt zu erzeugen. Dein Programm nutzt einen Interrupt um dort einen Pin zu toggeln. Damit lassen sich sicher keine 300kHz erzeugen weil Interruptausführung (mit Sichern von Registern) und Toggle Kommando zuviel Zeit beanspruchen. Es werden dann mehr Interrupts benötigt als überhaupt ausgeführt werden können. Die Timer im AVR können aber selbst HW-mäßig einen Pin toggeln.

Ich habe Dir dazu mal einen Testgenerator für einen Mega88 angehangen, der compiliert für einen Mega168 auch dort laufen sollte. Mit max. 2550Hz ist der Generator zwar noch weit von 300kHz entfernt, sollte aber zum Probieren gut sein. Welche Frequenz brauchst Du denn effektiv bzw Dein Motor? 300Khz scheint mir für die Praxis schon recht viel. Aber mit 16MHz Systemfrequenz und Prescaler = 1 für Timer1 kommt man hier schon recht einfach auf 40kHz und bei weiteren Modifikationen auch höher - teoretisch bis 333kHz wenn man den ADC_new Wert zB. manuell auf 2047 setzt.

Programm ist bis etwa 1,9kHz getestet. Mangels eines richtigen Schrittmotortreibers diente ein ATtiny44 mit L293D als Simulator mit einem bipolaren Schrittmotor (der bei höherer Taktfrequenz aus dem Tritt kam) aus einem Floppylaufwerk.

Das Programm nutzt den Timer1 des Mega88 im Mode 15. Das ist Fast-PWM, bei dem der Timer immer nur bis zum OCR1A Registerwert läuft. Durch ein Poti wird der OCR1A Wert verändert und damit wird die Frequenz des Taktes beeinflußt. Im PWM Modus wird der OCR1A-Wert gepuffert und erst zu einem unkritischen Zeitpunkt effektiv,; hier am "BOTTOM" bei TCNT1 = 0. Die Ausgabe des Taktes wird durch die Timereinstellung Toggeln von OC1A bei Erreichen des OCR1A-Wertes erreicht.

Mit zwei Tastern kann man DIR und ENABLE beeinflussen.

Gruß
Searcher


Frequenzangaben zum Programm berichtigt. Hoffe sind keine weiteren Bugs drin :-(

p@ty
24.10.2016, 06:39
Hallo Searcher,

alles gut bei dir?

Danke für deine Mühe und Umfangreiche Antwort! Am WE werde ich das mal testen und Bescheid geben! �� Danke Dir! ��

Searcher
24.10.2016, 19:21
alles gut bei dir?
Danke für deine Mühe ...
Joah, alles gut. Hab 'ne schöpferische Pause um nicht zu sagen Ideensuchend. Da kam mir Deine Frage gerade recht um mal wieder einen Steckbrettaufbau zu machen und mit dem verstaubten Schrittmotor in einem alten Floppylaufwerksskelett etwas zu experimentieren. Also ich danke Dir :);).

Übrigens könnte man nach Deinem Programmentwurf mit dem Toggeln in der ISR auch höhere Frequenzen hinbekommen, wenn man die Anweisung "on Timer1 Frequenzerzeugung" mit dem Parameter "nosave" ausrüstet. Dann fallen die ganzen zeitraubenden Registersicherungen weg und in der ISR würde ich dann dann nur noch "!sbi PIND,2" reinschreiben. Timer1 natürlich vorher in einem Mode konfigurieren, der ein Setzen des Timer1 (TCNT1) in der ISR unnötig macht. SBI ist ein Assembler Befehl, der hier Bit 2 im PIND Register setzt, aber das SREG und andere Prozessorregister nicht verändert (deshalb keine Registersicherungen notwendig und deshalb das "nosave"). Ein Ausgangspin wird normalerweise im PORTx Register geschaltet. Wird stattdessen das entsprechende PINx Registerbit gesetzt, wird der PORT-Pin bei den meisten neueren AVR, wie Mega88, Mega168 getoggelt; und man braucht es dort nicht erst zu löschen um es wieder zu setzten um den Ausgangspin zu toggeln.

Aber 300kHz kann man damit wahrscheinlich auch nicht erreichen. Außerdem würde der AVR bei der Frequenz nur noch in der ISR hängen und sonst kaum noch etwas anderes machen können. Probiere ich vielleicht auch nochmal aus. Vielleicht sogar auch bis zum Wochenende :)

Gruß
Searcher

erik_wolfram
26.10.2016, 06:53
Hallo und guten Morgen,

ein schönes Projekt welches mich an meine Anfänge erinnert (auch mit BASCOM).
Beim Querlesen ist mir was aufgefallen:

Ich würde auf jeden Fall davon abraten die Massen zu verbinden! Schrittmotoren stören ordentlich - und wenn es sich vermeiden lässt sollte man die Massen artig getrennt lassen. Die Treiber haben optisch isolierte Eingänge - das hat seinen Grund! Das heißt das 5 V Potential ist nur an den jeweiligen Eingängen nötig: STEP, DIR und ENABLE.
Je nach Schaltung legt man an alle 3 Dioden 5V an die 5V-Anschlüsse (STEP, DIR, EN) und Schaltet separat die Masse, oder man verbindet die GND-Anschlüsse und schaltet jeweils die 5 V. ENABLE kann hierzu bei den meisten Treibern dieser Art offen bleiben, da es invertiert ist.

Anbei: mein Programm zur Schrittmotoransteuerung wurde so groß, dass ich dann irgendwann gezwungener Maßen auf C umgestiegen bin - das habe ich bis jetzt nie bereut ;)

Gruß Erik

i_make_it
26.10.2016, 07:21
Ich würde auf jeden Fall davon abraten die Massen zu verbinden! Schrittmotoren stören ordentlich - und wenn es sich vermeiden lässt sollte man die Massen artig getrennt lassen.

Also anstelle die EMV einzuhalten und so auch andere Störeffekte loszuwerden einfach einen Teil ohne Masse machen oder die Störungen über das Stromnetz schicken. So toll ist die Idee nicht wirklich.
Vor allem ohne Masse(Erdung) würde das nur bei Batteriebetrieb gehen.
Bei Netzgespeisten Spannungsversorgungen, macht einem spätestens der Pe einen Strich durch die Rechnung.
Oder wenn man meint ein Eurostecker hat ja keinen Pe, dann der N. Spätestens wenn Schutzleiter und Nulleiter auf Etagen- oder Gebäudeebene Verbunden werden wandern die Störungen da weiter.
Und im Extremfall hat man da dank EMV auch ein rechtliches Problem.
Also Entstören ist im Worstcase die kostengünstigere Variante gegenüber GND trennen und die Probleme ins öffentliche Stromnetz einzuspeisen.
Die Rechnung die das EVO einem als Verursacher für die Störungssuche schreibt wird ganz schnell mal vierstellig.

Optokoppler sollen in EMV gestörter Umgebung eigentlich nur die Logik vor eingekoppelten Spannungsspitzen schützen.
Und nicht als Grund herhalten selbst auf jede Entstörung zu verzichten.

p@ty
31.10.2016, 08:16
Hi zusammen!

Viele Dank für eure Beiträge - leider hat mein Sohn einen Grippevirus aus dem Kindergarten mitgebracht und fleißig zu Hause verteilt.
Denke wird sich noch etwas verzögern bis ich weiter machen kann.
Aber danke für alle Infos.

Viele Grüße,

p@