Präzessionsgenerator

Gast #2363649
Lesenswert?

Hallo zusammen,
bin gerad dabei einen präzisen 1,2 kHz Generator zu bauen. Dabei rechnet 
mir ein Atmega eine Sinustabelle aus, speichert sie in den eigenen SRAM 
und ruft sie dann zur Laufzeit draus ab. Über einen 8-Bit DA-Wandler 
wird anschließend der Sinus geformt.
Wenn man nun zwei dieser Schaltungen aufbaut und mit dem selben externen 
Takt beispielsweise aus einem Sinusgenerator speist, sollte davon 
auszugehen sein, dass beide von den Atmegas generierten Signal 
zeitgleich einheitlich  ausgegeben werden. Vielleicht Phasenverschoben 
da der Einschaltmoment nicht 100% der Selbe sein wird. Leider muss ich 
aber feststellen das die Signale zueinander driften. Nun meine Frage wie 
kann das sein.

- Beide At-Megas arbeiten mit dem selben Takt ( aus einer Quelle )
- Beide At-Megas führen identischen Quellcode aus
- Beschaltung beider At-Megas ist komplett identisch

Gemessen wird mit einem Oszi auf zwei Kanälen. Zu Beginn werden die 
Nulldruchgänge der Signale mit Markern versehen. Nach einer Stunde liegt 
das nicht getriggerte Signal 20 µs neben den zuvor bestimmten Marker. 
Ein Messfehler ist somit eigentlich ausgeschlossen.

Nachdem der Takt der At-Megas identisch ist, kann es nur an den Megas 
selbst liegen. Meine Vermutung sind die Diskriminatoren die den Takt 
auswerten. Allerdings findet man in keinen Datenblatt Angaben zu solchen 
Merkmalen. Deswegen wollte ich mal Nachfragen was ihr davon haltet.

Verwendet wird ein AT-Mega 128 mit Taktfreq. 8 MHz

Mfg CS
Gast #2363718
Lesenswert?

Das Programm ist wenig spektakulär. Zu meiner Schande ist es in Bascom 
geschrieben.

In der Hauptschleife, welche den Sinus erzeugt wird lediglich der Port 
neue zugewiesen. 630 Punkte ergeben einen Sinus. Die berechneten 
Sinuswerte stehen in Buffer(j). Ein Bytearray welches eben 630 Bytes 
tief ist. Das funktioniert an sich recht gut.

Code:

Do

   For J = 1 To 630 Step 1

      Porta = Buffer(j)

   Next

Loop


Zum Thema DC-Offset. Das Oszi misst AC und nach dem DA-Wandler sitzt 
eine OP-Stufe zur Pegelanpassung. Ausgekoppelt wird diese über 1µF. Ein 
DC-Offset kann ich mir damit schwer vorstellen. Ist aber ein 
interessanter Ansatz. Ich muss ehrlich zugeben ein Messfehler in der 
Form kam mir noch nicht in den Sinn.
Gast #2363729
Lesenswert?

Pfffährt schrieb:
> In diesem Falle könnte man auch feuchten Torf nehmen.

Man könnte auch einfach nur posten wenn man was zum Thema zu sagen hat. 
Ich denke jedem ist klar, dass das nicht der Endzustand ist. Geplant ist 
den Takt über Ofenoszillatoren zu erzeugen, welche nur 1-2 ppm 
Schwankungen unterliegen. Solang der gleiche Takt aber nicht das Ziel 
erfüllt, bringt es wenig darauf einzugehen.
#2363782
Lesenswert?

Das einer der beiden µC Takte verliert erscheint mir auch sehr 
ungewöhnlich. Ich würde auch eher auf ein Problem im der Auswertung 
tippen.

Lässt sich aber verifizieren.
Vertausch mal die Messkanäle und miss noch mal 1 Stunde. Wenn der 
'Fehler' dann auf den anderen Kanal mitgegangen ist, steigen die Chance, 
dass es was mit den µC zu tun hat.
#2363799
Lesenswert?

Ist da sichergestellt,dass nicht irgendwelche Interrupts am Programm 
beteiligt sind?

Nur wenn das oben aufgeführte Programm alleine abläuft, entsteht die 
exakte Frequenz, sonst mischen irgendwelche Interrupts mit, die den 
Sinusverlauf in fast zufälliger Weise unterbrechen.

