Forum: Mikrocontroller und Digitale Elektronik Frequenzgenerator einstellbar


von Jens S. (neo2)


Lesenswert?

Okay, einfache Sache für euch! Ihr werdet lachen.
Ich bin recht neu in der µC-Szene und habe auch das Lernpaket von 
Franzis durchgearbeitet. Ich tu mich aber jetzt mit meinem 1. Projekt 
relativ schwer

Das Projekt:
Zwei baugleiche Motoren ansteuern mit einem Taktsignal (kein PWM 
notwendig). Im Datenblatt wird ein Taktsignal gefordert 800 - 3500 Hz.
damit soll ich den Motor zwischen 0 - 4000 U/min regeln können. Soweit 
so gut. Hab ich mir aus dem Lernpaket ein Blinkprogramm geschnappt

1
;Blink2.asm Blinker mit Unterprogramm
2
3
      .include "tn13def.inc"
4
5
rjmp Anfang
6
Anfang:
7
    sbi   ddrb,3      ;Datenrichtungsbit 
8
9
      ldi   r16,0x18    ;PB4 und PB4
10
      out   ddrb,r16    ;Datenrichtung
11
Schleife:
12
      ldi   r16,8       ;8 = 0x08
13
      out   portb,r16   ;PB3 = 1, PB4 = 0
14
      rcall Warten      ;Unterprogrammaufruf
15
      ldi   r16,16      ;16 = 0x10
16
      out   portb,r16   ;PB3 = 0, PB4 = 1
17
      rcall Warten      ;Unterprogrammaufruf
18
19
rjmp  Schleife
20
21
Warten:  
22
      Ldi   r16,255      
23
Warten1:                ;äußere Schleife
24
      Ldi   r17,255
25
Warten2:                ;innere Schleife
26
      dec   r17
27
      brne  Warten2
28
      dec   r16
29
      brne  Warten1 
30
      ret               ;Rücksprung
Das Beispiel ist nur ersteinmal für einen Motor, damit ich das besser 
nachvollziehen kann.



Jetzt kann ich mit per Hand die Werte der Schleifen neuprogrammieren und 
damit meinen Takt generieren --> funktioniert im groben!

Wie kann ich das ganze jetzt mit einem Poti steuern?
ich kann doch den µC einfach mit 8-Bit Auflösung den Wert der Äußeren 
Schleife einstellen lassen, oder? Wenn ja, wie schreib ich das?

Danke schon mal

Jens

von A. Tainie (Gast)


Lesenswert?

Indem zuerst der AD-Wandler konfiguriert wird. Dazu nach der Zeile:
"Anfang:"

die AD Wandler Register ADMUX und ADCSRA setzen:

z.B.:

ldi  r16,(0 << REFS1) | (0 << REFS0) | (1 << ADLAR) | (1 << MUX1) | (1 
<< MUX0) | 0;
out  ADMUX,r16  ; Vcc als Referenz, Ergebnis linksbündig, ADC3 PB3 Pin 2



ldi  r16,(1 << ADEN) | (1 << ADPS1) | (1 << ADPS0) | 0;
out  ADCSRA,r16  ; AD Enable, Prescaler 8 -> 1MHz/8=125kHz


dann innerhalb der Schleife den Wandler aufrufen:

sbi   ADCSRA,ADSC  ; AD Wandler starten (single conversion)

AD_loop:   sbic  ADCSRA,ADSC  ; warten, bis der ADC fertig ist
rjmp  AD_loop

und dann in der äußeren Schleife anstatt: Ldi r16,255 das Wandler 
Ergebnis nach r16 kopieren:
mov r16,ADCH

von Klaus D. (kolisson)


Lesenswert?

Jens S. schrieb:
> Das Projekt:
> Zwei baugleiche Motoren ansteuern mit einem Taktsignal (kein PWM
> notwendig). Im Datenblatt wird ein Taktsignal gefordert 800 - 3500 Hz.

recht unlogischer Satz , oder ?
Kein PWM , aber Taktsignal gefordert 800 - 3500 Hz ... mhhh
Was soll es bedeuten , dass ich so traurig bin ?


Gruss k.

von Jens S. (Gast)


Lesenswert?

Danke Claus de lisson, dass du einen Anfänger so herzlich begrüßt und 
sofort nieder machst.

Hab jetzt meinen Code angepasst: btw ist für einen ATtiny13 (hatte ich 
vergessen zu erwähnen, daher gibt es kein REFS1 hab ich mich belesen)

1
;Blink2.asm Blinker mit Unterprogramm
2
3
      .include "tn13def.inc"
4
    .def A =r16
5
    .def B =r17
6
7
rjmp Anfang
8
  
