PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ALLEGRO Treiberstufe



Riley
02.02.2006, 21:51
Hallo,
ich bin neu im Forum und einfach begeistert von dieser Seite! :D
Bin ein Bascom und allgemein ein Controller-Neuling und habe folgendes Problem:

Baue gerade eine Schrittmotorsteuerung und würde gerne den A3973 von Allegro verwenden.
Diesen Baustein muss ich aber mit zwei 19 Bit Wörter initialisieren.
Wie soll ich das am besten anstellen?
Denke der Befehl SHIFTOUT ist das richtige, komme aber nicht ganz klar damit.
Wie und wo soll ich die Wertigkeit der einzelnen Bits setzen?

Bitte um Hilfe,
Martin

Ratber
03.02.2006, 00:02
Ist eigentlich ganz einfach.

Du nimmst als Träger eine Variable das Typs Long und setzt die ersten (oberen) 19 Bit mit deinen gewünschten Werten und schickst die Vsriable dann mit Shiftout Data,Clock,Variable,0 bzw. 1,19 raus.

Wenn du lieber die untersten 19 Bit der Variable nehmen willst dann eben mit.

Shiftout Data,Clock,Variable,2 bzw. 3,19


Die einzelnen Bits setzt du eben mit And und 2^N oder du gibt 0 und 1 an und läst das Bitmuster der Variable einfach rotieren (1 oder 0 setzen und dann shift Left um eins)

Oder hab ich deine Frage nicht richtig verstanden ?

Riley
03.02.2006, 08:36
Hallo,

anbei ein Auszug des Datasheets.

Word0 Bit Assignments----------Word1 Bit Assignments

BIT FUNKTION---------------------BIT FUNKTION
D0 Word select = 0-----------------D0 Word select = 1
D1 Bridge 1, DAC, LSB-------------D1 Blank-time LSB
D2 Bridge 1, DAC, bit 2------------D2 Blank-time MSB
D3 Bridge 1, DAC, bit 3------------D3 Off-time LSB
D4 Bridge 1, DAC, bit 4------------D4 Off-time bit 1
D5 Bridge 1, DAC, bit 5------------D5 Off-time bit 2
D6 Bridge 1, DAC, MSB-------------D6 Off-time bit 3
usw.....

Ich muss 38 Bit an den Treiber senden.
Je nach Konfiguration wird die Wertigkeit der einzelnen Bit eingestellt.
Der Datensatz mit den 38 Bit wird in der Folge nicht mehr verändert.
Die 0 und 1 werden einmal festgelegt und in der Regel nicht mehr verändert.

zB:
Word0:
0101000111000110011

Word1:
1001011000110001101
---------------------------------------------------------------------------------
Dim A as long
shiftout Portd.0, Portd.1, A, 0, 19

Wie setze ich die einzelnen Bit?
A = 1001011000110001101& 1001011000110001101wird wohl nicht funktionieren.

Und was hat es mit der clock auf sich.
Kann ich einen x-beliebigen Portpin hernehmen?

MfG
Martin

Ratber
03.02.2006, 13:07
anbei ein Auszug des Datasheets.

Yo,hab ich gestern bzw. Heut Früh schon gesehen.
Is immer das erste was ich mit ziehe.

Zum Rest:


Ja wie gesagt,du kannst es dir eigentlich aufteilen wie es dir beliebt.
Bei Serout werden ja keinerlei zusätzliche Informationen übertragen also köntest du auch eine Variable al Bitarray definieren.
Also zb. Dim Daten(38) as Bit
Damit hast du Daten(1) bis Daten(38) die du bequem per Schleife berbeiten kannst.
Senden kannst3 die dann auch gut per Schleife.
(Pseudocode)
For x =1 to 38
Serout blabla daten(x)
next

Oder du fasst das in eine mehrteilige Byte oder Word Variable ein.
Kannst aber einfach auch nur 2 Long nehmen.

Ein Byte ist zb. mit a = &B01001011
Word a= &B0100101101001011
usw.




Und was hat es mit der clock auf sich.
Kann ich einen x-beliebigen Portpin hernehmen?

