Forum: Mikrocontroller und Digitale Elektronik Signalgenerierung feiner abstufen


von Michael W. (wiebel42)


Lesenswert?

Also folgendes Problem:
Ich hab nach dem Appnote von Atmel: 
http://www.atmel.com/dyn/resources/prod_documents/doc8010.pdf
mir eine schöne Waveform gebastelt (32 Samples) und komme damit auf 
6*32=192 Samples pro Periode.
Das alles findet auf dem Butterfly (m169) statt. Die Endstufe übernimmt 
der schnöde Schrittmotortreiber L298N.
Timer1 (8-bit, phase correct) regelt Phase 1 (OCR1A) und 2 (OCR1B)
Timer2 (phase correct) übernimmt Phase 3. Wenn ich Timer0 anschalte geht 
nix mehr, aber ok.
Der Timer1_OVF regelt das abtasten der Lookuptable, soweit so gut.
Bei dieser abtastung hab ich einen verzögernden Zähler mit eingebaut der 
den Motor auf seine Drehzahl bringen soll, genau da ist aber das Problem 
ich starte mit dem Zähler bei $10 oder so und die bisher maximal 
erreichbare Frequenz war dann bei $04 erreicht, den Motor könnte ich 
sicher noch höher drehen ABER der Sprung von $04 nach $03 ist zu heftig 
(16MHz/(255*192)=327hz -> /4=82Hz -> /3=108Hz) da springt mir der Motor 
definitiv ab, wenn ich dazwischen noch andere Frequenzen fahren könnte 
würde er bestimmt mitkommen, die Frage ist nur wie. Meine bisherigen 
Lösungsansätze (und Hauptgegenargument):

- Samples reduzieren 32->16 -> 4-3 -> 8-6 ---> 8-7-6 also einen 
gewonnenen Zwischenschritt. Mein Signal gefällt mir aber eigentlich ganz 
gut so.
- Auflösung reduzieren 8bit->4bit -> /255 -> /16 da würde einiges gehen 
aber Timer2 kann sowas nicht.
- Die Abtastung mit Timer0 (CTC) regeln, klingt toll krieg ich aber 
leider nicht hin.

So, jetzt hoff ich mal auf euch, mir ist klar dass sowas eigentlich 
richtig geregelt gehört (Hall, Sensorless) aber erstmal will ich 
unbedingt so rumspielen. -wiebel

von nop(); (Gast)


Lesenswert?

Schau die mal n DDS an. zB eine Appnote oder ein Datasheet bei Analog 
Devices zB den AD9833 oder so. Das kann man in software nachbauen.

von Michael W. (wiebel42)


Lesenswert?

@nop()
Hmm, wenn ich das richtig sehe arbeitet ein DDS aber mit einem echten 
DAC, ich will eigentlich schon bei meinem PWM Ansatz bleiben, ich habe 
lediglich ein Problem mit der Frequenzanpassung, ein richtiger DDS (oder 
vielmehr 3) scheidet ohnehin aus, da ich kein Sinus habe sondern nur was 
Sinusartiges (0-120°->120°-0->0). Aber danke, ich werd mir das nochmal 
näher ansehen, auch wenn ich glaube die arbeiten auch mit einer INT 
skalierung somit hätte ich da das selbe Problem.

von ernst (Gast)


Lesenswert?

guck mal da:
http://www.myplace.nu/avr/minidds/index.htm

nur statt sinus eben deine wave-table rein...deeer test kostet dich fast 
nichts...

von Michael W. (wiebel42)


Lesenswert?

Das ist cool, werd ich mal im Auge behalten (für einen Signalgenerator), 
aber wie gesagt das würde mich 24 pins koste, das geht leider nicht. Ich 
will auf jeden Fall bei PWM bleiben. Trotzdem Danke -wiebel

[edit: Den ASM code werd ich auf jedenfall mal nach Tipps durchwühlen]

von nop(); (Gast)


Lesenswert?