9
Anfang:
10
    ldi  A,(0 << REFS0) | (1 << ADLAR) | (1 << MUX1) | (1<< MUX0) | 0;
11
    out  ADMUX,A    ; Vcc als Referenz, Ergebnis linksbündig, ADC3 PB3 Pin 2
12
    
13
      sbi   ddrb,4    ;Datenrichtungsbit
14
      out   ddrb,B    ;Datenrichtung
15
16
  ;ADC
17
    ldi  A,(1 << ADEN) | (1 << ADPS1) | (1 << ADPS0) | 0;
18
      out  ADCSRA,A  ; AD Enable, Prescaler 8 -> 1MHz/8=125kHz
19
20
AD_loop:   
21
    sbic  ADCSRA,ADSC  ; warten, bis der ADC fertig ist
22
    rjmp  AD_loop
23
24
Schleife:
25
      ldi   B,0       ;alle aus
26
      out   portb,B   ;PB4 = 0
27
      out   ddrb,B
28
      rcall Warten     ;Unterprogrammaufruf
29
      ldi   B,0x10    ;16 = 0x10
30
      out   portb,B   ;PB4 = 1
31
    out   ddrb,B
32
33
    sbi   ADCSRA,ADSC ;AD Wandler starten (single conversion)
34
      rcall Warten      ;Unterprogrammaufruf
35
36
rjmp  Schleife
37
38
Warten:  
39
      in   A,ADCH      
40
Warten1:                ;äußere Schleife
41
      Ldi   B,2
42
Warten2:                ;innere Schleife
43
      dec   B
44
      brne  Warten2
45
      dec   B
46
      brne  Warten1 
47
      ret               ;Rücksprung

leider nimmt er bei
1
Warten:  
2
      in   A,ADCH  ;<----hier

den mov befehl nicht. (Invalid register) da hab ich es mit in gemacht, 
so wie im Lernpaket beschrieben.
Leider macht das Programm immernoch nicht, was es machen soll.
Was kann ich tun?

von Jobst M. (jobstens-de)


Lesenswert?

Klaus De lisson schrieb:
> recht unlogischer Satz , oder ?
> Kein PWM , aber Taktsignal gefordert 800 - 3500 Hz ... mhhh
> Was soll es bedeuten , dass ich so traurig bin ?

Nein, es ist nicht unlogisch. Ein Taktsignal muß nicht unbedingt mit 
einer PWM versehen werden.

Er braucht lediglich eine von 800-3500Hz einstellbare Frequenz.
Ich denke, DDS ist hier eine gute Lösung.

Vielleicht solltest Du Dich auch mit dem Timerinterupt anfreunden.


Jens S. schrieb:
> leider nimmt er bei [...] den mov befehl nicht.

Logisch. MOV ist nur für die Register R0 - R31.
Warum es bei den AVRs zig verschiedene Befehle für das kopieren von 
Daten gibt, ist mir auch nicht klar. Sowas ist in meinen Augen die 
Aufgabe des Assemblers. Beim 8051 ging das auch. Aber wir müssen nun 
damit leben.



Gruß

Jobst

von Klaus D. (kolisson)


Lesenswert?

Jens S. schrieb:
> Danke Claus de lisson, dass du einen Anfänger so herzlich begrüßt und
> sofort nieder machst.

Das war nicht negativ gemeint . Es ging hier mehr darum, dich 
anzustacheln
etwas klarer zu reden. Manchmal nennt sich das dann auch Nettiquette.

wenn du schreibst:
"Das Projekt:
Zwei baugleiche Motoren ansteuern mit einem Taktsignal (kein PWM
notwendig). Im Datenblatt wird ein Taktsignal gefordert 800 - 3500 Hz.
damit soll ich den Motor zwischen 0 - 4000 U/min regeln können."

ist das nach meinem Empfinden ein logischer Kurzschluss.

Für mich ist es nach wie vor unklar, wie man zwei baugleiche Motoren
ohne PWM , jedoch mit einem Taktsignal auf geforderte 800-3500Hz bringt,
wo man es doch von 0 bis 4000 U/Min regeln kann.

Das einzige sinvolle , was mir gerade dazu einfällt, ist:
"Division durch Null ist verboten"

Gruss k.

von Tim (Gast)


Lesenswert?

Hallo Jens und Klaus,

Und was ist wenn er Motoren mit eingebauter Steuerung hat ?

Die bekommen dan am Takt-In einfach einen Takt, Impuls/Pause 50/50 und 
die Frequenz beeinflusst dann die Motorgeschwindigkeit. Da ist PWM 
Wurst, udn würde mehr stören als etwas nützen!

Da hat Jens S. mit seiner Aussage keinen Fehler begangen. Kann er was 
dafür das du es nicht verstehst ?

Klaus, du solltest vorher überlegen, und dann den Mund aufmachen.... 
tz... solche Leute....

