Hallo zusammen, ich muss mit einem ATmega32 (AVR-NET-IO) 6 einzelne Sinus-Kurven von 0-5 Volt und einer Frequenz von 400 Hz erzeugen. Ich denke DDS ist hier das Mittel der Wahl (!?). Ich habe jetzt einige Zeit nach DDS-Bauelementen gesucht, aber nicht's passendes gefunden... welchen DDS könnt ihr mir empfehlen? Gibt es sowas wie den AD9833 nur als Mehrkanal-Version? Vielen Dank im Voraus! Schöne Grüße, Morton
Wie sauber / mit welcher Auflösung willst du die Spannungen denn erzeugen? Ggf. reicht es ja, 6 Soft-PWM-Kanäle mit bsp. 8kHz zu erzeugen? Sollte mit dem Atmega kein Problem sein.
Bei fester Frequenz vielleicht auch die analoge Lösung mit einstellbaren Phasenschiebern?
@Martin S. (morton) >ich muss mit einem ATmega32 (AVR-NET-IO) 6 einzelne Sinus-Kurven von 0-5 >Volt und einer Frequenz von 400 Hz erzeugen. Der hat keine 6 PWM Ausgänge in Hardware. Das wird ungünstig. 6x 400 Hz klingt nach Drehstrom im Flugzeug. >Ich denke DDS ist hier das Mittel der Wahl (!?). Ja. >Ich habe jetzt einige Zeit nach DDS-Bauelementen gesucht, aber nicht's >passendes gefunden... Die gibt's wie Sand am Meer, wenn gleich nicht mit 6 Ausgängen. Das ist eine klassische Funktion für uCs mit ausreichend PWMs. Versuch einen pinkompatiblen uC zu deinem AVR zu finden der genügend PWMs hat.
Falk B. schrieb: > Der hat keine 6 PWM Ausgänge in Hardware. Aber ist das für 400Hz unbedingt notwendig? Ich würde mal behaupten, man bekommt 6 Soft-PWM-Kanäle locker ausreichend schnell realisiert.
Falk B. schrieb: > Versuch einen pinkompatiblen uC zu deinem AVR zu finden der genügend > PWMs hat. Das sollte der ATMega644 sein. Der hat auch andere nette Sachen, wie PC Interrupts.
:
Bearbeitet durch User
Martin S. schrieb: > ich muss mit einem ATmega32 (AVR-NET-IO) 6 einzelne Sinus-Kurven von 0-5 > Volt und einer Frequenz von 400 Hz erzeugen. > > Ich denke DDS ist hier das Mittel der Wahl (!?). Kommt drauf an. Worin sollen sich die 6 Signale denn unterscheiden? Nur in der Amplitude? Oder auch in Frequenz/Phase? Wenn nur in der Amplitude, dann brauchst du ja nur 6 Abschwächer und irgendwas, das dir deine 400Hz erzeugt. Bei lediglich 400Hz kann man DDS aber auch problemlos in Software machen. Stichwort: Jesper-DDS.
@A. D. (egsler) >> Der hat keine 6 PWM Ausgänge in Hardware. >Aber ist das für 400Hz unbedingt notwendig? Es ist überaus sinnvoll, wenn der AVR noch andere Sachen machen soll. > Ich würde mal behaupten, man >bekommt 6 Soft-PWM-Kanäle locker ausreichend schnell realisiert. Wirklich? Wenn er 400 Hz Sinus haben will, braucht er MINDESTENS 4 kHz PWM-Frequenz und gute Ausgangsfilter. 6 Kanal Soft-PWM mit 4 kHz frißt verdammt viel CPU-Leistung.
@Axel Schwenke (a-za-z0-9) >Bei lediglich 400Hz kann man DDS aber auch problemlos in Software >machen. Stichwort: Jesper-DDS. Nur daß dann die CPU zu 99% ausgelastet ist . . .
A. D. schrieb: > Wie sauber / mit welcher Auflösung willst du die Spannungen denn > erzeugen? Ehrlich gesagt ist die letztendlich benötigte Auflösung noch nicht eindeutig bzw. definiert, sorry. H.Joachim S. schrieb: > Bei fester Frequenz vielleicht auch die analoge Lösung mit > einstellbaren > Phasenschiebern? Das muss ich mir anschauen, einstellbare Phasenschieber kenne ich (noch) nicht. Falk B. schrieb: > @Martin S. (morton) > >>ich muss mit einem ATmega32 (AVR-NET-IO) 6 einzelne Sinus-Kurven von 0-5 >>Volt und einer Frequenz von 400 Hz erzeugen. > > Der hat keine 6 PWM Ausgänge in Hardware. Das wird ungünstig. > 6x 400 Hz klingt nach Drehstrom im Flugzeug. Ja, gut erkannt. Der Synchro/Kreisel wird ersetzt und der künstliche Horizont im Cockpit direkt vom Mikrocontroller mittels 3x Sinus für jeweils Roll- und Pitch-Achse angesteuert. So zumindest der Plan. >>Ich denke DDS ist hier das Mittel der Wahl (!?). > > Ja. > >>Ich habe jetzt einige Zeit nach DDS-Bauelementen gesucht, aber nicht's >>passendes gefunden... > > Die gibt's wie Sand am Meer, wenn gleich nicht mit 6 Ausgängen. Das ist > eine klassische Funktion für uCs mit ausreichend PWMs. > > Versuch einen pinkompatiblen uC zu deinem AVR zu finden der genügend > PWMs hat. Das Problem ist, dass netto noch zweieinhalb Wochen bleiben um das Projekt umzusetzen. Noch einen zusätzlichen µC einzubinden wirkt für mich gerade als ziemlich aufwändig, zumal ich mich in jegliche Themen (DDS-Ansteuerung, PWM-Umsetzung, kombinieren von µC's) einlesen muss, da ich hier nicht viel Erfahrung habe. Aber Tutorials und Forenthemen gibt es ja zu den meisten Themen zu genüge. Axel S. schrieb: > Kommt drauf an. Worin sollen sich die 6 Signale denn unterscheiden? Nur > in der Amplitude? Oder auch in Frequenz/Phase? Wenn nur in der > Amplitude, dann brauchst du ja nur 6 Abschwächer und irgendwas, das dir > deine 400Hz erzeugt. > > Bei lediglich 400Hz kann man DDS aber auch problemlos in Software > machen. Stichwort: Jesper-DDS. Die Unterschiede liegen in den Amplituden und in der Phasenverschiebung um jeweils 120° Bezüglich CPU-Auslastung: Der µC muss noch den Datentransfer über UDP handeln können, da über UDP Winkel-Angaben (Roll/Pitch) empfangen und als dazugehörige Sinus-Kurven ausgegeben werden sollen. Also lieber DDS oder PWM? Die DDS werden aber nicht mit PWM angesteuert, oder? Werden diese nicht über Bit-Reihenfolgen konfiguriert und angesteuert? Vielen Dank schon einmal für eure Hilfe!!!
Martin S. schrieb: > Das Problem ist, dass netto noch zweieinhalb Wochen bleiben um das > Projekt umzusetzen. Martin S. schrieb: > Die Unterschiede liegen in den Amplituden und in der Phasenverschiebung > um jeweils 120° Da fehlen immer noch ein paar relevante Infos. 3 x 120° sind 360° Und wozu die anderen 3 Phasen? Jedes "triple" hat die gleiche Amplitude? Analog einen (zwei) 3-Phasen-Generator bauen und den Start vom µC erledigen lassen. Die Amplituden-Steuerung über 3 (6) digitale Potis oder über CMOS-Schalter mit Widerständen. Das könnte in 2 Wochen, Software (getestet) und Hardware (aufgebaut und getestet), zu schaffen sein. Wenn es erst einmal läuft, kann man immer noch über eine voll digitale Lösung nachdenken. Blackbird
Falk B. schrieb: > Nur daß dann die CPU zu 99% ausgelastet ist . . . man kann intern EIN 400-Hz erzeugen und und durch Konstantenaddition daraus 3 Phasenverschobene Sinuse, die auf drei ports als 8-bit-Worte ausgegeben werden.. Dazu noch Invertierung. und fertig ist das sechs-Phasen-System. das kostet einen atmga nur ein müdes Stirnrunzeln.
Bleiben die phasenbeziehungen eigentlich konstant ? Dann würde sogar ein normaler oszillator gehen und daran koppelst du dann die phasienschieber. Die amplituden regelst du mit PWMs. Die ander möglichkeit ist, du nimmst zwei µC. Der eine rechnet alles, wa gebraucht wird und der zweite erzeugt per DDS den sinus (bei 400Hz , kein problem ) und die amplitude kannst du ja dann auch über einen multiplikator einstellen. Die information gibts du vom master an DDS , über den Uart weiter. In dem angefängten code ist die schleife als ASM eingebaut, weil ich über 100Khz will. Bei dir könntes du die schleife aber in einer hochsprache machen ( ist auch im asmcode vermerkt) du könntest den das umbauen : CR1AL:=sinus[(w shr 16) and $FF]; und das für 6 phasenbeziehungen umbauen. Nur würde ich dann nicht bis 255 zählen, sondern bis 360 und die tabelle dementsprechend erweitern.
1 | program soft_dds; |
2 | |
3 | const sinus:array[0..255] of byte = |
4 | ( |
5 | 0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae, |
6 | 0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8, |
7 | 0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf5, |
8 | 0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff, |
9 | 0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7, |
10 | 0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe2,0xe0,0xde,0xdc, |
11 | 0xda,0xd8,0xd5,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb3, |
12 | 0xb0,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x98,0x95,0x92,0x8f,0x8c,0x89,0x86,0x83, |
13 | 0x80,0x7c,0x79,0x76,0x73,0x70,0x6d,0x6a,0x67,0x63,0x60,0x5d,0x5a,0x57,0x54,0x51, |
14 | 0x4f,0x4c,0x49,0x46,0x43,0x40,0x3e,0x3b,0x38,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27, |
15 | 0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x13,0x12,0x10,0x0f,0x0d,0x0c,0x0a, |
16 | 0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x03,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00, |
17 | 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08, |
18 | 0x09,0x0a,0x0c,0x0d,0x0f,0x10,0x12,0x13,0x15,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x23, |
19 | 0x25,0x27,0x2a,0x2c,0x2e,0x31,0x33,0x36,0x38,0x3b,0x3e,0x40,0x43,0x46,0x49,0x4c, |
20 | 0x4f,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,0x67,0x6a,0x6d,0x70,0x73,0x76,0x79,0x7c |
21 | ); |
22 | |
23 | faktor = 0.001 * 0.304 * $FFFF; |
24 | |
25 | var t:byte; |
26 | max, |
27 | phase:dword; |
28 | delta:dword; |
29 | w:byte; |
30 | frequenz:integer; |
31 | |
32 | kette:array[0..7] of char; |
33 | l:byte; |
34 | |
35 | procedure send_byte(eing:byte); |
36 | begin |
37 | while ((UCSRA and (1 shl UDRE) ) = 0) do; |
38 | UDR :=eing; |
39 | end; |
40 | procedure eukl(eing:dword); |
41 | var e,r:dword; |
42 | c:byte; |
43 | begin |
44 | e:=100000; |
45 | for c:=1 to 6 |
46 | do |
47 | begin |
48 | r:=(eing div e); |
49 | send_byte('0'+r); |
50 | eing:=eing - r*e; |
51 | e:=e div 10; |
52 | end; |
53 | send_byte(' '); |
54 | end; |
55 | |
56 | procedure set_delta; |
57 | begin |
58 | eukl(frequenz); |
59 | delta:=dword( frequenz * faktor); |
60 | end; |
61 | procedure gen_val; |
62 | var j:byte; |
63 | c:integer; |
64 | begin |
65 | |
66 | c:=1; |
67 | frequenz:=0; |
68 | for j:=(l-1) downto 0 |
69 | do |
70 | begin |
71 | frequenz:=frequenz+(kette[j]-48)*c; |
72 | c:=c*10; |
73 | end; |
74 | set_delta; |
75 | l:=0; |
76 | |
77 | end; |
78 | |
79 | procedure USART__RX(); org IVT_ADDR_USART__RX; |
80 | var val:byte; |
81 | df:short; |
82 | begin |
83 | val:= UDR; //UART1_Read(); // read the received data, |
84 | |
85 | if val <> ' ' |
86 | then |
87 | begin |
88 | if (val >= '0') and (val <= '9') |
89 | then |
90 | begin |
91 | kette[l]:=val; |
92 | inc(l); |
93 | end |
94 | else |
95 | begin |
96 | case val |
97 | of |
98 | '+':df:= +1; |
99 | '-':df:= -1; |
100 | 'u':df:= +10; |
101 | 'd':df:= -10; |
102 | 'U':df:=+100; |
103 | 'D':df:=-100; |
104 | end; |
105 | frequenz:=frequenz + df; |
106 | set_delta; |
107 | end; |
108 | end |
109 | else if l > 0 then gen_val; |
110 | |
111 | asm // wieso geht das nicht ??? |
112 | LDS R16, _delta+0 |
113 | LDS R17, _delta+1 |
114 | LDS R18, _delta+2 |
115 | end; |
116 | end; |
117 | const takt = 16000000; // 16 MHZ |
118 | baud = 9600; |
119 | ubrr_val = ((takt+baud*8)/(baud*16)-1); |
120 | label loop,test; |
121 | |
122 | begin |
123 | t:=0; |
124 | DDRB:=$FF; // alle im port B auf ausgang |
125 | // --------------------------------------------------------------- |
126 | |
127 | TCCR1A:= $81; // non-inverted PWM on OC1A, 8 Bit Fast PWM // timmer 1 !! |
128 | //TCCR1B:= $08; |
129 | TCCR1B:=$08 or TCCR1B and not $7 or 1; // clear clk setting |
130 | //TCCR1B:=TCCR1B or 1; // precaler 1 -> ~122*256 Hz PWM frequency |
131 | OCR1AH:=0; |
132 | // ---------------------------------------------------------------- |
133 | ubrrh:=hi(ubrr_val); |
134 | ubrrl:=ubrr_val and $FF; |
135 | |
136 | UCSRB:= (1 shl RXEN) or (1 shl TXEN) or 128;// empfangen , senden und IRQ wenn Zeichen empfangen wird. |
137 | // ucsrb:=ucsrb or 128; // UART interrupt wenn zeichen gelesen ... |
138 | // 8 data bits, 1 stop bit |
139 | UCSRC:= (1 shl UCSZ1) or (1 shl UCSZ0); |
140 | |
141 | Delay_ms(100); // Wait for UART module to stabilize |
142 | |
143 | SREG_I_bit := 1; |
144 | |
145 | frequenz:=1000; |
146 | set_delta; |
147 | |
148 | asm |
149 | LDI R26, lo_addr(_sinus) |
150 | LDI R27, hi_addr(_sinus) |
151 | end; |
152 | |
153 | while TRUE do // danach assm !! // Endless loop |
154 | begin |
155 | |
156 | // phase:=phase+delta; |
157 | asm |
158 | loop: |
159 | |
160 | LDS R16, _delta+0 |
161 | LDS R17, _delta+1 |
162 | LDS R18, _delta+2 |
163 | |
164 | ADD R20, R16 // 1 addiere wert, auf |
165 | ADC R21, R17 // 1 |
166 | ADC R22, R18 // 1 |
167 | |
168 | //OCR1AL:=sinus[(w shr 16) and $FF]; |
169 | |
170 | MOV R30, R22 // 1 3 byte von der |
171 | LDI R31, 0 // 1 |
172 | ADD R30, R26 // 1 |
173 | ADC R31, R27 // 1 |
174 | LPM // 3 // lädt aus dem flash an der addresse Z (r30,r1); |
175 | OUT OCR1AL, R0// 1 |
176 | |
177 | rjmp loop; // 2 |
178 | end; |
179 | end; |
180 | end. |
Martin S. schrieb: > ATmega32 (AVR-NET-IO) 1. Da kannst Du ganz einfach einen 644 oder 1284p reinstecken, und hast mehr PWMs. Und mehr Ram und mehr UARTS zum debuggen und und und. Achtung: Beim orginal AVR-NET-IO bleibt ab und zu mal das Ethernet stehen!! Hoffentlich nicht wenn gerade geflogen wird. Nachbesserung (Block-Cs am ENC) müsste hier stehen: https://www.mikrocontroller.net/articles/AVR_Net-IO_Bausatz_von_Pollin
@Martin S. (morton) >Ja, gut erkannt. Der Synchro/Kreisel wird ersetzt und der künstliche >Horizont im Cockpit direkt vom Mikrocontroller mittels 3x Sinus für >jeweils Roll- und Pitch-Achse angesteuert. So zumindest der Plan. >> Versuch einen pinkompatiblen uC zu deinem AVR zu finden der genügend >> PWMs hat. >Das Problem ist, dass netto noch zweieinhalb Wochen bleiben um das >Projekt umzusetzen. Noch einen zusätzlichen µC einzubinden wirkt für Ich meinte, daß du einen pinkompatiblen AVR nehmen sollst. Dazu gab es ja schon mehrere Vorschläge. >Die Unterschiede liegen in den Amplituden und in der Phasenverschiebung >um jeweils 120° Also 6 Sinussignale mit 6 verschiedenen Amplituden. >Bezüglich CPU-Auslastung: Der µC muss noch den Datentransfer über UDP >handeln können, da über UDP Winkel-Angaben (Roll/Pitch) empfangen und >als dazugehörige Sinus-Kurven ausgegeben werden sollen. >Also lieber DDS oder PWM? Beides ist möglich. Die PWM sollte man in Hardware machen. > Die DDS werden aber nicht mit PWM angesteuert, Nein. >oder? Werden diese nicht über Bit-Reihenfolgen konfiguriert und >angesteuert? Ja.
mein Netio hat auch einen m1284p bekommen arbeitet sich definitv besser, -> mehr SRAM -> 2x Rx Tx aber trotz jede Menge Abblock C am ENC bleibt Netzwerk trotzdem ab und an stehen, juckt mich aber noch wenig, sonst müsste ich den ganze Code überarbeiten mit 16KB SRAM könnte ich die ganze Webseite vorrätig halten ohne sie on the fly zu erzeugen.
Blackbird schrieb: > Da fehlen immer noch ein paar relevante Infos. > > 3 x 120° sind 360° > Und wozu die anderen 3 Phasen? Jedes "triple" hat die gleiche Amplitude? Roll(X, Y, Z) und Pitch(X, Y, Z), alle 6 Signale mit unterschiedlichen Amplituden und zwischen X, Y, Z eigentlich jeweils um 120° phasenverschoben ("eigentlich": Die gemessenen Ist-Werte waren teilweise nicht phasenverschoben). Siehe auch Antwort weiter unten auf den Beitrag von Michael F. Peter R. schrieb: > Falk B. schrieb: >> Nur daß dann die CPU zu 99% ausgelastet ist . . . > > man kann intern EIN 400-Hz erzeugen und und durch Konstantenaddition > daraus 3 Phasenverschobene Sinuse, die auf drei ports als 8-bit-Worte > ausgegeben werden.. Dazu noch Invertierung. und fertig ist das > sechs-Phasen-System. > > das kostet einen atmga nur ein müdes Stirnrunzeln. Klingt interessant, auch wenn ich da jetzt erst mal schauen muss, wie man das Ganze anpacken kann. Michael F. schrieb: > Bleiben die phasenbeziehungen eigentlich konstant ? Das ist ehrlich gesagt nicht zu 1000% eindeutig. Die per Oszilloskop gemessenen Signale am Synchro/Kreisel (--> soll hier durch die µC-Steuerung ersetzt werden) waren nicht immer 120° phasenverschoben, was aber nach meinem Kenntnisstand ein wenig gegen die Funktionsweise eines Synchros spricht. Der Synchro ist aus den 70ern und macht im Betrieb akkustisch auch nicht mehr den fittesten Eindruck, eventuell ist dieser nicht mehr einwandfrei und hat die Messergebnisse beeinflusst. Aber das muss letztendlich, wenn die Ersatz-Steuerung steht, ausprobiert werden. Daher müsste hier die Option bleiben, dass man die Phasenverschiebung ändern könnte. Tom schrieb: > Martin S. schrieb: >> ATmega32 (AVR-NET-IO) > > 1. Da kannst Du ganz einfach einen 644 oder 1284p reinstecken, und hast > mehr PWMs. Und mehr Ram und mehr UARTS zum debuggen und und und. > > Achtung: > Beim orginal AVR-NET-IO bleibt ab und zu mal das Ethernet stehen!! > Hoffentlich nicht wenn gerade geflogen wird. > Nachbesserung (Block-Cs am ENC) müsste hier stehen: > https://www.mikrocontroller.net/articles/AVR_Net-IO_Bausatz_von_Pollin Danke, den 1284p habe ich vorhin geordert (bietet 6 PWM's). Der Flieger ist mittlerweile ein Flugsimulator und steht glücklicherweise fest am Boden, Gefahr für Leib und Leben besteht da nicht :) Falk B. schrieb: >>> Versuch einen pinkompatiblen uC zu deinem AVR zu finden der genügend >>> PWMs hat. > >>Das Problem ist, dass netto noch zweieinhalb Wochen bleiben um das >>Projekt umzusetzen. Noch einen zusätzlichen µC einzubinden wirkt für > > Ich meinte, daß du einen pinkompatiblen AVR nehmen sollst. Dazu gab es > ja schon mehrere Vorschläge. Danke, ATmega1284p ist als Ersatz geordert (bietet 6 PWM's). Falk B. schrieb: >>Die Unterschiede liegen in den Amplituden und in der Phasenverschiebung >>um jeweils 120° > > Also 6 Sinussignale mit 6 verschiedenen Amplituden. Ja, siehe auch obersten Teil meiner Antwort. Falk B. schrieb: >>Bezüglich CPU-Auslastung: Der µC muss noch den Datentransfer über UDP >>handeln können, da über UDP Winkel-Angaben (Roll/Pitch) empfangen und >>als dazugehörige Sinus-Kurven ausgegeben werden sollen. > >>Also lieber DDS oder PWM? > > Beides ist möglich. Die PWM sollte man in Hardware machen. Hardware-PWM gemäß https://www.mikrocontroller.net/articles/AVR_PWM mit Tiefpassfilter der noch hinzukommt? Kurz als Zwischen-Zusammenfassung: Hier wurden nun mehrere Lösungen vorgeschlagen, aber die wahrscheinlich zielführendsten scheinen mir hier PWM oder DDS zu sein. Eigentlich erscheint mir persönlich DDS am Saubersten/Angenehmsten, da diese als Komplett-Bausteine erhältlich sind und mehr oder weniger "nur" vernünftig verbunden und angesteuert werden müssen - Problem ist die Anzahl der Ausgänge, bei analog.com im Produkt-Filter finde ich DDS mit max. 4 Channels, welche dann jedoch auch 32 Pins haben - klingt für das AVR-NET-IO nach zu vielen Pins, die angesteuert werden müssen. Dann wohl doch lieber PWM. Die Umsetzung von A bis Z der PWM als analoge Signale habe ich noch nicht zu 100% verstanden, aber da werde ich mich noch reinarbeiten, Anleitungen gibt es ja zu Genüge. Ich habe nun den ATmega1284p geordert. Dann müsste, so wie ich das verstanden habe, noch ein Tiefpass-Filter dimensioniert und umgesetzt werden und der Rest ist dann die Software-Umsetzung, womit letztendlich 6 Sinussignale realisiert werden können? Bzgl der Alternativen: - Einstellbare Phasenverschieber = Neuland, werde ich mir aber trotzdem mal anschauen Jesper-DDS: zu CPU-lastig lt. Kommentar?! - 3-Phasen-Generator: Klingt mir spontan nach zu viel Aufwand, zumal hier leider keine Vorab-Lösung in Frage kommt, welche für die spätere Verwendung hardwareseitige Änderungen benötigt - Oszillator + Phasenschieber: Gilt nur, wenn die Phasen letztendlich wirklich alle zu 120° verschoben sind? Könnte problematisch sein, die Phasenverschiebung sollte zur Not anpassbar sein Trotzdem vielen Dank für die Alternativ-Vorschläge!
:
Bearbeitet durch User
@Martin S. (morton) >> das kostet einen atmga nur ein müdes Stirnrunzeln. >Klingt interessant, auch wenn ich da jetzt erst mal schauen muss, wie >man das Ganze anpacken kann. Vergiss PWM in Software, du hast ja jetzt genug PWMs. >Danke, den 1284p habe ich vorhin geordert (bietet 6 PWM's). Der Flieger >ist mittlerweile ein Flugsimulator und steht glücklicherweise fest am >Boden, Gefahr für Leib und Leben besteht da nicht :) Na dann ist da ja alles OK. Es hätte mich auch schon gewundert, wenn man Hobbybastler an Flugzeugen rumschrauben lassen würde. >Hardware-PWM gemäß https://www.mikrocontroller.net/articles/AVR_PWM mit >Tiefpassfilter der noch hinzukommt? Ja. https://www.mikrocontroller.net/articles/Pulsweitenmodulation#RC-Filter_dimensionieren >Produkt-Filter finde ich DDS mit max. 4 Channels, welche dann jedoch >auch 32 Pins haben - klingt für das AVR-NET-IO nach zu vielen Pins, die >angesteuert werden müssen. Nö. Die meisten DDS-ICs werden per SPI angesteuert, da braucht man gerade mal 3 + N Pins, um N ICs anzusteuern. >Dann wohl doch lieber PWM. Das ist schon OK und vor allem hast du mehr Kontrolle über die Signalgenerierung. Denn Wenn deine DDS-ICs von außen nicht synchronisiert werden können, wird es mit den 6 synchronen Signalen schwierig. >werden und der Rest ist dann die Software-Umsetzung, womit letztendlich >6 Sinussignale realisiert werden können? Ja http://www.mikrocontroller.net/topic/goto_post/3098563 Siehe auch DDS. >- Einstellbare Phasenverschieber = Neuland, werde ich mir aber trotzdem >mal anschauen Vergiss es, das macht man heute so weit wie möglich digital! >Jesper-DDS: zu CPU-lastig lt. Kommentar?! Vergiss es, dann dann kannst du deine Ethernetverbindung vergessen. >- Oszillator + Phasenschieber: Gilt nur, wenn die Phasen letztendlich >wirklich alle zu 120° verschoben sind? Könnte problematisch sein, die >Phasenverschiebung sollte zur Not anpassbar sein Dito. Mit 6xPWM im AVR bist du Up to date, alles anderes ist mehr oder minder Schnee von gestern.
Martin S. schrieb: > Die per Oszilloskop > gemessenen Signale am Synchro/Kreisel (--> soll hier durch die > µC-Steuerung ersetzt werden) waren nicht immer 120° phasenverschoben, > was aber nach meinem Kenntnisstand ein wenig gegen die Funktionsweise > eines Synchros spricht. Die Signale eines Synchros sind auch nicht um 120° verschoben. Bei einer Drehung von 360° ergibt sich sozusagen für jedes Synchrosignal eine Amplitudenmodulation des Trägersignals mit 400 Hz, wobei dabei die Hüllkurven der drei Synchrosignale drei um 120° verschobene Sinussignale darstellen. Vgl. https://de.wikipedia.org/wiki/Datei:Drehmelderspannungen.png
Martin S. schrieb: > Danke, den 1284p habe ich vorhin geordert (bietet 6 PWM's). Der bietet sogar 8, er hat nämlich 4 PWM-fähige Timmer mit je zwei Kanälen. Naja, sicher nicht schlimm, einen Extra-Timer kann man immer gebrauchen...
Falk B. schrieb: > @Martin S. (morton) >>Hardware-PWM gemäß https://www.mikrocontroller.net/articles/AVR_PWM mit >>Tiefpassfilter der noch hinzukommt? > > Ja. > > https://www.mikrocontroller.net/articles/Pulsweitenmodulation#RC-Filter_dimensionieren Macht es hier ggf. Sinn, einen Mehrkanal-LTC einzusetzen um sich aus Zeitgründen das Dimensionieren und Realisieren der Filter zu ersparen? Und ggf. auch um eine Fehlerquelle auszuschließen/zu minimieren? z.B. 2x LTC2645 (4-Kanal) in 10-Bit Auflösung? Vielleicht habe ich gerade ein Brett vorm Kopp, aber hat man an den Ausgängen vom LTC dann direkt ein analoges Signal? c-hater schrieb: > Martin S. schrieb: > >> Danke, den 1284p habe ich vorhin geordert (bietet 6 PWM's). > > Der bietet sogar 8, er hat nämlich 4 PWM-fähige Timmer mit je zwei > Kanälen. Naja, sicher nicht schlimm, einen Extra-Timer kann man immer > gebrauchen... Tatsache, da war die Beschreibung bei microchip.com fehlerhaft. Im Datenblatt sind auch von 8 PWMs die Rede. Rudolph schrieb: > Martin S. schrieb: >> Die per Oszilloskop >> gemessenen Signale am Synchro/Kreisel (--> soll hier durch die >> µC-Steuerung ersetzt werden) waren nicht immer 120° phasenverschoben, >> was aber nach meinem Kenntnisstand ein wenig gegen die Funktionsweise >> eines Synchros spricht. > > Die Signale eines Synchros sind auch nicht um 120° verschoben. Bei einer > Drehung von 360° ergibt sich sozusagen für jedes Synchrosignal eine > Amplitudenmodulation des Trägersignals mit 400 Hz, wobei dabei die > Hüllkurven der drei Synchrosignale drei um 120° verschobene Sinussignale > darstellen. > > Vgl. https://de.wikipedia.org/wiki/Datei:Drehmelderspannungen.png Okay... da fehlt mir dann das tatsächliche Hintergrundwissen zum Genauen Funktionsprinzip. Ehrlich gesagt tue ich mich da etwas schwer, das zu durchblicken. Ist aber vermutlich im aktuellen Projektstatus nicht mehr essentiell, da wir die hardware- und softwareseitige Basis kreieren - wie letztendlich die Sinussignale exakt aussehen werden müssen, damit die Anzeige im Cockpit sich richtig positioniert, müssen wir zur Not an eine nächste Projektgruppe übergeben, auch wenn das nicht Ziel der ganzen Sache war.
Martin S. schrieb: > Ich denke DDS ist hier das Mittel der Wahl Suche magic sinewaves, genau dafür gemacht http://www.mdr.de/thueringen/sued-thueringen/suhl-bungalow-steinsfelder-abrissgebiet-baugenehmigung-100.html
So etwas einfaches würde ich mit einem aktiven Allpass aufbauen. Das ist ein OpAmp mit 3 Widerständen und 1 Kondensator. Für 400Hz Sinus entweder digital per PWM und Filter l oder als Wien Robinson Oszillator. Daran einen Allpass der 120° schiebt, und daran wieder einen. Schon hast du 3x 400Hz mit je 120° Phasenverschiebung. Für die einstellbaren Amplituden einfach noch 6 OpAmps mit Poti. Das brutzelt man in weniger als einem Tag auf Lochraster (inkl. Widerstände matchen)
@ Martin S. (morton) >https://www.mikrocontroller.net/articles/Pulsweite... >Macht es hier ggf. Sinn, einen Mehrkanal-LTC einzusetzen um sich aus >Zeitgründen das Dimensionieren und Realisieren der Filter zu ersparen? >Und ggf. auch um eine Fehlerquelle auszuschließen/zu minimieren? Bleib cool! So eine Filterdimensionierung ist kein Hexenwerk. >z.B. 2x LTC2645 (4-Kanal) in 10-Bit Auflösung? Vielleicht habe ich >gerade ein Brett vorm Kopp, aber hat man an den Ausgängen vom LTC dann >direkt ein analoges Signal? Ja, hat man. Ist aber was für Weicheier, die Angst vor einem einfachen Tiefpaß haben. Einfache Rechnung. AVR @ 16 MHz mit 10 Bit PWM macht ~ 16kHz PWM Frequenz. Die höchste und hier einzige Ausgangsfrequenz ist 400 Hz, dazwischen liegt der Faktor 40, das sind 1,6 Dekaden. Bei 10 Bit braucht man aber einen Dämpfungsfaktor von ca. 1000, wenn man die Rauschgrenze auf die Auflösungsgrenze drücken will. Braucht man hier wahrscheinlich nicht, denn die Anzeigeeinheit des künstlichen Horizonts ist wahrscheinlich nicht sooo sensibel bezüglich Rauschen. Ein einfacher Tiefpaß 2. Ordung mit 400 Hz Grenzfrequenz baut man mit einem OPV und der Sallen-Key Schaltung auf, der macht 40 db/Dekade bzw. ca. 50db/ 1,6 Dekaden, das ist schon Faktor ~300. Das sollte praktisch reichen.
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.