Eine andere Möglichkeit wäre, dass durch verschiedene Empfindlichkeit 
der beiden Aufbauten gegen Störimpulse der Programmablauf ins "Stottern" 
kommt.

Die nächste Version ist, dass der Takt keine genauen Flanken hat, sodass 
beide oder einer der Kontroller einzelne Flanken verpasst.
#2363820
Lesenswert?

CS schrieb:
> Zum Thema DC-Offset. Das Oszi misst AC und nach dem DA-Wandler sitzt
> eine OP-Stufe zur Pegelanpassung. Ausgekoppelt wird diese über 1µF. Ein
> DC-Offset kann ich mir damit schwer vorstellen.

Dann lass dir doch einfach einen Sägezahn ausgeben und zähle die 
Bitwechsel des MSB mit jeweils einem Ereigniszähler. Wenn die Zahlen 
dann auseinander laufen, würde ich wirklich mißtrauisch werden.

Was sind das denn für DA-Wandler? mit R2R aufgebaut? Dann weichen die 
Wandler schonmal voneinander ab.
Analoge Signalverarbeitung ist beteiligt(der OP und 1µF), Leckströme und 
leichtes (thermisches) Weglaufen der OPV tut auch das seine.
Wie sieht die Stromversorgung aus? Netzgekoppelt? Dann kommen von da 
auch Störungen rein.

Kann man das nicht auch mit einem einzigen Controller lösen?
Wie Präzise muss es denn sein?

Wenn du zwei 8bit D-Latches nimmst, und denen einen synchronen Latchpuls 
gibst, werden die Ausgangszustände beider nahezu gleichzeitig 
aktualisiert.
Wenn die Pins des µC nicht reichen, vielleicht einen Port nehmen und pro 
Kanal zwei Latches "hintereinander" schalten.
1
___                  _____         _____
2
   |   8        8   |Latch|   8   |Latch|   8
3
 PA|===/===##===/===| 1A  |===/===| 1B  |===/===DA1
4
   |       ||   1A--|>____|    B--|>____|
5
PB1|--1A   ||        _____         _____
6
PB2|--2A   ||   8   |Latch|   8   |Latch|   8
7
PB3|--B    ##===/===| 2A  |===/===| 2B  |===/===DA2
8
   |            2A--|>____|    B--|>____|
9
___|
Programmcode als Pseudocode:

-Programmcode Beginn-
Do

Analogwert 1 berechnen/aus Tabelle lesen
Analogwert 1 auf PA ausgeben
Latchpuls 1A setzen
Latchpuls 1A löschen

Analogwert 2 berechnen/aus Tabelle lesen
Analogwert 2 auf PA ausgeben
Latchpuls 2A setzen
Latchpuls 2A löschen

Latchpuls B setzen
Latchpuls B löschen

Loop
-Programmcode Ende-

mfg mf
#2363846
Lesenswert?

Wo gerade von den Latches gesprochen wird:

Ich habe auch so eine Schaltung mit 2 mal DAC08.
Da habe ich 3 stck LS373 (oder 374) drinne.
Da wird das eine 8 bit Latck vorgeladen und wenn ich den 2ten Kanal
schreibe wird der vorgeladene wert zeitsynchron auf das 2te Latch
durchgereicht.

Wenn man die Ausgabeschleife dann in Inlineassembler mit
Indexregister x und Y macht wird es sogar recht schnell.

Klaus
#2363857
Lesenswert?

Rufus Τ. Firefly schrieb:
> Präzession ist etwas komplett anderes als Präzision,

korrekt.

> und ob man
> Präzession mit einem Generator herstellen kann, wage ich zu bezweifeln.

[Loriot modus]
Ach.

[/Loriot modus]

Es ist sogar trivial dies herzustellen.

Denn: Die Präzession ist allgemein die Richtungsänderung der Achse eines 
rotierenden Körpers.

D.h. z.B. ein Handstreich genügt am Kresiel.
Ob man denjenigen der diesen Handstreich auf Anforderung ausführt als 
Generator bezeichnen will. Oder als Experimentator. Nun denn.

Ach.
Gast #2363863
Lesenswert?

Wow danke für die vielen Antworten. Ich weis gar nicht wo ich anfangen 
soll ;)