Schöne Grüße Jens !

LG Tim

von Frank D. (Gast)


Lesenswert?

Hallo Jens,
ich habe mir auch das Lernpaket für Mikro's von franzis (Kainka) 
zugelegt. Gefällt mir gut! Willkommen im Club ;-)
Zwar kann ich dir nicht viel zur Programmierung sagen (nicht mehr als Du 
schon weißt), aber ich verstehe ein bischen was von Elektronik.

> Das Projekt:
> Zwei baugleiche Motoren ansteuern mit einem Taktsignal (kein PWM
> notwendig). Im Datenblatt wird ein Taktsignal gefordert 800 - 3500 Hz.
> damit soll ich den Motor zwischen 0 - 4000 U/min regeln können. Soweit
> so gut. Hab ich mir aus dem Lernpaket ein Blinkprogramm geschnappt.

Da wäre mal ein Schaltbild gut. Du willst beide Motoren an einem Ausgang 
betreiben, richtig?

@Klaus de lisson:
> recht unlogischer Satz , oder ?
> Kein PWM , aber Taktsignal gefordert 800 - 3500 Hz ... mhhh
> Was soll es bedeuten , dass ich so traurig bin ?

Das ist nicht unlogisch; zwar setzt eine PW-modulation eine Frequenz 
vorraus, jedoch wird bei der Modulation das Puls/Pausen-Verhältnis 
geändert, oder eben die PulsWeite, wie der Name schon sagt und nicht die 
Frequenz.

> Jetzt kann ich mit per Hand die Werte der Schleifen neuprogrammieren und
> damit meinen Takt generieren --> funktioniert im groben!

