Forum: Mikrocontroller und Digitale Elektronik Atmega 2-Kanal Rechteckgenerator gesucht


von Dj E. (djelko)


Lesenswert?

Hallo, Leute!

Momentan bin ich auf der Suche nach einem ATmega-Rechteckgenerator;
folgende Parameter sollten von der Schaltung erfüllt werden:

 - 2 Kanäle, seperat einstellbar
 - 0,1Hz bis 200Khz (nur ein Richtwert)
 - 0-100% Pulsweite
 - Lcd-Ausgabe
 - Frequenzeinstellung mittels Taster und/oder Potis
 - geschrieben in C (oder Bascom)

Kennt jemand evtl. einen Link zu einem solchen Signalgenerator?
Diesen habe ich auch schon aufgebaut, aber leider hat er nur einen Kanal
und keine einstellbare Pulsweite:
Beitrag "Einstellbarer Frequenzgenerator für 0.12 Hz - 8 MHz mit Atmega 8 und Bascom"

Ist es überhaupt mit vertretbarem Programmieraufwand möglich,
einen solchen Generator zu bauen?

Eine Alternative wäre es, diesen Generator 2x aufzubauen,
wobei er in Assembler geschrieben ist,
man dann 2 Displays brauchen würde und
nur eine grobe Frequenzeinstellung (1024 Schritte) möglich wäre:
http://www.avr-asm-tutorial.net/avr_de/rechteckgen/rectgen_m8.html

Ein Ausgangsverstärker ist ersteinmal nicht wichtig;
es geht mir vorerst nur um den Steuerteil.

Vielen Dank im Voraus!
Gruß, DjElko.

von Julian B. (zitrone18)


Lesenswert?

Hey DjElko,

bastel dir das Teil selbst dürfte auch nicht viel Aufwand sein.

Für LC-Displays gibt es nen Haufen Bibliotheken.

Wie man nen Taster am Eingang ausliest ist auch häufig beschrieben.
Wenn du ein Poti verwenden willst benutzte nen ADC-Eingang.

Die Berechnung für die PWM und die Ausgabe kannst du dem gcc Tutorial 
entnehmen.

Die Platine kann man fix von Hand löten mit vernünftig großen Bauteilen 
auf nem Lochraster.

Spannungsversorgung über 5V Netzteil z.B. und 3 Kabel für Kanal1, Kanal2 
und Masse.

Der Aufwand der Programmierung dürfte überschaubar sein.

So als Vorschlag:
- ATMega8
- 16Mhz dran
- Anschluss für Programmierung
- Display
- Taster / Poti
- Netzteil
- Kabel basteln

fertig :)

Gruß,
Zitrone

von Mr. Tom (Gast)


Lesenswert?

Dj Elko schrieb:
> - 0,1Hz bis 200Khz (nur ein Richtwert)
>  - 0-100% Pulsweite

Du solltest auch noch verraten, welche Auflösung du für die Pulsweite 
brauchst, weil die zusammen mit der Maximalfrequenz den Basistakt 
bestimmt.

Und wenn du von Schaltung redest: Hast du irgendwelche Anforderungen an 
die Ausgangsamplitude?

von Dj E. (djelko)


Lesenswert?

Danke für die schnellen Antworten!

Julian B, ich habe schon versucht, einen solchen Generator zu bauen,
aber leider habe ich es noch nicht geschafft bzw. weiß nicht,
wie ich die Frequenz / Pulsweite einstellen soll, ohne die 
Frequenzausgabe zu ruinieren (Timer-Interrupt mit LCD-Ausgabe = :-C )

Mr. Tom, es sind keine besonders hohen Anforderungen bezüglich der 
Pulsweite erforderlich; 0.5%-Schritte wären vollkommen ausreichend,
1% wären auch noch OK.
Um die Ausgangsamplitude werde ich mich später kümmern; vorerst reicht 
der direkte AVR-Ausgang vollkommen aus.

von Mr. Tom (Gast)


Lesenswert?

Dj Elko schrieb:
> 0.5%-Schritte wären vollkommen ausreichend, 1% wären auch noch OK.
Bei 200kHz brauchst du dann einen Basistakt von mindestens 40..80 MHz.

Vergiß den ATmega

von Dj E. (djelko)


Lesenswert?