Das Signal läuft kontinuierlich über die Zeit. In 10 Stunden ist es um 
knapp 90° "gewandert". Bei runden 1,2 kHz ca. 200 µs.

Messkanäle wurden auch schon vertauscht. Sachverhalt hat sich mit 
gedreht ;) Hinsichtlich der Tatsache, dass immer auf Kanal 1 getriggert 
wird auch irgendwie sinnig.

Interrupts sind alle Disabled. Es werden wirklich lediglich die Zeilen, 
wie zuvor beschrieben, ausgeführt. Ein Reset kann auch nicht sein, da zu 
Beginn des Programms auf den zweiten Controller gewartet wird. Ein 
Taster lässt beide in die Schleife rennen und den Sinus generieren.

Der Takt ist ein sauberer Sinus. Keine Glitches, Störimpulse oder 
sonstiges überlagert. Wird an einen zweiten Oszilloskop mit geschnitten.

Mini Float schrieb:
> Was sind das denn für DA-Wandler? mit R2R aufgebaut? Dann weichen die
> Wandler schonmal voneinander ab.
> Analoge Signalverarbeitung ist beteiligt(der OP und 1µF), Leckströme und
> leichtes (thermisches) Weglaufen der OPV tut auch das seine.
> Wie sieht die Stromversorgung aus? Netzgekoppelt? Dann kommen von da
> auch Störungen rein.

Die DA-Wandler sind mit R2R aufgebaut. Sicherlich ein gewisses Problem. 
Einen systematischen Drift würde ich dem R2R Netzwerk dennoch nicht 
zuschreiben. Auch thermisches einwirken usw. spielt sicher eine Rolle. 
Aber im µS Bereich? Der systematische Drift macht sorgen. Würde der 
Sinus um +-1 µs schwanken ok. Aber er entfernt sich kontinuierlich ca. 
20 µs die Stunde. Irgendwie muss das doch bedeuten das entweder falsch 
gemessen wird und der Messfehler sich aufsummiert, oder der Takt von 
einem Controller schneller interpretiert wird als vom anderen. Deswegen 
auch mein anfänglicher Tipp auf die Diskriminatoren welche den Takt 
auswerten.

Zwei µC sind notwendig da die Referenzen räumlich von einander getrennt 
werden müssen. Dabei sollten die generierten Signal auf +-1µS genau 
laufen.
#2363869
Lesenswert?

Ergänzung ...an Autor: CS (Gast)

Wenn du Interesse hast das ganze auf einem Prozessor mit den
3 Latches laufen zu lassen kann ich dir gern die Software heraussuchen
und eine grobe Schaltskizze machen.
Ich müsste dann allerdings auch noch ein wenig in der Software
kommentieren, da es bei mir an sowas immer mangelt.

Software ist in Bascom mit Assembler für die Ausgabe.
Aus Gründen der Geschwindigkeit ist die  Tabelle für jeden Kanal
aber nur $FF lang.

Er kann Sinus , Dreieck und Rechteck mit einstellbarem Duty.
Zudem kann die Phase der beiden Kanäle in 1/255zigtel Schritten
eingestellt werden.

Bedienung läuft über terminalprogramm.

Klaus
#2363874
Lesenswert?

CS schrieb:
> Der Takt ist ein sauberer Sinus. Keine Glitches, Störimpulse oder
> sonstiges überlagert. Wird an einen zweiten Oszilloskop mit geschnitten.

Das ist doch unschön. Wenn du einen Fehler suchst würde ich diese
Fehlerquelle mal zunächst ausschliessen und einen integrierten
Quarzoscillator einsetzen. der Schmitttrigger im Atmel hat auch eine
Drift.

Klaus
#2363901
Lesenswert?

Kommt mir auch ein wenig komisch vor.

Kannst du den Datenstrom zu den DAC`s messen?
Kannst du den Punkt wann die Spannung wieder Steigt messen?

Ich vermute mal auf einen unterschiedlichen Temperaturdrift der DAC`s 
wodurch die Zeiten gleich sind aber die Spannungen sich verschieben

 Hab ein wenig mit dem Abschicken gebraucht .. hat sich ja schon 
erledigt
Gast #2363937
Lesenswert?

Klaus De lisson schrieb:
> der Schmitttrigger im Atmel hat auch eine
> Drift.

