mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Signalgenerierung feiner abstufen


Autor: Michael Waiblinger (wiebel42)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also folgendes Problem:
Ich hab nach dem Appnote von Atmel: 
http://www.atmel.com/dyn/resources/prod_documents/...
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

Autor: nop(); (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael Waiblinger (wiebel42)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ernst (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Michael Waiblinger (wiebel42)
Datum:

Bewertung
0 lesenswert
nicht 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]

Autor: nop(); (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael Waiblinger (wiebel42)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael Waiblinger (wiebel42)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Michael Waiblinger (wiebel42)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: nop(); (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael Waiblinger (wiebel42)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.