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.
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
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?
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.
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
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... (???)
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.
>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.
./., 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.
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.
Hmmm... Also ist es nicht so ohne weiteres möglich, EINEN Avr als 2-Kanal Frequenzgenerator zu benutzen?
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!
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?
Nein, hat er nicht... Warum kann man keinen 8bit-Timer nutzen?
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
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.
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.
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.
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).
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.
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.
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.
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.
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.
>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.
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?
>> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.