Das würde aber nur Schwankungen ergeben, keine kontinuierliche 
Verschiebung. Denn Takte dazuerfinden oder weglassen kann der 
Schmitttrigger wohl kaum.

Fuses auf internen Taktgeber überprüfen. Wobei dann eigentlich die 
Verschiebung stärker sein müsste.

Ansonsten mal mit Kältespray die AVRs, die DACs und die OPVs testen, ob 
sich da eine Änderung ergibt.
Gast #2364109
Lesenswert?

Laufen denn die µC überhaupt mit dem externen Takt ?  Ohne umstellen der 
Fuses wird nur der interne Takt genutzt, auch wenn ein externer Takt 
anliegt.
Bei einem externen 8 MHz Takt könnte es eventuell passieren das man eine 
nicht vorgesehene, und nicht perfekte Synchronisation des internen 
Taktes auf den externe bekommt - das könnte die so geringe Drift 
erklären.

Wie schon geschrieben, sollte die Aufgabe auch 1 µC erledigen können, 
auch schon ein etwas kleinerer.
Gast #2364132
Lesenswert?

Eine Veröffentlichung des Maschinencodes, der auf den AVRs läuft 
(BASCOM-Compilat?) bspw. zur Kontrolle auf tatsächliche 
"Interrupt-Freiheit" (oder doch ein "versteckter" 
Timer/IOHandler/Scheduler?) sowie eine schematische Darstellung des 
Versuchsaufbaus, die "im Bild" anstelle von aneinandergereihten 
"Lesungen zum Verdrahtungsplan" u.a zweifelsfrei erkennen läßt, welches 
Taktsignal (z.B. Frequenz, Pegel, Wellenform) auf welchem Weg (z.B. 
Leitungswege, galvanisch oder kapazitiv) die AVRs erreicht, wäre gewiß 
sinnvoller, als hier weiter mit "Bleiguß in Glaskugeln" 
herumzuphantasieren.

;-)
Persönliche Seite #2364150
Lesenswert?

Timm Thaler schrieb:
> Klaus De lisson schrieb:
>> der Schmitttrigger im Atmel hat auch eine
>> Drift.
>
> Das würde aber nur Schwankungen ergeben, keine kontinuierliche
> Verschiebung. Denn Takte dazuerfinden oder weglassen kann der
> Schmitttrigger wohl kaum.

Doch, da hat Klaus schon recht.... aber die beschriebene Drfit von
"knapp 90°" halte ich dafuer doch zu gross.

CS sollte wirklich mal das tun, was ihm hier schon mehrfach empfohlen 
wurde:

1. Kein Sinus sondern Rechteck als Takt
2. Selektiv Temperatureinfluesse pruefen
3. Schaltung posten
4. Assemblerlisting posten
5. Fuses posten



gruss

Michael
Persönliche Seite #2364190
Lesenswert?

Axel Gartner schrieb:
> Simon K. schrieb:
>> Es ist bisher völlig offen, wie du die Mikrocontroller synchronisiert
>> hast.
> Er schrieb doch: Ein Sinus für beide.

Ulrich schrieb:
> Laufen denn die µC überhaupt mit dem externen Takt ?  Ohne umstellen der
> Fuses wird nur der interne Takt genutzt, auch wenn ein externer Takt
> anliegt.

Das meinte ich.
#2364259
Lesenswert?

CS schrieb:

> Das Signal läuft kontinuierlich über die Zeit. In 10 Stunden ist es um
> knapp 90° "gewandert". Bei runden 1,2 kHz ca. 200 µs.
>

Das sind also in 10 Stunden 1/4 Schwingung bei 1200 Hz.

also eine relative Abweichung von 1 zu  (4 x 1200 x 10 x3600) = 
(127,8 EXP 6)

Es kann sich also wirklich nur um ein gelegentliches "Stolpern" im 
Programmablauf handeln, z.B. dass sich einer der beiden Kontroller wegen 
geringerer Störsicherheit einen peak einfängt.

Ohne Bild vom Aufbau, Schaltbild , Code usw. wird das nichts.

Wenn Du weiter herum-geheim-nistest, mach den Dreck alleene.

So ist jeder getippte Buchstabe umsonst.
Persönliche Seite #2364291
Lesenswert?