Funktioniert im Groben? Heißt das, das der Motor so vor sich hin 
`rüttelt'?
Was ist das für ein Motor? Kannst Du die Bezeichnung oder das Datenblatt 
posten? Wenn es ein Schrittmotor ist, wir er mehr als nur zwei 
Anschlüsse haben, die Du dann der Reihe nach anssteuern mußt. Das wäre 
mit dem Franzis-Paket (genauer mit dem ATTiny13) dann quasi ein 
Lauflicht :-).
Ich kenne nur einen Motor der zwei Anschlüsse hat (also wie ein 
gewöhnlicher Gleichstrommotor) und gepulst  wird.....wenn ich falsch 
liege lasse ich mich gern belehren :-).

> Wie kann ich das ganze jetzt mit einem Poti steuern?
> ich kann doch den µC einfach mit 8-Bit Auflösung den Wert der Äußeren
> Schleife einstellen lassen, oder? Wenn ja, wie schreib ich das?

Daran bastel ich auch; ich habe eine ähnliches kleines Projekt. Ich 
nehme anstelle eines Potis aber einen Inkrementalgeber...

Schöne grüße und nicht unterkriegen lassen...

Frank

von Jens S. (Gast)


Lesenswert?

Okay okay, ich hab wohl ein paar Infos zu wenig durchgegeben:

also der Motor ist aus einem Kopierer ( 
http://www.nidecamerica.com/admtypem/40m58m.pdf ) <-- Datenblatt
Ich habe den 50M.

Mit diesem Motor will ich einen kleinen elektronischen Wagen bauen, der 
eben durch unterschiedliche Drehzahlen rechts & links lenkt.
Die Drehzahl soll halt über je 1 Poti gesteuert werden (wie beim 
Panzer). links weniger U/min ist eben eine links Kurve.

Die Ansteuerung steht auf der Letzten Seite. Mehr Infos habe ich leider 
nicht.

An dem Motor sind auch keine 9 Pins sondern nur 7. 24V+  24V-  5V+ / 
5V- Start-Stop  Lock Drive / Clock

und mit Clock wollte ich die Drehzahl regeln (dachte ich)

von Jens S. (Gast)


Lesenswert?

macht euch auch kein sorgen um eine gescheite Übersetzung, Getriebe hab 
ich mit ausgebaut und macht auf Radumfang gerechnet 4,8km/h also ein 
gemütliches Laufen. perfekt eigentlich

von Klaus D. (kolisson)


Lesenswert?

Hallo jens,
schön, dass du nun auch mal Fakten geliefert hast.
Wenn du allerdings dieses ganze Modul hast, ist es doch schonmal sehr
toll für dich.

Wo, in dem Datenblatt steht etwas von (minus) -24V ?
Das schreibst du ja.

Hast du mal probiert mit einem Frequenzgenerator an Pin7 = Clk In
eine Frequenz vorzugeben ?

Gruss Klaus

von spess53 (Gast)


Lesenswert?

Hi

>Zwei baugleiche Motoren ansteuern mit einem Taktsignal (kein PWM
>notwendig). Im Datenblatt wird ein Taktsignal gefordert 800 - 3500 Hz.
>damit soll ich den Motor zwischen 0 - 4000 U/min regeln können.

Und wo hast du das aus dem Datenblatt heraus gelesen?

Dort steht Drehzahl 1000-4000 rpm und Clock in: rpm = 60 fclk/50

MfG Spess

von Jens S (Gast)


Lesenswert?

ein wenig Mathe. rpm, also die Drehzahl ist 1000. alles nach Fclock 
umgestellt komme ich auf 833 Hz. Wenn man das so rechnen kann

von Jens S (Gast)


Lesenswert?

Klaus De lisson schrieb:
> Wo, in dem Datenblatt steht etwas von (minus) -24V ?
> Das schreibst du ja.
>
> Hast du mal probiert mit einem Frequenzgenerator an Pin7 = Clk In
> eine Frequenz vorzugeben ?


Schuldige mein Fehler. ich meinte mit dem 24- Masse und auch bei 5- ist 
je GND gemeint. An den Polen kommt eine Gleichspannung ran mit den 
jeweiligen Masse anschlüssen.

Ich habe mir bereits mit einem NE555 geholfen und da verschiedene 
Frequenzen angelegt. aber nichts. Ich habe die Bereiche von 1000Hz 
-20kHz angelegt jeweils Tastverhältnis 50/50 aber nichts passiert.

Da muss aber was nicht stimmen, da ja mein Blinkprogramm den Motor zum 
Laufen gebracht hat. Ich schließ den am Wochenende nochmal an und 
versuche es nochmal

von spess53 (Gast)


Lesenswert?

Hi

Deswegen werden aus 800Hz trotzdem keine 0 rpm.

MfG Spess

von Frank D. (Gast)


Lesenswert?

> Da muss aber was nicht stimmen, da ja mein Blinkprogramm den Motor zum
> Laufen gebracht hat. Ich schließ den am Wochenende nochmal an und
> versuche es nochmal

Tatsächlich nicht; ich verstehe die Formel aus dem DatenBlatt auch so, 
d.h. 1000-4000 RPM würden einer Frequenz von 833 bis 3333Hz entsprechen.
Verwirrend finde ich das was auf der ersten Seite von >PWM ODER PLL 
Speed Control Options< geschrieben steht.
@Klaus....am Ende doch PWM ? ;-)
Aber das trifft wohl nur auf die interne PLL Geschwindigkeitsregelung 
zu. Vielleicht stimmt das Datenblatt nicht 100%ig mit Deinem Motor 
überein, zumal der nur 7 Anschlüsse hat, alle im Datenblatt aber 9.
Es fehlen Speed-Lock und der Tacho Impuls. Das kann heissen das die vom 
Motor gemachten Steps nicht so wichtig für die Genauigkeit/Steuerung des 
Kopierers waren. Denkbar wäre das dieser Motor nur mit einer Frequenz 
angesteuert wurde. Ein Service Mannual vom Kopierer wäre da hilfreich, 
dann weißt Du es genau.
Ein paar Sachen kannst Du noch checken:

-Pin 5 muß auf High Level (5V)
-Pin 7 Frequenz 1000-3000Hz, (Rechteck,Vss Level ebenso 5V)

-Was hast Du für ein 24V Netzteil? Der Motor kann bei max Last bis zu 6A 
ziehen. Aber auch im Leerlauf kann ein Schrittmotor einiges an Strom 
verbrauchen.

-was ist mit Pin 6? Das sollte eigentlich clockwise/counterclockwise 
sein. Du schreibst aber >lock drive<.

gruß

von Jobst M. (jobstens-de)


Lesenswert?

Die Anschlussbelegung für PWM haben die im Datenblatt glatt erst mal 
'vergessen' ...

Wie ist deren Motto? 'All for Dreams'?
Was das wohl für Träume sein mögen ...


Gruß

Jobst

von Jens S. (Gast)


Lesenswert?

danke für eure Bemühungen. Ich habe das ganze Thema verworfen und eine 
PWM-Schaltung mit NE555 gebaut und einem BUZ11 + Kühlkörper (siehe 
http://www.atx-netzteil.de/schaltungen-elektronikseite/pwm_mit_ne555_und_mosfet_schaltplan.GIF 
)

Als Motor nehme ich jetzt einen Scheibenwischermotor mit max. 6A bei 
Volllast. Hat in meinen Versuchen super funktioniert. Vorwärts und 
Rückwärtsdrehung kann so auch einfach realisiert werden.
Schaltung funktioniert soweit wunderbar.

Danke für die Mühe. Ich werde den Motor bei der nächsten Gelegenheit 
genauer Untersuchen und deinen Tipp Frank Denke checken

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.