Mr. Tom, wie hat er das denn dann hinbekommen:
http://www.avr-asm-tutorial.net/avr_de/rechteckgen/rectgen_m8.html
Nichts für ungut, aber ich denke, es steckt ein Denkfehler dahinter...
1024 Schritte sind da bei 0,25Hz bis 8MHz möglich... (???)

von ./. (Gast)


Lesenswert?

Die PIC16F160x haben einen NCO (Numerical Controlled Oscillator).
Bei 16 MHz Takt reicht der etwa bis 500 kHz.
Die ausgegebene Frequenz ist linear zum (16 bit-)Steuerwort.
Die ausgegebene Pulslaenge ist in "gewissen" Grenzen einstellbar.
Naeheres verraet das Datenblatt.

Fuer 2 Kanaele muss man dann wohl 2 davon nehmen.
Der 2. darf dann ja auch ein gaaanz kleiner sein.

Fuer die Erzeugung von Pulsen bieten sich sonst auch die R8C13 von 
Renesas mit ihren sehr flexiblen Timern an.

Auch hier kann ein Blick ins Datenblatt nicht schaden.

von holger (Gast)


Lesenswert?

>1024 Schritte sind da bei 0,25Hz bis 8MHz möglich... (???)

Bei 8MHz Ausgang hat der keine 1024 Schritte für eine PWM mehr.
In OCR muss dazu eine 0! rein. Das Tastverhälnis ist dann auch fix 50%.
Da kannst du nichts mehr verstellen.

von Dj E. (djelko)


Lesenswert?

./., leider kann ich bisher (wegen eines fehlenden Programmers) keinen 
PIC programmieren...
Allerdings besitze ich immerhin einen PIC16F876A :-D (ist ja schonmal 
etwas)

Holger, jetzt verstehe ich es. Klar; es wäre nicht schlimm, wenn man bei 
solch hohen Frequenzen (>100Khz) die Pulsweite nur bedingt (oder 
garnicht) einstellen könnte.

von ./. (Gast)


Lesenswert?

Tippfehler:
Es muss richtig PIC16F150x heissen.

von Carsten R. (kaffeetante)


Lesenswert?

Alles zusammen auf einen Chip zu bekommen könnte etwas schwer werden. 
Das hängt vom Display ab, wieviele Pins es fordert und ob dort schon ein 
Controller vorhanden ist. Es gibt AVRs mit LCD-Controller und es gibt 
AVRs mit integrierter PLL, die intern auf 64 MHz für die Timer 
hochkommen und somit mit bis zu 250 kHz auf 8 Bit genau laufen können. 
Spontan fallen mir da die ATTiny2545/85 ein. Ich glaube inzwischen gibt 
es aber schon mehr Typen die das können.

Da die Taktteiler nicht beliebig wählbar sind muß man aber entweder den 
Takt variieren oder die obere Zählgrenze des Timers wenn man (fast) 
beliebige Frequenzen haben will. Letzteres hat zur Folge, daß die 
Unterteilung des Dutycycles der PWM nicht einheitlich bleibt.

Wie wäre es mit einem AVR der das Display steuert und einem diskret 
aufgebautem PWM-Generator, dessen Frequenz vom AVR erfaßt und angezeigt 
wird? Das geht rcht einfach über die Capture-Funkion im Timer oder "zu 
Fuß". Der PWM-Generator würde dann entweder mit Drehpoti gesteuert oder, 
wenn es digital über den AVR laufen soll, über einen digitalen Poti, DAC 
oder einer anderen Hilfskonstruktion.

von Dj E. (djelko)


Lesenswert?

Hmmm...
Also ist es nicht so ohne weiteres möglich, EINEN Avr als 2-Kanal 
Frequenzgenerator zu benutzen?

von Peter D. (peda)


Lesenswert?

Du kannst den ATmega1284 nehmen, der hat 2 16Bit-Timer. Damit kannst Du 
2 getrennte Frequenzen/Tastverhältnisse erzeugen.

Dj Elko schrieb:
> (Timer-Interrupt mit LCD-Ausgabe = :-C )

Witz komm raus, du bist umzingelt.
LCD niemals im Interrupt!

von Dj E. (djelko)


Lesenswert?

Aha!
Also ist es ohne größeren Aufand mit dem ATmega1284 möglich, einen 
2-Kanal-Funktionsgenerator zu bauen?
Dann werde ich mir den in Zukunft kaufen...
Der Atmega48 hat nicht zufällig auch 2x16bit-Timer?