Simon K. schrieb:
> Es ist meiner Meinung nach höchst unwahrscheinlich, dass der Prozessor
> "stolpert". Das Problem werden wohl einfach die falsch gesetzten
> Fusebits sein.

Hallo Simon,
Du meinst also, beide uC laufen auf internem Oszillator und 
nicht-synchron?
Dann waere das aber ungefaehr wie 6 Rchtige im Lotto: Die internen 
Oszillatoren sind dermassen daneben, da sind <0.03ppm m.E. nicht drin!

Oder hast Du da bessere Erfahrungen gemacht?

Ich habe bisher mit dem internen Oszillator nicht mal eine RTC basteln 
koennen, die bei Austausch des uC nicht mindestens 10  Minuten in der 
Woche falsch ging!


Gruss
Michael
#2364943
Lesenswert?

Was ich zum Thema Präzision noch anmerken wollte:

CS schrieb:
> Code:
>
> Do
>
>    For J = 1 To 630 Step 1
>
>       Porta = Buffer(j)
>
>    Next
>
> Loop

Ich weiß nicht was Bascom für einen Code ausspuckt, aber vermutlich 
werden für die äußere Schleife ein paar Extra-Takte anfallen. Der 
erzeugte Sinus hat also kleine Plateaus, die Samples werden dort nicht 
gleichmäßig erzeut. Ergibt einen gewissen Klirrfaktor. Keine Ahnung ob 
das für die Anwendung relevant ist, aber ich hebe mal vorsichtshalber 
den Finger.

Jörg
Gast #2364956
Lesenswert?

Solange man bei AVR die Fuses nicht verstellt, läuft der mit dem 
internen Takt, unabhängig davon ob man zusätzlich einen externen Takt 
anlegt. Wenn alles so wäre wie anfangs beschrieben sollten die beiden µC 
synchron laufen und es gäbe keine Problem.

Um den weiter aktiven internen Takt auszuschließen sollte der TO endlich 
mal verraten was in den Fusebits der beiden µC steht.
Gast #2365866
Lesenswert?

Hallo zusammen,

Jörg H. schrieb:
> Ich weiß nicht was Bascom für einen Code ausspuckt, aber vermutlich
> werden für die äußere Schleife ein paar Extra-Takte anfallen. Der
> erzeugte Sinus hat also kleine Plateaus, die Samples werden dort nicht
> gleichmäßig erzeut. Ergibt einen gewissen Klirrfaktor. Keine Ahnung ob
> das für die Anwendung relevant ist, aber ich hebe mal vorsichtshalber
> den Finger.

Sehr richtig! Direkt nach dem R2R Netzwerk ist dies, wenn auch minimal, 
noch zu sehen. Die Op-Stufe sowie ein nachgelagert Tiefpass filtern das 
Signal dann aber soweit, dass dieses Plateaus nicht mehr merklich zu 
registrieren sind. Dennoch danke für den Hinweis.

Die Fuses stehen selbstverständlich auf externen Takt. Benutzt man das 
interne RC-Glied ist an Synchronität nicht zu denken. Den Takt auf ein 
Rechteck umzuschalten ist zwar im Testaufbau möglich, im späteren 
Einsatz jedoch nicht da hier ein stabiler Oszillator mit 0.003 ppm/Tag 
den Takt erzeugt.
Nachdem die Stellen Takt, LSB des µC, Ausgang R2R Netzwerk gemessen 
hatte, konnte ich den Fehler eingrenzen. Eindeutig erzeugte der µC den 
Drift. Da ich mir nicht vorstellen konnte, wie die Hardware des µC dies 
bewerkstelligen soll und wie die Diskussion gezeigt hat, hier auch 
keiner :D, ist der Code in Assembler implementiert worden. Sie da, der 
Drift ist nicht mehr vorhanden. Mein Tipp ist nun der Compiler, bzw. 
irgendwelchen ungewollten Sprünge die sich bei µC A von B unterscheiden.

Leider sitze ich gerad vor einem anderen PC auf welchen die Software des 
µC nicht gespeichert ist. Ich werde die Tage den Basic Code posten. 
Vielleicht fällt euch etwas auf was ich übersehen hab. Das Statement

"Disable Interrupts"

findet sich aber definitiv im Code :D


Ich möchte mich an der Stelle bei allen hier für die Anregungen und 
Hinweise bedanken.


MFG CS

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren