Hallo, ich soll eine Test-Einrichtung bauen, die über einen Drehschalter einstellbare Rechtecksignale (5Vpp) an ein Gerät liefert. Duty Cycle ist immer 50%, die Frequenzen liegen zwischen 20 und 85 Hz und sollen möglichst exakt eingehalten werden (1%). Ich habe jetzt eine kleine Platine mit Drehschalter und einem Attiny26P gebastelt. Externen Quarz habe ich vorgesehen aber noch nicht bestückt, weil ich noch nicht weiß welche Frequenz. Wie würdet ihr das Signal erzeugen? Timer-Interrupt mit hoher Frequenz aufrufen und dann zählen, Ausgangssignal bei Erreichen des Zählwertes toggeln?
Praktikant schrieb: > Wie würdet ihr das Signal erzeugen? DDS Prinzip anwenden. Dann kanst du mit mHz Aufloesung deine Frequenz einstellen.
Helmut Lenzen schrieb: > DDS Prinzip anwenden. Dann kanst du mit mHz Aufloesung deine Frequenz > einstellen. Er sagt uns nicht was er unter "krummer" Frequenz versteht. Vielleich ist 57 Hz schon krumm, weil nicht geradzahlig? Fragen über Fragen ....
Praktikant schrieb: > Ich habe jetzt eine kleine Platine mit Drehschalter und einem Attiny26P > gebastelt. Das sieht doch schon mal gut aus. Mit dem Drehschalter stelltst Du verschiedene Spannungen zur Verfügung und der µC generiert Dir daraus eine proportionale Frequenz. Wie krumm Deine Frequenzen sein sollen, kannst Du durch 'krumme' Spannungen vorgeben ;-) Mein Vorschlag für einen AVR: http://www.mino-elektronik.de/Generator/takte_impulse.htm#bsp6
Wenn nur unter 1% Abweichung und so niedrigen Frequenzen gefordert sind, kann man einfach den Timer im µC die Frequenz erzeugen lassen: einfach den Takt (z.B. 1 MHz) geteilt durch eine gerade ganze Zahl - damit liegt man bei etwa 0,01 % Auflösung. Ein 16 Bit Timer wäre von Vorteil, es geht aber auch mit 8 Bit Timern. Für die volle Auflösung kann man die PWM Register passen dynamisch umprogrammieren, um so die volle Auflösung bis auf 1 Zyklus zu erreichen. Wenn man in ASM Programmiert könnte man auch aktive Warteschleifen nutzen, auch das geht bis auf 1 Zyklus genau.
>Wie würdet ihr das Signal erzeugen? Mit einem PIC anstatt AVR. Einen mit NCO (nummeric controlled oscillator), zum Beispiel PIC16F1713. Damit hatte ich neulich sogar einen Kurzwellen-Empfänger gebaut. PIC als LO, Audio-Verstärker (hat interne OPVs) und als Telegrafie-Generator, um die Frequenz akustisch auszugeben.
1 | unsigned long frq = 3500000;// 3.5MHz |
2 | |
3 | |
4 | void FRQ_Update(void){ |
5 | unsigned long inc; |
6 | |
7 | // inc = 2 * frq * 1kHz / 32MHz * 2E20 / 10;
|
8 | // inc = ((unsigned long)frq * (unsigned long)8192) / 125; // 1kHz steps
|
9 | // inc = ((unsigned long)frq * (unsigned long)4096) / 625 ; // 100Hz steps
|
10 | inc = ((unsigned long)frq * (unsigned long)1024) / 15625 ; // 100Hz steps |
11 | |
12 | // Update the NCO
|
13 | NCO1INCU = (inc >> 16) & 0x0000FF; |
14 | NCO1INCH = (inc >> 8 ) & 0x0000FF; |
15 | NCO1INCL = (inc >> 0 ) & 0x0000FF; |
16 | }
|
Der Drehschalter hat 6 Positionen, gemeinsamen Anschluss auf Masse, Ausgänge auf je einen Portpin. Ist zwar Verschwendung, aber ich bräuchte die Pins sonst eh nicht. Frequenzen sind zum Beispiel 26,525 Hz oder 51,9 Hz. Leider sind die Abstände ziemlich willkürlich, also keine gemeinsamen Teiler oder so. Es geht darum, ein Anzeigegerät mit Frequenzeingang bei bestimmten Werten zu kalibrieren. Wenn irgendwie möglich, wäre auch noch eine Rampe zwischen den Stufen sinnvoll, d.h. wenn ich den Drehschalter verstellt, soll die Frequenz nicht springen sondern vielleicht innerhalb von 500 ms linear auf den neuen Sollwert ansteigen.
Praktikant schrieb: > Frequenzen sind zum Beispiel 26,525 Hz oder 51,9 Hz. Wenn die Frequenz nur auf 1% genau sein soll, ist spätestens die 4te Stelle bei der Frequenzangabe überflüssig. Hier findest du ein Beispiel für einen DDS-Generator http://www.myplace.nu/avr/minidds/ Für ein Rechtecksignal kann man sich die ganze Wertetabelle natürlich sparen.
Praktiker schrieb: > Hier findest du ein Beispiel für einen DDS-Generator > http://www.myplace.nu/avr/minidds/ > > Für ein Rechtecksignal kann man sich die ganze Wertetabelle natürlich > sparen. Wenn man sich die Wertetabelle spart, macht dann der Begiff DDS überhaupt noch einen Sinn? MfG Klaus
Praktikant schrieb: > möglichst exakt eingehalten werden (1%). 1% ist überhaupt kein Problem. Nimm einen Compare-Ausgang im Toggle-Modus. Mit dem ATtiny261 geht es noch einfacher, da der einen 16Bit Timer hat.
Praktikant schrieb: > Wenn irgendwie möglich, wäre auch noch eine Rampe zwischen den Stufen > sinnvoll, d.h. wenn ich den Drehschalter verstellt, soll die Frequenz > nicht springen sondern vielleicht innerhalb von 500 ms linear auf den > neuen Sollwert ansteigen. Was soll das für das Kalibrieren bringen? Eine sich verändernde Frequenz über 500ms ist dafür völlig kontraproduktiv. Praktikant schrieb: > Es > geht darum, ein Anzeigegerät mit Frequenzeingang bei bestimmten Werten > zu kalibrieren.
>soll die Frequenz nicht springen sondern vielleicht innerhalb von 500 ms >linear auf den neuen Sollwert ansteigen. Wobei eine lineare Änderung der Periodendauer programmtechnisch viel einfacher zu realisieren ist. Die Frequenz ändert sich dann allerdings nicht linear (beide Größen simultan linear zu ändern ist unmöglich). "Musikalisch richtig" wäre übrigens eine exponentiell verlaufende Änderung der Frequenz, d. h. ein Änderungsschritt entspricht einer Multiplikation mit einem bestimmten, konstanten Faktor (*). In diesem Fall ändert sich dann auch die Periodendauer T = 1/f exponentiell. (*) Für eine ganze Oktave aufwärts beträgt dieser Faktor 2; für einen Halbton aufwärts 2^(1/12) ≈ 1.059463...
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.