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.
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.
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.
Und wenn du statt ADSC ADIF auswertest (danach zurücksetzen) oder gleich mit INT arbeitest?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.