Die Ausgabe der Werte ist sekundaer. Ob DAC oder PWM ist egal. Der Trick 
des DDS ist wie die Werte errechnet werden. Man hat einen Phasenraum, 
darin laeuft ein Addierer. Der Phasenraum is 2^N bit, zB n=32, dh. man 
hat einen 32 bit addierer, der jeweils eine konstante zu sich selbst 
addiert. Wenn er oben rum geht, war das eine Periode. Dieser Phasenraum 
wird nun nun durch eine shift-right division auf die Lookuptable der 
ausgebbaren Werte abgebildet. Der Bereich der ausgebbaren Werte ist 
natuerlich auch 2^M, zb M=6, dh 64 Werte pro periode.

von Michael W. (wiebel42)


Lesenswert?

Ah, jetzt verstehe ich, dann taste ich quasi mit einer 
Schwebungsfrequenz aus Soll- und Samplefrequenz ab, etwas seltsam 
ausgedrückt.

Bisher gehe ich durcht meine Tabelle so durch, also Schritt für Schritt, 
wenn ich euch jetzt richtig verstanden hab muss ich dann dringen auf 
eine direkte Addressierung umsteigen um dann eben jeden so und so 
vielten sample abzugreifen.

Ich habs noch nicht ganz umrissen, aber ich glaube, das ist genau wonach 
ich gesucht habe.

Werd das mal die tage versuchen umzusetzen (der ASM code von ernst ist 
glaub sehr ergiebig).

Vielen Dank an euch, auch wenn ich erst nicht verstanden hab. ;) -wiebel

von Michael W. (wiebel42)


Lesenswert?

Eine Schande das 256 nicht durch 3 teilbar ist, da muss ich mir erstmal 
noch was einfallen lassen da ich ja eigentlich 6 Phasen durchlaufe, aber 
das ist schonmal recht spannend. Dieses Jesper teil macht das ja über 
die main loop ich werd mal sehen ob ich das noch in meinen Timer1_ovf 
reinbekomme, Änderungen die schneller als meine PWM sind, sind ja eh 
unütz. Ok dann muss ich meine phasen gut im überblick halte, hoffentlich 
sind die vielen "cases" (branches) nicht am Ende zu langsam, naja ich 
jab ja 511 cycles Zeit, oder 256? Springt der Timer1_OVF oben und unten 
an im PWM modus, oder nur oben?

von Michael W. (wiebel42)


Lesenswert?

Ok, eine einfache Multiplikation der MSBs mit 192 müsste mir doch in R1 
was auswertbares bringen, dann noch mit 32/64/98/128/160 und brlo und 
subi, und schon bin ich wieder in meinen 6 Phasen.
Sorry wenn ich hier grade das Forum für meinen privaten Brainstorm 
missbrauche, aber es hilft mir beim denken, und vielleicht entdeckt ja 
auch jemand einen Fehler in meinen kruden Gedankengängen. ;) -wiebel

von nop(); (Gast)


Lesenswert?

Nein, nein. Das geht viel einfacher. Angenommen, der Phasenraum ist 
2^32, dh 0 bis 4 milliarden entsprechen 0 bis 2pi (360 Grad) dann ist 
der der erste Vektor X, der Zweite X+(2^32 /6), der Dritte X+2*(2^32 
/6), der Vierte X+3*(2^32 /6), der funfte X+4*(2^32 /6), und der sechste 
X+5*(2^32 /6), dann wir alles durch schieben nach rechts auf den 
Ausgaberaum abgebildet.

von Michael W. (wiebel42)


Angehängte Dateien:

Lesenswert?

STRIKE!! :D

Es läuft, hab zwar leider nicht ganz verstanden was du mir mit deinem 
letzten komment sagen wolltest, nop(), aber meine variante hat auch 
hingehauen. ;)
Ich kann nicht unmittelbar in meine Table abbilden, weil ich zwei Kurven 
drin hab (je U+V oder V+W oder W+U).

Ich häng spasseshalber mal mein superunaufgeräumten source code an.
Wenn ich ihn gesäubert hab, werd ich ihn nochmal posten. ;)

VIELEN DANK euch zwei.

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.