Forum: Mikrocontroller und Digitale Elektronik ADC Comlete im Free Runnig Mode


von Nicky (Gast)


Lesenswert?

Hallo Zusammen,

ich sitze zur zeit an einem kleinen projekt, bei dem ich optisch ein
entladungsleuchtmittel in der helligkeit überwachen möchte.

um hier sauber messen zu können und ggf. passend skalieren zu können,
muss ich meine AD wandlung des helligkeitssensors immer an einem
definiertem punkt durchführen. hierzu könnte man nun einfach nen
timerwert vorgeben, an dem ich den ADC starte.
Ich möchte jetzt aber nach möglichkeit am helligkeitsmaximum abtasten,
da hier der sinus der wechselspannung die geringsten anstiege besitzt
und eventuelle geringe zeitliche versätze sich hier nicht so stark
auswirken (durch Codeabarbeitung und Int-routineen einsprung). da das
entladungsleuchtmittel eine spule vorgeschaltet hat, wird sich hier
sicher die phase in den unterschiedlichen arbeitspunkten ändern.
Spannung am leuchtmittel kurz nach zündung annähernd netzspannung und
bei erreichen des AP nur noch 90V - strom umgekehrt proportional -->
daher vermutung der phasendrehung in der spule

ich habe um nun die phase bestimmen zu können folgenden code in
asembler geschrieben, bei dem ich durch nen zero cross sensor meinen
timer starte und sofort im free runnig mode meine AD wanlung permanent
durchführen lassen möchte. ist der neue wert kleiner als der
vorgängerwert (fallende flanke der helligkeitskurve) möchte ich den
timer stoppen und diesen wert nun als referenz verwenden. von
eventuellen korrekturen durch laufzeit mal abgesehen. leider bleibt
mein programm in der "Test_ADC_ready" schleife stecken. in avr
studios simulator funktioniert alles, aber im chip (MEGA128)...???

keine ahnung mehr --> hat jemand nen tipp oder ne idee wo der fehler
liegt oder vielleicht -> wie es besser geht?
bastle seit tagen daran herum aber mein mega128 möchte dies nicht so
tun wie es gern hätte. arbeite hier bewusst noch nicht mit interrupts,
diese brauche ich später für andere routinen.
ach so, die ADC und Timer initialisierungen hab ich hier mal weg
gelassen, die passen
   .
   .
   .

; Zero Cross detection

Not_Zero:
  in  temp0, PIND      ; check auf 1
  sbrs  temp0, 0
  rjmp  NOT_Zero

Zero:
  in  temp0, PIND      ; check auf 0 (falling edge)
  sbrc  temp0, 0
  rjmp  Zero


; Timerstart
  ldi  temp0, (1<<CS02)|(1<<CS01)|(1<<CS00)
  out  TCCR0, temp0

  clr  ZL
  clr  ZH

Start_ADC:
  ldi  temp0, (1<<ADSC)|(1<<ADEN)|(1<<ADFR)
  out  ADCSR, temp0

  Test_ADC_ready:
  in  temp0, ADCSR
  sbrc  temp0, ADSC
  rjmp  Test_ADC_ready

  in  temp1, TCNT0

  in  ZL, ADCH    ; load new ADC value
  cp  ZL, ZH
  mov  ZH, ZL      ; copy new ADC value to ZH

  brge  Start_ADC

  clr  temp0
  out  ADCSR, temp0
  mov  Timer1, temp1
   .
   .
   .

schon mal im voraus vielen dank an die, die sich meines problems
annehmen.

von ...HanneS... (Gast)


Lesenswert?

Misst du die Helligkeit mit einem Fotowiderstand?
Dann könnte man den Wert mittels Tiefpass glätten und somit den
Mittelwert messen.

Wird das Leuchtmittel gedimmt?
Dann bringt glaube nur die Messung des Mittelwertes etwas.

von Nicky (Gast)


Lesenswert?

es ist eine fotodiode, die noch uber einen I/U wandler mit
einstellebarer Verstärkung betrieben wird. ich muss leider mehrere
kanäle abtasten, deshalb ist die variante mit dem mittelwert recht
ungenau. mit nem RC filter hab ich es schon versucht, ist aber schon
nen weilchen her, daher kenn ich die werte nicht mehr. funktionierte
nicht sonderlich gut!

ja, dass leuchtmitel wird gedimmt, aber nicht elektrisch, deshalb kann
ich so gut auf dem sinus herumreiten.

dass eigentliche problem, liegt ja in meiner schleife, er bleib ja dort
hängen! und ich habe keine ahnung warum.

ich brauche doch nur die bestätigung, dass der ADC mit der wandlung
fertig ist, damit ich den wert abfragen kann. normal mit ner interrupt
routine kein problem, aber hier in der schleife scheinbar schon.

so wie ich das datasheet verstanden habe, wird ADSC gelöscht wenn die
wandlung fertig ist, und genau das frage ich in meiner schleife doch
ab.

hab gerade ne idee!

ich versuche jetzt noch permanent nur die adc werte auszulesen, ohne
auf die adc quittung zu warten! mal sehen was dabei heraus kommt. wenn
der adc im free runnig läuft, ist mir doch egal wann der fertig ist.
wichtig für mich ist doch nur, wann meine werte wieder kleiner werden.

ich glaub das könnte klappen. manchmal hilft aufschreiben, um von
seinem verbohrten festgefahrenen gedanken abzukommen.

trotzdem danke erst einmal.

von ...HanneS... (Gast)


Lesenswert?

Und wenn du statt ADSC ADIF auswertest (danach zurücksetzen) oder gleich
mit INT arbeitest?

von Nicky (Gast)


Lesenswert?

hallo, danke erst mal für deine tips.

wie gesagt, wenn man aufschreibt....

warum den adc status abfragen, hab es jetzt auf die einfache schleife
reduziert und frage zyklisch den adc wert ab, egal ob der adc fertig
ist oder nicht. wenn er halt noch nicht so weit ist, lese ich eben den
alten wert nochmal aus. mich interessiert doch nur, wann der neue wert
kleiner ist als der vorgänger. dies scheint zu funktionieren.

nochmal danke

gruß nicky

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
Noch kein Account? Hier anmelden.