PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Variable Frequenz erzeugen -> Atmega8



teslapower
08.11.2005, 01:07
Hi!

Habe ein Problem, bei dem ich zu noch keiner vernünftigen Lösung gekommen bin.
Ich möchte mit einem Atmega8(nat. in C oder ASM) per Poti eine Frequenz erzeugen und an einem Pin ausgeben.

Das soll so aussehen:

Poti: 0-100%
Freq:35-45Khz 50/50

Das Problem ist, dass es mir noch nicht gelungen ist mit nem Timer die Frequenz in akzeptabler Abstufung(sagen wir mal z.B. 100Khz) zu regeln.
Bin da den ganzen Tag recht verzweifelt! Vielleicht gibt es ja einen viel besseren Lösungsweg!
Würde mich sehr freun wenn mir jemand helfen könnte!!!

MFG und GN8 teslapower

Rage_Empire
08.11.2005, 08:16
Wie wärs den damit:

http://www.myplace.nu/avr/minidds/index.htm

SprinterSB
08.11.2005, 11:48
Über Poti und ADC bekommst du nen 10-bit Wert. Evtl muss das geglättet werde.

Timer1 in Mode 8 (evtl 9) als PWM sollte passen. Beim Hochzählen wird OC1x gesetzt und beim Runterzählen rückgesetzt. Frequenzbestimmend ist ICR1 und OCR1x = ICR1/2 gibt nen Duty von 50%. Die Auflösung sollte F_OSC/4 sein für die Frequenz f und F_OSC/8 für den Duty, bei F_OSC = 1MHz wärst du dann bei 250kHz Auflösung für f.

teslapower
08.11.2005, 12:42
Danke erstmal.

@SprinterSB:
Ähh, was hat denn ICR damit zu tun? Ich dachte das ist zum zählen mit externem Trigger?
Es müsste doch heißen OCR1 = TCNT1 1/2 oder?
Kann man die Auflösung nicht erhöhen? (f=8Mhz)?
Es sollte schon mindestens 100Khz sein, besser noch genauer!

MFG teslapower

SprinterSB
08.11.2005, 12:53
Mega8 arbeitet bis 16MHz oder 8MHz bei internem RC-Oszi, damit wären es geschätzte 4MHz resp. 2MHz Auflösung für f.

Mega8 Manual pp. 97:
Mode #8: PWM, Phase and Frequency Correct, TOP=ICR1

Die Timer-Frequenz ist proportional f_OSC. Als Faktor kann noch ein prescale-Wert dazu kommen.

teslapower
08.11.2005, 13:37
Was ist denn dann eigentlich der Unterschied zwischen den beiden Modi 8&9, außer das ein anderes Register verwendet wird???

Der Rest ist mir klar, aber wie löse ich jetzt mein Problem?
Von Hand mit Schleifen? Nicht sehr schön!

MFG teslapower

teslapower
08.11.2005, 13:44
Moment, kann es sein dass ich mit 8 MHz nur ca.250Khz Auflösung hinbekomme, egal wie? Is mir grad beim rechnen so aufgefallen. Stimmt das?
Bin schon wieder total verwirrt ](*,)

SprinterSB
08.11.2005, 15:42
Bei einem prescale von 1 zählt der Timer um 1 hoch/runter pro 1 Clocktakt. Bei 8MHz also mit 8MHz. Durch den Wechsel von Hoch-/Runterzählen kommt noch der Faktor 1/2 dazu und wir sind bei 4MHz für f.

Für eine Aufdröselung der einzelnen PWM-Modi ist das Manual sehr ausführlich. Wie die PWM sich verhält, wenn TOP (ICR1) und OCR1x geändert werden, ist da auch ersichtlich. Dummerweise kannst du die nicht gleichzeitig ändern, aber die Änderung der Werte dürfte nicht allzu groß sein, denn du schraubst ja per Hand am Poti.

Programmtechnisch würd ich den ADC-IRQ nehmen und dort die Werte neu setzen. Über ne Schleife geht auch, falls du Probleme hast den IRQ korrekt zu bedienen.

Die Genauigkeit des ADC ist mit 10bit um den Faktor 64 kleiner als die Auflösung vonTimer1. Bei einer Bandbreite von nur 10kHz würde das für ne Genauigkeit von rund 10MHz ausreichen.

Ein ADC-Wert von 2^9 soll bei etwa 40kHz landen, was einem T von 25µs entspricht und ICR1 = 100 bei 8MHz (oder 200?). Ein Inkrement weiter bei ICR1=101 ist T=25µs + 1/4MHz, was etwa 39604Hz entspricht.

Der Zusammenhang zwischen ADC-Wert und f ist dann umgekehrt proportional. Ich hab's jetzt nicht genau durchgerechnet, wie die Auflösung in Anhängigkeit von f ist, aber ich fürchte, das es weniger genau ist, als ich oben geschrieben habe :-b

teslapower
08.11.2005, 19:08
Hab da mal schnell ne recht sinnfreie Tabelle gemacht.
Das hieße von 35 auf 40 Khz habe ich nur 15 Stufen!
Ist doch richtig so oder?

SprinterSB
08.11.2005, 23:25
Pi mal Daumen scheint das hinzukommen. Einzeln Nachrechenn tu ich das nicht.

Was mich stutzig macht ist, daß Faktor eine Konstante ist. Bei nem Reziproken Zusammenhang kann das nicht sein, das wär der Fall bei was geometrischen bzw exponentiellem.

Die Auflösung kannst du verdoppeln, wenn du mit Quarz/Keramik auf 16MHz gehst. Ne weitere Verdopplung sollte durch einen anderen PWM-Mode möglich sein, der nur hochzählt. Aber das ist dann u.U nicht mehr 'frequency correct'. Ich weiß ja nicht wie deine Ansprüche an das Signal sind bei Frequenzänderung, ob da ein kurzer Hubbel erlaubt ist.

Ne Verdopplung geht evtl auch indem du sowohl OC1A und OC1B verwendest und die über ein XOR-Gate zusammenführst.

Dann gehen mir erst mal die Ideen aus...

Oder wie wär es mit einem richtigen spannungsgeführten Oszillator mit nem NE555, da fällt zudem das Proggen weg und ist billliger.