von Dennis (Gast)


Lesenswert?

Guck doch nach

von Dj E. (djelko)


Lesenswert?

Nein, hat er nicht...
Warum kann man keinen 8bit-Timer nutzen?

von cppler (Gast)


Lesenswert?

Was hindert Dich daran den Code von Deinem Beispiel auf beide Ausgänge 
des Mega88 16bit Timers umzusetzen ?
DDS ist mächtig und es gibt hier auch einen Artikel darüber:
http://www.mikrocontroller.net/articles/DDS

von Mr. Tom (Gast)


Lesenswert?

Dj Elko schrieb:
> Nichts für ungut, aber ich denke, es steckt ein Denkfehler dahinter...

Wie soll das funktionieren?

Bei 200kHz dauert eine Periode des Signals 5µs. Um dann den Duty-Cycle 
auf 0.5% einzustellen, muss man die Dauer also in Schritten von 25ns 
festlegen können und schon ist man bei 40MHz. Das wird kniffelig mit 
einem ATmega.

von Carsten R. (kaffeetante)


Lesenswert?

Dj Elko schrieb:
> Also ist es ohne größeren Aufand mit dem ATmega1284 möglich, einen
> 2-Kanal-Funktionsgenerator zu bauen?
> Dann werde ich mir den in Zukunft kaufen...
> Der Atmega48 hat nicht zufällig auch 2x16bit-Timer?

Zur ersten Frage:

Ja. Aber nicht mit einer mit eine 0,5% Abstufung im Dutycycle bei 200 
kHz. Dafür brauchst Du, wie es Dir vorgerechnet wurde, 40 MHz Takt, oder 
Du mußt, wie Du es selbst schon gesagt hast, bei höherem Takt mit einer 
gröberen Auflösung leben. Ferner wird das Funktionssignal effektiv durch 
Division aus dem Prozessortakt erzeugt, bestimmt durch Vorteiler 
(prescaler) und oberer Zählgrenze. Du mußt also Takt und/oder Teiler 
Variieren um den gewünschte Funktionsfrequenz anzunähern. Ein Senken der 
Zählgrenze senkt natürlich auch die Möglichkeit den Dutycycle 
Abzustufen. Das Problem ist aber generell vorhanden wenn man für so 
etwas Timer beutzt.

Zur zweiten Frage:

Was willst du mit den 16-Bit-Timern? Die brauchen 65536 Takte bis die 
durch sind. Das ist eine erheblich feinere Abstufung als die eingangs 
geforderten 200 Schriit (0,5 %), Das sind grob 15,25 Hz pro MHz 
Prozessortakt die der Timer schafft. Da ist selbst bei 20 MHz bei knapp 
oberhalb von 300 Hz beim erzeugten Signal Schluß.

Dj Elko schrieb:
> Hmmm...
> Also ist es nicht so ohne weiteres möglich, EINEN Avr als 2-Kanal
> Frequenzgenerator zu benutzen?

Doch, möglich ist es schon. Nur sind hier und da Kompromisse fällig. Wie 
genau muß es denn wirklich sein? brauchst du immer 0,5 % Schritte? Oder 
darf es auch mal 0,637 % und bei einer anderen Frequenz 0,832 % sein? 
Ansonst mußt du den Prozessortakt variieren.

Ein Timer ist kein vollwertiger beliebig konfigurierbarer 
Funktionsgenerator. Dafür gibt es Spazial-ICs oder man baut es selbst 
diskret auf. Muß der Einstellbereich wirklich sauber bis an 0 und 100% 
heran laufen? Bei manchen einfachen diskreten Lösungen könnte es nahe 0% 
und 100 % etwas ungenau bei der Schrittweite werden.

Dj Elko schrieb:
> http://www.avr-asm-tutorial.net/avr_de/rechteckgen/rectgen_m8.html
> Nichts für ungut, aber ich denke, es steckt ein Denkfehler dahinter...
> 1024 Schritte sind da bei 0,25Hz bis 8MHz möglich... (???)

Das scheint etwas unglücklich formuliert in dem Projekt. Man kann sicher 
sowohl die Frequenz als auch den Dutycyle in 1024 Schritten genau 
einstellen, aber ganz gewiß nicht beide Werte gleichzeitig maximal, 
sprich nicht 1024 Schritte Auflösung wen der Takt schon bei 1024=8 MHz 
steht.

