Sie sind vermutlich noch nicht im Forum angemeldet - Klicken Sie hier um sich kostenlos anzumelden Impressum 
Sie können sich hier anmelden
Dieses Thema hat 4 Antworten
und wurde 1.306 mal aufgerufen
 Bascom
p@b Offline



Beiträge: 4

11.10.2016 07:36
Schrittmotor mit Bascom ansteuern Zitat · antworten

Hallo zusammen!

Als neues Mitglied möchte ich mich kurz bei euch vorstellen:

Mein Name ist Patrick, bin 37 Jahre jung, verheiratet und habe einen kleinen Sohn (3Jahre).
Ich arbeite als CAD Konstrukteur mit Catia V5, ACAD und Medusa hauptsächlich den Sondermaschinenbau ab.

Meine Hobbys sind mein Sohn, Sport, Technik im allgemeinen, CNC Fräsen (Portalfräse von Haase), versuche mich an der Drehmaschine (kleine Chinadrehe von Bernado mit 400mm Spitzenweite) und am konventionellen Fräsen (China Fräse Optimum MH25V). Als neustes Hobby kam der Atmega168 mit Bascom dazu. Allerding befinde ich mich da noch in den Kinderschuhen.

Zu meinem Vorhaben: Ich möchte gerne einen Schrittmotor über eine Treiberendstufe mit Bascom steuern.
Start - Stop, Linkslauf - Rechtslauf, Geschwindigkeit über Poti steuern.

Zur Hardware:

1. Schrittmotor 4,2A / 1,8° pro Schritt
2. Leadshine Treiber M542
3. Atmega168 (RN - Mini Control)
4. USB All Avr Programmer

Zur Software:
1. Win7 64bit
2. Bascom (Demo)

Das für mich größte Problem ist die Geschwindigkeitssteuerung.
Bisher dacht ich immer das ich die Geschwindigkeit über eine Pwm (Compare Wert) steuern könnte.
Der Treiber benötigt aber ein Tastverhältnis von 50% und eine Frequenz von 0 - 300kHz für die Geschwindigkeit.

Hier mal ein Code zur Pwm:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 

$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
 

 









Ich dachte erst das die Geschwindigkeit über das Tastverhältnis eingestellt wird.
Aber diese wird über die Frequenz eingestellt.

Wie kann ich die Frequenz einstellen? Sagen wir mal in 1,5kHz Schritten von 0 - 300kHz?
Da komme ich einfach nicht weiter... bzw. weis ich nicht wie ich das Bascom beibringen soll...

Für Tips wäre ich euch sehr Dankbar!

Vielen Dank und viele Grüße,
P@

Selbstfeiermeister Offline




Beiträge: 630

11.10.2016 14:16
#2 RE: Schrittmotor mit Bascom ansteuern Zitat · antworten

Du versuchst jetzt deine Frequenz über den Prescaler einzustellen und lässt deinen Timer voll durchlaufen, bzw. bei der halben Zeit etwas tun.
Du musst die Frequenz aber über die den Timerwert einstellen. Dafür musst du einen geeigneten Prescaler wählen (je nach Timerauflösung). Einen Portpin lässt du dann mit erreichen eines bestimmten Timerwertes toggeln (2x toggeln bei gleichem Timerwert ergibt ein Tastverhältnis von 50%). Mit dem Ändern des Timerwertes (z.B. durch Abfrage von Port-Eingängen) ändert sich die Frequenz am Ausgang. Kleinere Timerwerte => höhere Frequenz und umgekehrt. Die Frequenzen kannst du dir über Den Prozessortakt, den Prescaler und die Timerwerte (Prozessortakte) ausrechnen. Aber Faktor 2 für das Toggeln nicht vergessen .

Gruß
Sebastian

p@b Offline



Beiträge: 4

12.10.2016 07:53
#3 RE: Schrittmotor mit Bascom ansteuern Zitat · antworten

Hi Sebastian und Danke für deinen Beitrag!

Ich werde mir das gleich mal durch den Kopf gehen lassen und versuchen was zu basteln...

p@b Offline



Beiträge: 4

12.10.2016 12:38
#4 RE: Schrittmotor mit Bascom ansteuern Zitat · antworten

...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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 

$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?

Time Bandit Offline



Beiträge: 2

15.10.2016 21:38
#5 RE: Schrittmotor mit Bascom ansteuern Zitat · antworten

So richtig hast du das mit den Timern glaube ich noch nicht verstanden.

Bei dir läuft der Timer nun jedes mal von 55 bis 65535 durch und erzeugt dann den Interrupt, das sind dann so 245 Hz.
Wenn du eine hohe Frequenz erzeugen willst, dann musst du die 55 von 65535 abziehen.

300kHz wirst du damit aber nie erzielen, keine Ahnung wieviele Anweisungen da im Hintergrund bei "Toggele" laufen, aber das werden verschachtelte If-Bedingungen sein, die vermutlich nicht in 55 Prozessortakten zu erledigen sind. Ich würde spontan vermuten, dass der Interrupt selber + die Timerbelegung deine 55 Prozessortakte schon "auffressen".

Die Frage bleibt eh, was willst du damit erreichen?
Jeder Impuls wird ja einen Schritt am Schrittmotor erzeugen, oder?
So schnell dreht kein Schrittmotor der Welt, im Vollschrittbetrieb wären das 45.000 1/min bei einem 1,8° Motor.
Selbst bei 1/16 Schritt kommt kein Motor mit.

Grundsätzlich bist du aber auf dem richtigen Weg.
Die Geschwindigkeitsregelung erfolgt über die Vorbelegung des Timers, je größer die Zahl desto höher die Geschwindigkeit. Die musst du aber natürlich noch sinvoll dimensionieren.
Wenn du das über Poti steuern willst, dann eben die Analogspannung einlesen und entsprechend per Parameter den Timer1 vorbelegen.

Ich persönlich würde ohne "toggle" arbeiten, da du so immer 2 Durchläufe für 1 Puls brauchst.
In die ISR einfach:

Port=1
Port=0

Das sollte dem Treiber reichen und ist auch deutlich schneller abgearbeitet als irgendwelche If-Schleifen.
Zur Not musst du eben noch ein "waitµs" einbauen.

 Sprung  

Xobor Forum Software von Xobor
Einfach ein eigenes Forum erstellen