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
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.
@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.
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...
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]
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.
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
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?
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.