Ganz nebenbei wären das ca. 8 kHz Schritte. 12 kHz gingen damit also 
nicht bei 1024 äquidistanten Schritten, es sei denn man manipuliert die 
Firmware und damit die Schrittweite. Die 2.500auf dem Bild, ob es nun 
2,5 Hz oder 2500 Hz ein sollen, sind ein weiterer belegt dafür, daß die 
Beschreibung nicht ganz zu den Funktionalitäten paßt, bzw diese 
mißverständlich sind. Ich vermute daß es einfach unterschiedliche 
Vorteiler sind, so daß die Schritte nach oben hin größer werden.

von Dj E. (djelko)


Lesenswert?

Mr. Tom, mir ist jetzt auch klar geworden, dass man bei einer Frequenz 
von 1 Mhz keinen Duty-Cycle mit 0,5%-Schritten einstellen kann.

Carsten R., ersteinmal danke für deinen Riesen-Text! :-D

1.In meinem Fall ist es mir nicht wichtig, den Duty-Cycle absolut 
unabhängig von der Frequenz zu regeln. Es ist nur wichtig, dass man 
überhaupt den Duty-Cycle einstellen kann.

2.Peter Dannegger schrieb:
> Du kannst den ATmega1284 nehmen, der hat 2 16Bit-Timer. Damit kannst Du
> 2 getrennte Frequenzen/Tastverhältnisse erzeugen.
Er meint warscheinlich, dass man die obere Zählgrenze auf kleine Zahlen 
setzen kann, um eine hohe Frequenz zu erreichen. Wenn man niedrigere 
Frequenzen erzeugen will, kann man ja bis zu den 65536 Schritten gehen.

Wie bei 1. gesagt, ist es für meinen Fall nicht tragisch, Kompromisse 
einzugehen, solange die Frequenz sich bei einer Pulsweitenänderung nicht 
drastisch (4% oder so) verändert.

von runtastic (Gast)


Lesenswert?

Bei PWM schau dir mal die Piccolo von TI an:
http://www.ti.com/lsds/ti/microcontroller/32-bit_c2000/c28x_piccolo/overview.page


Gibt's auch ein günstiges Evalboard dafür (C2000 Launchpad).

von Carsten R. (kaffeetante)


Lesenswert?

Dj Elko schrieb:
> Er meint warscheinlich, dass man die obere Zählgrenze auf kleine Zahlen
> setzen kann, um eine hohe Frequenz zu erreichen. Wenn man niedrigere
> Frequenzen erzeugen will, kann man ja bis zu den 65536 Schritten gehen.

Ganz genau! Nun hast Du es Perfekt erfaßt.

Dj Elko schrieb:
> Wie bei 1. gesagt, ist es für meinen Fall nicht tragisch, Kompromisse
> einzugehen, solange die Frequenz sich bei einer Pulsweitenänderung nicht
> drastisch (4% oder so) verändert.

4% Als Mindestanforderung entspricht 1/25. Der Timer muß also Mindestens 
bis 24 Zählen (Das sind 25 Schritte inklusive der 0). Die 0 wird in der 
Informatik gerne mal vergessen. Das ist ein echter Klassiker unter den 
Bugs ;-). Das entspricht bei einem normalen ATMega, ohne die schnelle 
PLL, bei 20 MHz Takt einer PWM-Frequenz von 20 MHz/25 800 kHz als 
Obergrenze und 640 kHz bei 16 MHz. Früher war bei 16 MHz Schluß.

Vor ein paar Jahren wurde der maximale Takt für viele, aber nicht alle, 
Modelle auf 20 MHz in der Spezifikation angehoben.

von Dj E. (djelko)


Lesenswert?

Kann man dem µC nicht einfach die Pulsweitenabstufung in einem 
bestimmten Bereich einzeln zuteilen? Dann hätte man bei niedrigen 
Frequenzen eine hohe Pulsweitenauflösung (~0,5%) und bei hohen 
Frequenzen eine gröbere (~10%).
So wurde das ja auch bei der Bascom-Variante gemacht.

von Tomas K. (Firma: tktronic) (tktronic)


Lesenswert?

Dj,

Warum quälst Du Dich so rum ?

Nimm einen leistungsfähigen uC und gut ist...

Uwe hat im Prinzip alles was Du brauchst schon als libs gemacht.

