Hallo,
ich möchte ein BAS Signal (von einer s/w Kamera) mit dem Atmega328p
auslesen.
Als erstes habe ich mir eine Schaltung entworfen (teilweise empirisch,
aber funktioniert), die die Sync Signale als Flanken ausgibt. Mit einem
12MHz Atmega8 im Free-Running ADC Modus (Prescaler 2 (niedrigster)).
Schaffe ich geschätzt 50 Bildpunkte in einer Zeile auszulesen. Die
Genauigkeit ist so knapp 6bit würd ich schätzen. So weit so gut.
Es geht um ein Standbild. Ziel ist es am Ende spaltenweise auszulesen.
So hat man mehr Zeit die Daten zu verarbeiten.
Jetzt habe ich mir einen Atmega328p genommen und diesem einen 20MHz
Quarz verpasst. Jetzt gibt es das Problem, dass er nur Highbits einließt
sobald der Prescaler auf 2 ist. Niedriger ist für ihn kein Problem.
Testen kann man das ja immer, wenn man "Clk Div 8" bei den Fusebits
einstellt.
So der Takt ist dem ADC zu schnell. Schade. 3Bit Auflösung würden
wahrscheinlich auch schon reichen. Da ich das Bild ja Spaltenweise
auslesen will, muss es nicht unbedingt der Free-Running Modus sein.
Frage 1: Gibt es eine Möglichkeit den ADC auch bei 20MHz zum laufen zu
bringen?
Frage 2: Habt ihr einfache Schaltungsvorschläge für ein externes
Sample&Hold, so dass der ADC gemütlich ausgelesen werden kann?
Mein Traum wären 200 Helligkeitswerte Horizontal.
Wie gesagt, es reicht erstmal 1 Wert pro Zeile. Im nächsten (Halb)Bild
wird dann der Nachbarpixel eingelesen. So bleibt Zeit, die Daten zu
verarbeiten.
Es handelt sich um eine Spielerei+Lerneffekt. Das Bild wird dann auf
einem Kassenbondrucker ausgegeben. Quasi Sofortbildkamera.
MfG
Von Cypress gibts einige FIFOs, die deine ADC Daten in Echtzeit entgegen
nehmen und dann vom uC langsam ausgelesen werden können.
Die sind teilweise so groß, dass das gesamte Videobild reinpasst (144
Mbit).
Oopsie, sehe gerade, dass das nen bischen sehr teuer ist (200 EUR+).
Aber der FIFO muss ja nicht so riesig sein. Guck mal bei den üblichen
Verdächtigen (z.B. TI), ob da was brauchbares und bezahlbares zu finden
ist.
Problem ist (erstmal) nicht die Datenmenge, sondern die Samplingzeit.
Das S&H Glied / bzw. der ADC sollte ja (im Idealfall) nur so ca 250nS
sampln. Ich habe aber noch genug IO-Ports frei für externe Dinge.
(Komperatorlösung?! / externer ADC ?! / S&H?!)
Der allseits beliebte STM32F407VG Mikrocontroller kann bis 6 MHz bei
12bit samplen und diese Datenmenge dank DMA auch verarbeiten. Das reicht
für über 200 Werte pro Zeile, bei jedem Frame.
Dr. Sommer schrieb:> Der allseits beliebte STM32F407VG Mikrocontroller kann bis 6 MHz bei> 12bit samplen und diese Datenmenge dank DMA auch verarbeiten. Das reicht> für über 200 Werte pro Zeile, bei jedem Frame.
Wenn du schon mit STM32 daherkomst, dann nimm modernere Derivate, nicht
solchen mittelalterlichen Schrott. Das Ding ist 10 Jahre alt, und
entsprechend angegraut ist die Peripherie.
Wie die G4-Serie zum Beispiel.
Danke, das sieht vielversprechend aus. Paralleler ADC ist super.
Nur woher bezieht man den, im besten Fall nicht mehr als 3 Stück. Segor
hat ihn leider nicht mehr, C0nrad schon garnicht und Reichelt leider
auch nicht. Vielleicht gibts da einen Ersatztyp?
Uuii sorry, hab die anderen Posts noch nicht gelesen. STM32 wäre eine
Lösung, die ich dann vermutlich erst in einem halben Jahr umsetzen
würde. Mir das zu erarbeiten schaffe ich nicht an zwei Wochenenden.
Rechenknecht schrieb:> Problem ist (erstmal) nicht die Datenmenge, sondern die Samplingzeit.> Das S&H Glied / bzw. der ADC sollte ja (im Idealfall) nur so ca 250nS> sampln.
Richtig. Deswegen wirst du mit dem integrierten ADC auch nicht weit
kommen. Dessen Samplingzeit ist 1.5 Perioden des ADC-Taktes. Und der
geht nur bis ~1MHz.
Ein externes S&H Glied würde helfen. Das Timing (Lage bzgl.
Synchronsignal) und die Länge des Sample-Impulses ist dann zwar immer
noch kritisch, aber immerhin machbar. Evtl. könnte es sinnvoll sein, die
Taktfrequenz des AVR per PLL fest mit dem Videotiming zu verkoppeln.
Das Ausgangssignal der S&H Stufe kannst du dann mit dem internen ADC
erfassen. Wenn das ein Standbild ist, hast du ja genug Zeit.
@ Axel S. (a-za-z0-9): Das war auch meine erste Idee. Ich habe ja ein
paar µS Zeit. Vielleicht reicht ja schon ein Impedanzwandler OPV +
"Schalter"+Kondensator ->ADC(vom µC). Der OPV zieht den C auf den
Helligkeitspegel. Der ADC von µC wird den nicht so schnell leer ziehen.
Muss dann mal tüfteln, wie ich das mit dem "Schalter" löse. Optokoppler
fällt ja bei den Geschwindigkeiten aus.
Wie ich den Takt (zwecks Wartezeiten) mit dem BAS Signal synchronisieren
muss werde ich sehen. Vom Gefühl her würde ich sagen, dass es gehen
sollte. Meinst du die Zeilen würden unterschiedlich skaliert dargestellt
werden ? Der H-Sync geht direkt auf den Int0.
Zum ADC: Beim AtMega8 (mit 12MHz) kann ich die ADC Frequenz wohl bis auf
6 MHz einstellen (Teiler 2). Ich sehe auf dem Monitor dann schön die
Zeile aus 50 bis 70 Helligkeitswerten.
Moin,
Rechenknecht schrieb:> Frage 2: Habt ihr einfache Schaltungsvorschläge für ein externes> Sample&Hold, so dass der ADC gemütlich ausgelesen werden kann?> Mein Traum wären 200 Helligkeitswerte Horizontal.
Hm - im Datenblatt les ich was von: "The ADC contains a Sample and Hold
circuit which ensures ... blabla"
Schon mal probiert, den ADC nur so schnell zu takten, dass er in 64µsec
fertig gewandelt hat, dann den immer nur einmal in jeder Videozeile
anstossen, und dann in jedem (Halb)Bild die Zeit zwischen Hsync und ADC
start ein bisschen zu erhoehen? Keine Ahnung ob die ominoese interne S&H
Schaltung mit einem Videosignal zurechtkommt...
Gruss
WK
Hi!
Wie wäre es mit einem lf398 als s&h? Du mußt den Systemtakt allerdings
wirklich auf Deine Videoquelle synchronisieren, sonst gibt das nur
Generve mit der Bildstabilität.
Dergute W. schrieb:> Schon mal probiert, den ADC nur so schnell zu takten, dass er in 64µsec> fertig gewandelt hat, dann den immer nur einmal in jeder Videozeile> anstossen, und dann in jedem (Halb)Bild die Zeit zwischen Hsync und ADC> start ein bisschen zu erhoehen?
Du meinst immer nur ein Pixel je Zeile abtasten? Beim ersten Bild das
erste Pixel jeder Zeile, beim 2. Bild das 2. Pixel jeder Zeile, ... der
Abtastzeitpunkt muss mit der Zeitauflösung eines Pixels verschoben
werden können, aber schicke Idee. Quasi das was manche Oszilloskope mit
dem Equivalent-Time sampling machen.
Früher gab es mehr AD-Wandler speziell für Video, z.B. den TDA8703 von
Philips. Den hatte Reichelt im Programm, heute ist er ausgestorben.
Dann gab es noch ein paar höher integrierten RGB-Video-Wandler wie den
TDA8708, die PAL/NTSC/SECAM-Signale decodierten und als digitale
RGB-Daten ausgaben. Die findet man auf alten TV-Karten für den PC mit
PCI-Bus.
Moin,
-gb- schrieb:> Du meinst immer nur ein Pixel je Zeile abtasten?
Yep. Der ADC im AVR ist halt nicht direkt fuer Videoabtastung gedacht.
Und der Rest auch nicht fuer die daraus resultierenden Datenraten. Aber
so kann man die Datenrate um den Faktor 864 erniedrigen und ist dann mit
15.625 KSamples/sec in einem Bereich wo im AVR schon was gehen kann -
wenn man nicht troedelt.
Gruss
WK
Ich habe nicht viel Ahnung über die internas vom AVR,
aber eine Idee: betreibe den ADC differentiell:
1
OPAMP--+--| ADC+
2
| |
3
C |
4
| |
5
+----| ADC-
6
+----| IOP
- zum samplen IOP auf Masse schalten, der OPAMP kann dann gegen Masse
arbeiten, ADC- ist fest
- zum Messen IOP floaten lassen (Input ohne pullup), der OPAMP
verschiebt dann beide Eingänge parallel kann sie aber nicht mehr
gegeneinander verschieben.
Eventuell reicht das für deine Spielerei
Rechenknecht schrieb:
[externe S&H]
> Das war auch meine erste Idee. Ich habe ja ein> paar µS Zeit. Vielleicht reicht ja schon ein Impedanzwandler OPV +> "Schalter"+Kondensator ->ADC(vom µC). Der OPV zieht den C auf den> Helligkeitspegel. Der ADC von µC wird den nicht so schnell leer ziehen.> Muss dann mal tüfteln, wie ich das mit dem "Schalter" löse. Optokoppler> fällt ja bei den Geschwindigkeiten aus.
S&H Stufen gibt es als fertige IC. Der Klassiker wäre der LF198 - der
könnte aber evtl. etwas langsam sein. Als Schalter nimmt man einen FET
bzw. einen CMOS-Analogschalter. Wenn es schnell sein muß, darf der
Sample-Kondensator nur klein sein, deswegen braucht man einen OPV als
Impedanzwandler dahinter. Schau dir das Datenblatt an, da wird die
Funktion erklärt.
> Wie ich den Takt (zwecks Wartezeiten) mit dem BAS Signal synchronisieren> muss werde ich sehen. Vom Gefühl her würde ich sagen, dass es gehen> sollte. Meinst du die Zeilen würden unterschiedlich skaliert dargestellt> werden ?
Wenn die Takte asynchron sind, jittert der Abtastzeitpunkt. Das macht
sich bei einem Standbild mindestens als extra Rauschen bemerkbar. Wenn
du aufeinanderfolgende Frames als Video zusammensetzt, wirst du ein
Zittern von Objekten im Bild sehen.
> Beim AtMega8 (mit 12MHz) kann ich die ADC Frequenz wohl bis auf> 6 MHz einstellen (Teiler 2). Ich sehe auf dem Monitor dann schön die> Zeile aus 50 bis 70 Helligkeitswerten.
Das ist dann Glück. So wie du auch nicht jedes Mal überfahren wirst,
wenn du bei Rot über die Ampel gehst.
Spezifiziert ist der ADC nur bis 200kHz. Später hat Atmel das auf 1MHz
"bei verringerter Auflösung" erhöht. Ohne allerdings eine genauere
Spezifikation, wieviele Bits man bei wievielen MHz noch erwarten kann.
Es ist aber klar, daß die Funktion des ADC oberhalb einer gewissen
Frequenz einfach komplett aussetzen wird.
-gb- schrieb:> Dergute W. schrieb:>> Schon mal probiert, den ADC nur so schnell zu takten, dass er in 64µsec>> fertig gewandelt hat, dann den immer nur einmal in jeder Videozeile>> anstossen, und dann in jedem (Halb)Bild die Zeit zwischen Hsync und ADC>> start ein bisschen zu erhoehen?>> Du meinst immer nur ein Pixel je Zeile abtasten?
Genau das schrieb der TE doch schon im Eröffnungspost. Er nannte es da
"spaltenweises Auslesen" des Bildes.
@Dergute W. (derguteweka):
Das war ja auch meine Idee. Hab mich wohl uneindeutig ausgedrückt. Quasi
Spaltenweise einlesen des Bildes. Quasi 1 Sample pro Zeile. Und nach 200
Bildern hat man das gesamte Bild. Ich dachte nur, dass die Samplingtime
von der ADC Geschwindigkeit abhängt?!? Sonst mittelt der doch die
Helligkeitswerte der Zeile aus, oder???
Er sollte - bei 20MHz µC Takt- nur 5 Takte lang samplen.
Ich kann ja mal fix Probieren, wie unscharf das dann Bild wird.
@Radionukleid:
Kann doch nicht mehr als 1-2 Taktzyklen unsynchron sein. Schließlich
triggert der h-sync Impuls den Int0.
Danke für den LF398. Genau solche Bezeichnungen finde ich in diesem
Bauteildschungel nicht so auf die schnelle. Den gibts sogar hier im Ort.
@Christoph db1uq K.: Den TDA8703 gibts hier noch erhältlich (: Das mache
ich nach dem S&H Versuch.
@Axel S.: Bei diesem Versuch das Bild Zeilenweise auszulesen mit dem
6MHz Takt. Verbraucht die Software (16 Bit adc Register ausleen +
Speicherung+Zähler) ja auch noch Takte. So käme ich auch auf ~1MHz. Ob
die Zwischentakte dem ADC zugute kommen weiß ich nicht.
Ich habe ja schon gute Tipps bekommen. Insbesondere den LF389 (1,6€) und
den TDA8703 (7€).
Ich teste erstmal was beim spaltenweisen Auslesen rauskommt.
Moin,
Axel S. schrieb:> Genau das schrieb der TE doch schon im Eröffnungspost. Er nannte es da> "spaltenweises Auslesen" des Bildes.Rechenknecht schrieb:> Das war ja auch meine Idee.
Ja, schon klar. Wollt auch kein Patent drauf haben. Gabs schon zu
Amigazeiten (noch mit einer RGB-Transparent Filterscheibe fuer
Farbbilder).Ich mein' ja auch hauptsaechlich, dass im Datenblatt des 328
was drinnensteht, dass der ADC eine interne S&H Stufe hat. Wenn die
hurtig genug "sample-and-holded", dann braucht man keine externe mehr...
Dass bei sowas nicht direkt 4kp60 mit HDR rauskommt, sollt' auch allen
klar sein.
Gruss
WK
Dergute W. schrieb:> Ich mein' ja auch hauptsaechlich, dass im Datenblatt des 328> was drinnensteht, dass der ADC eine interne S&H Stufe hat. Wenn die> hurtig genug "sample-and-holded"
Das hatten wir doch schon. Die interne Stufe hat 1.5 ADC-Takte
Sample-Zeit. Bei 1MHz ADC-Takt (dem maximal offiziell erlaubten) sind
das 1.5µs. Faktor 6 zu langsam.
Dergute W. schrieb:> Gabs schon zu> Amigazeiten (noch mit einer RGB-Transparent Filterscheibe fuer> Farbbilder)
Auch der alte 'MacVision' Zusatz für die serielle Schnittstelle am
Macintosh hat das spaltenweise gemacht.
Der aktive Inhalt einer CCIR Zeile ist 52µs. Wenn man also nach der
fallenden Flanke des H-Sync 12µs wartet und dann den ADC startet,
erwischt man die erste µs des aktiven Inhaltes. (D.h., man startet etwas
früher, weil der ADC ja noch Zeit braucht) Diesen Vorgang wiederholt man
für alle aktiven Zeilen und verzögert im nächten Durchlauf den Start des
ADC um z.B. 1µs. Macht man das 51-52 mal, hat man die Zeilen in 1µs
Häppchen.
Ist der ADC zu langsam, sampelt man z.B. jede 2. Zeile.
Wichtig ist, das der ADC niederohmig angetrieben wird, um den S&H
Kondensator zügig auf den Wert zu laden.