Ja,beim Befehl Serout gibst du für Daten und Clock beliebige Pins an.
Die müssen nur verfügbar und nicht anderweitig belegt sein sonst nix.

Riley
03.02.2006, 19:14
Dankeschön für die rasche und gute Hilfe!!!

Habe zwar schon fast das Bascom AVR Buch gelesen mir fehlen aber anscheinend noch einige "wichtige" Grundlagen.
ZB.: Was bedeutet &B vor den Bits?

Gibt es irgendwo gute Schulungsunterlagen bzgl. Grundkenntnisse, denn ich will wirklich nicht mit solchen grundlegenden Sachen im Forum nerven.


Dankeschön,
Martin

Ratber
03.02.2006, 22:40
ZB.: Was bedeutet &B vor den Bits?

Naja,wenn du einer Bariable einen Wert gibst dann weiß Bascom ja nicht in welchem Zahlensystem.
Ohne angaben wird Dezimal erwartet.
Einer Hexadeziameln stellt man ein "&" voran
Binär kommt mit "&b"

Also 96 = &60 = &b01100000



Gibt es irgendwo gute Schulungsunterlagen bzgl. Grundkenntnisse, denn ich will wirklich nicht mit solchen grundlegenden Sachen im Forum nerven.

Neben dem Handbuch von Bascom und den mitgelieferten Beispielen zb. das hier ansässsige Wiki und auch die ganze Seite von www.MCSelec.com

Das Forum hier ist ja auch dafür da.
Aber am meisten lernt man wenn man einfach die Befehle ausprobiert.

Es gibt keinen universellen Stil beim Programieren.
Jeder entwickelt da so seinen eigenen Stil und wie man es macht hängt auch von der aufgabenstellung ab.
Man kann natürlich von den anderen lernen und abschauen.

Ich wüßte jetzt nix konkretes im Web aber vieleicht die Anderen.

Riley
06.02.2006, 13:28
Es funktioniert leider noch immer nicht.
Glaube ich hab noch immer grobe Schnitzer drin. :frown:

Config Portb = Output

Dim Word0 As Long
Dim Word1 As Long

Motor Alias Portb.2
Strobe Alias Portb.3
Sleepmode Alias Portb.4

Word0 = &B0010000010000011101
Word1 = &B1001100011000010001

Sleepmode = 1

Strobe = 0
Shiftout Portb.0 , Porb.1 , Word0 , 1
Shiftout Portb.0 , Portb.1 , Word1 , 1
Strobe = 1

MfG
Martin

Ratber
06.02.2006, 14:35
Ja da fehlt noch die Zahl der Bits die du rausschieben willst.
Ohne schiebt er die komplette Variable raus und Long hat 4 Bytes also 32 Bits.

Damit wird der Allegro nix anfangen können.

Riley
06.02.2006, 14:50
Also so?

Shiftout Portb.0 , Porb.1 , Word0 , 1, 19
Shiftout Portb.0 , Portb.1 , Word1 , 1, 19

Muss ich bei der pclock noch irgendetwas einstellen,
und muss ich diesen Pin mit der Datenleitung verbinden?

Derzeit habe ich nämlich nichts im Programm mit Verbindung Portb.1 eingestellt.


MfG
Martin

Ratber
06.02.2006, 15:00
Ja,fassen wir mal zusammen.

Port B.0 und B.1 sollten als Output definiert sein sonst kommt da nicht viel raus.

Zum Befehl:

Shiftout Portb.0 , Portb.1 , Word0 , x, 19,Delay
Shiftout Portb.0 , Portb.1 , Word1 , x, 19,Delay

Für Delay trägst du dann die Verzögerung un µs ein damit du nicht zu schnell auf den Baustein taktest.
Kannste am anfang mal mit 100 beginnen und wenn die Komunikation hinterher steht kannste den Wert dann reduzieren oder vieleicht auch weglassen.

Für X trägste je nach Sendeweise 0-3 ein.
Ich weiß nicht ob du das LSB zuerst schickst oder das MSB.
Welche Flanke da den Anfang bildet weiß ich jetzt auch nicht.
Da müßte ich ins Datenblatt vom Allefro schauen.
Kannste aber auch einfach probieren.

Riley
13.02.2006, 13:20
Funktioniert einfach nicht. Schön langsam wäre ich wirklich happy wenn der Motor mal ein Lebenszeichen von sich gebe.

Vielleicht liegt der Fehler in meinem Programm ja bei den Zeitabständen in denen Strobe zu null und wieder high wird?
Oder beim Sleepmode? Dieser muss ja bevor der Treiber beschrieben wird zu null werden um die alten Daten zu löschen, und muss dann immer auf high eingestellt sein.

Bitte um Hilfe O:)
************************************************** ******
$regfile = "2313def.dat"
$crystal = 1000000

Config Portb = Output

Dim Word0 As Long
Dim Word1 As Long

Motor Alias Portb.2
Strobe Alias Portb.3
Sleepmode Alias Portb.4

Word0 = &B0010000010000011101
Word1 = &B1001100011000010001

Strobe = 1
Sleepmode = 0
Waitus 1
Sleepmode = 1
Waitus 100
Strobe = 0
Waitus 1
Shiftout Portb.0 , Portb.1 , Word0 , 1 , 19 , 100
Waitus 1
Shiftout Portb.0 , Portb.1 , Word1 , 1 , 19 , 100
Waitus 1
Strobe = 1

Do
Toggle Motor
Waitms 500
Toggle Motor
Waitms 500
Loop

End
************************************************** ******

Schöne Grüße,
Martin

Ratber
13.02.2006, 14:27
Ja ich hab jetzt mal auf die Signale geehen und wenn ich nix überlesen hab dann stimmt das so.

Mal zum Testen das hier nehmen.



$regfile = "2313def.dat"
$crystal = 1000000

Config Portb = Output

Dim Word0 As Long
Dim Word1 As Long

Motor Alias Portb.2
Strobe Alias Portb.3
Sleepmode Alias Portb.4

Word0 = &B00100000100000111010000000000000
Word1 = &B10011000110000100010000000000000

Strobe = 1
Sleepmode = 0
Waitus 1000
Sleepmode = 1
Waitus 1000
Strobe = 0
Waitus 1000
Shiftout Portb.0 , Portb.1 , Word0 , 1 , 19 , 1000
Waitus 1000
Shiftout Portb.0 , Portb.1 , Word1 , 1 , 19 , 1000
Waitus 1000
Strobe = 1

Do
Toggle Motor
Waitms 500
Toggle Motor
Waitms 500
Loop

End

Zum einen hab ich die Pausen raufgedreht um sicher zu sein das der steppertreiber nicht einfach nur überrollt wird.
Später wenn alles läuft dann kannste an den Timings feilen.
Jetzt muß er erstmal laufen.


Im Datenblatt steht "Data is clocked into a
shift register on the rising edge of CLOCK signal." also interpretiere ich das als 1 oder 3 für die Option.
Da ich jetzt nicht weiß ob deine alte Zeile als MSB oder LBS genommen wird hab ich einfach auf die vollen 4 Bit aufgerundet und dein Bitmuster damit fest nach MSB geschoben.
Damit ist die Option erstmal auf 1 festgelegt.

Versuch das mal und berichte.


PS:
Der Treiber sieht interessant aus.
Wo gibts den ?

Riley
13.02.2006, 15:10
Den Treiber habe ich bei Farnell bestellt. Er wird aus dem Lager in den USA geliefert (20Euro Transportkosten). Der Chip selbst kostet nur 5Euro.
Es gibt natürlich auch andere Treiber welche einfacher handzuhaben sind, aber wie du schon gesagt hast ist dieser sehr interessant.
Das ist es ja warum ich diesen Treiber gewählt habe.

Es tut sich aber leider noch immer nichts.
Ich habe jetzt mal die Spannungen am Portb gemessen.

Die Spannung am Portb.4 - Sleepmode liegt immer bei 0V.
Sollte aber immer auf high liegen da ja sonst die Daten resetet werden.

Die Spannung am Portb.1 wechselt immer zwischen 0 und 2,5V.
Portb.1 sollte ja nur während des Datentransportes aktiv sein?!

Hardwaremäßig habe ich am Treiberpin Clock die Leitungen Portb.1 und Portb.2 zugeführt.
Hoffe das ist richtig so.

MfG
Martin

Ratber
13.02.2006, 17:20
Also die 2.5V gefallen mir ganz und garnicht.

Könnte sein das Bascom auch beim 2313 nicht alles unterstützt.
Hab die Portdefinition mal Alternativ eingestellt.

Apropos 2313:
Is doch nen 90S2313 und kein Tiny2313 oder ?


Zusätzlich hab ich die Stackdefinitionen dzugenommen.


Sieht jetzt so aus.



$regfile = "2313def.dat"
$crystal = 1000000

$hwstack = 32
$swstack = 20
$framesize = 40

'Config Portb = Output
Config Pinb.0 = Output 'Geht auch per ddrb aber erstmal Klare Sachen schaffen
Config Pinb.1 = Output
Config Pinb.2 = Output
Config Pinb.3 = Output
Config Pinb.4 = Output


Dim Word0 As Long
Dim Word1 As Long

Motor Alias Portb.2
Strobe Alias Portb.3
Sleepmode Alias Portb.4



Word0 = &B00100000100000111010000000000000
Word1 = &B10011000110000100010000000000000

Strobe = 1
Sleepmode = 0
Waitus 1000
Sleepmode = 1
Waitus 1000
Strobe = 0
Waitus 1000
Shiftout Portb.0 , Portb.1 , Word0 , 1 , 19 , 1000
Waitus 1000
Shiftout Portb.0 , Portb.1 , Word1 , 1 , 19 , 1000
Waitus 1000
Strobe = 1

Do
Toggle Motor
Waitms 500
Toggle Motor
Waitms 500
Loop

End




Den Treiber habe ich bei Farnell bestellt. Er wird aus dem Lager in den USA geliefert (20Euro Transportkosten). Der Chip selbst kostet nur 5Euro.
Es gibt natürlich auch andere Treiber welche einfacher handzuhaben sind, aber wie du schon gesagt hast ist dieser sehr interessant.
Das ist es ja warum ich diesen Treiber gewählt habe.

Ja,muß ich mal schauen.
Bei 20€ Extraporto ist das gut zu überlegen.

Riley
13.02.2006, 18:33
In Steckbrett steckt zurzeit ein ATTINY2313.
Dachte mir zum Herumprobieren ist er gut genug.
Kann es sein dass mit diesem Probleme auftreten?
Soll ich einen anderen verwenden (ATmega8 oder so)?.

SG
Martin

Ratber
13.02.2006, 23:20
Nö,brauchst keinen anderen zu nehmen aber die Zeile


$regfile = "2313def.dat"

Weist den Controller an für einen AT90S2313 zu Compilieren.

Du hats aber einen Tiny2313.
Der ist zwar der Nachfolger und weitgehends Kompatibel aber darauf sollte man sich nicht verlassen

Mach mal folgendes draus.


$regfile = "attiny2313.dat"

Riley
14.02.2006, 14:02
Ich habe jetzt trotzdem mal einen ATmega8 ins Steckbrett gesteckt.
Im Leerlauf hat der Controller 5V am Sleepmode Ausgang.
Aber wenn ich jedoch den Sleepmode Pin vom Treiber mit den des Controllers verbinde liegen am Ausgang des Controllers 0V an.

Werde nochmal die Schaltung am Treiber überprüfen.
Vielleicht habe ich ja auch die Wertigkeiten der einzelnen Bits nicht richtig eingestellt.

Was wäre denn dein Vorschlag für die zwei Wörter nur als Grundeinstellung. Also z.B. nur Vollschrittbetrieb?

Danke,
Martin

Ratber
14.02.2006, 16:15
Da hab ich jetzt noch nicht weiter reingelesen denn welche Modi du nutzen willst mußt du schon selber entscheiden.

Wie gesagt,es muß erstmal die Komunikation laufen damit es funktioniert.
Die restlichen Feinheiten um Halb/Vollschritt usw. kannste dann hinterher ausprobieren.
Bei Hlbschritt haste ne feiner Auflösung und beim Vollschritt mehr Halte/Drehmoment usw.