Hier mehrkanalige, unabhängige PWM:
http://mikrocontroller.bplaced.net/wordpress/?page_id=1074


Treiber für Text oder Grafik LCD findest Du auch in der Liste, das 
Discovery board kostet nur nen Appel+Ei und Coocox IDE + arm-gcc ist for 
free. Debugger/Programmer SWD Interface ist auf dem Discovery board 
schon mit integriert...

Dein User-interface machst Du Dir je nach Lust+Laune+Können (Taster, 
Drehgeber oder GUI+Touch, oder, oder...).


gruss, tom.

von Dj E. (djelko)


Lesenswert?

Tomas Kuckenburg schrieb:

> Warum quälst Du Dich so rum ?
> Nimm einen leistungsfähigen uC und gut ist...
> Uwe hat im Prinzip alles was Du brauchst schon als libs gemacht.

Das ist zwar eine gute Idee, aber ich wollte ursprünglich einen 
Funktionsgenerator mit einem Atmega bauen.
Bestimmt wäre es eine bessere Lösung, aber ich kann nunmal derzeit nur 
AVRs programmieren und möchte mir nicht für ein so relativ "simples" 
Projekt extra ein Eval-Board kaufen, auch wenn es nur sehr wenig kostet.
Ich werde es jedoch im Hinterkopf behalten, denn diese (fast schon 
Computerähnlichen) Mikrocontroller sind für mich vor allem wegen dem 
wesentlich höheren Takt sehr interessant.
Trotzdem DANKE dafür! :-D

Wenn ich im Internet suche, komme ich nämlich nicht auf die Idee, einen 
STM32 zu nehmen, weil eine Suche nach "(AVR) Frequenzgenerator GCC" 
keine anderen Mikrocontrollertypen anzeigt und ich noch nie etwas 
genaues von diesen µC gehört habe. Solche Ideen bekommt man meiner 
Ansicht nach fast nur im Gespräch mit anderen "Fachleuten", wie sie hier 
im Forum zahlreich vorhanden sind.

von Peter D. (peda)


Lesenswert?

Dj Elko schrieb:
> Kann man dem µC nicht einfach die Pulsweitenabstufung in einem
> bestimmten Bereich einzeln zuteilen?

Der AVR kann rechnen. Du gibst es immer in % vor und der AVR rechnet 
dann den dazu gehörenden PWM-Wert aus. Die Frequenz ändert sich dabei 
nicht.

Vorzugsweise schreibt man das Programm in C und macht die Berechnung in 
float.

von holger (Gast)


Lesenswert?

>Das ist zwar eine gute Idee, aber ich wollte ursprünglich einen
>Funktionsgenerator mit einem Atmega bauen.

Es lohnt sich immer auch mal über den Tellerrand zu schauen.
Andere Mütter haben auch schöne Töchter;)

>Bestimmt wäre es eine bessere Lösung, aber ich kann nunmal derzeit nur
>AVRs programmieren und möchte mir nicht für ein so relativ "simples"
>Projekt

Das das gar nicht so simpel ist auf einem Atmega sollte auch dir
inzwischen klar geworden sein.

von Peter D. (peda)


Lesenswert?

holger schrieb:
> Das das gar nicht so simpel ist auf einem Atmega sollte auch dir
> inzwischen klar geworden sein.

Wie soll das denn noch simpler gehen, als mit den 2 16Bit-Timern mit 
PWM-Ausgang?

von holger (Gast)


Lesenswert?

>> Das das gar nicht so simpel ist auf einem Atmega sollte auch dir
>> inzwischen klar geworden sein.
>
>Wie soll das denn noch simpler gehen, als mit den 2 16Bit-Timern mit
>PWM-Ausgang?

Ich meinte damit das er sich klar machen muss bis zu welchen
Frequenzen er was mit den Timern machen kann. Das er nicht
beliebige Frequenzen einstellen kann und dann auch noch aufs
Prozent genaue PWM Verhältnisse. In der Zeit wo er hier
einfach nur zuhört, und evtl. auf die rettende Lösung wartet,
hätte er schon längst mal ein paar einfache Versuche machen
können was geht und was nicht.

Mit den daraus gewonnenen Erkenntnissen könnte er sich eine
eigene stufenweise Lösung mit Kompromissen bei hohen Frequenzen
selber programmieren.

So wie es aussieht wartet er aber lieber bis ihm einer
sein Programm schreibt.

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.