PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Brauche Dringend Hilfe beim Analog Comparator



becki133
10.07.2008, 14:12
Hi @all

Ich drehe langsam durch
Mein AC macht was er will und wie er will

So hätte ich es gerne das der AC es macht.
Ich Bestrome meine Spule und schalte sie dann ab .
Dann soll der Ac einen Interrupt auslösen wenn die Spannung an
Ain0 gleich der Spannung an AIN1 ist . Der Timer wird Gestoppt und ich kann mir denn Wert anschauen . Das ist leider die Theorie .

Jetzt die Praxis .
Also ich schalte die Spule ein.
Ich schalte die Spule ab es kommt der Interrupt .
Die Werte des Timers ist immer um ca 300 kleiner wie der vorher.
ist er bei 1700 angekommen geht er wieder hoch auf 5400 und zählt wieder runter . Die Werte Passen in keiner form zu der entlade kurve die mir mein Oszi anzeigt .

Jetzt zum Aufbau .
An AIN0 Liegt die Motorspannung von 5V
An AIN1 Liegt die Referenz Spannug derzeit GND lieber wäre mir aber 1V.

Konfiguriert habe ich den AC so :
config ACI = on , compare = off , Trigger = falling
enable ACI
On ACI ACI_ISR
Enable INTERRUPTS
Stop AC

DO
ocr2 = 255
portd.2 = 1 Die SPule wird Bestromt
waitms 500
Start Timer1
Start AC
OCR = 0 Die Spule ist aus . GND bleibt offen . Auf dem Oszi habe ich
schöne kurve die sich je nach Rotorposition ändert.
wait 3
loop
end

ACI_ISR:
Stop timer1
stop AC
Print timer1
Return

Gruß Becki

Sauerbruch
10.07.2008, 19:27
Mein AC macht was er will

"Computer machen zwar nicht immer was sie sollen, aber immer was man ihnen sagt" =P~

(Eine unangenehme Wahrheit, ist aber so).

Auch wenn ich nicht alles von Deinem Code verstehe (z.B. die PWM-Komponente), liegt m.E. der Fehler darin, dass Du den Timer nach dem Auslesen nicht auf 0 zurücksetzt. Er zählt daher einfach vom letzten Wert weiter, läuft regelmäßig über, und kommt deshalb immer bei etwas niedrigeren Werten an als beim vorherigen Interrupt.

Mach´ hinter Print Timer1 mal ein Timer1=0...

becki133
11.07.2008, 20:34
Hallo Sauerbruch,
danke für die Antwort habe es sofort Probiert .
Es wurde besser aber das war es leider noch nicht .
Ist es möglich die interne Referenz von 2,56 V zu benutzen um AIN1
oder AIN0 damit zu Vergleichen ?

Fals es möglich sein sollte bitte mit einer Erklärung wie es geht.

Gruß Becki

Sauerbruch
11.07.2008, 22:50
Hmmm...

leider weiß ich nicht, mit welchem Controller Du arbeitest. Ich hab mal ins Datenblatt vom Mega8 geschaut und dort folgendes gefunden:



The Analog Comparator compares the input values on the positive pin AIN0 and negative pin AIN1. When the voltage on the positive pin AIN0 is higher than the voltage on the negative pin AIN1, the Analog Comparator Output, ACO, is set.

(ich nehme mal an, dass das bei anderen Typen ähnlich sein wird).

Wenn AIN1 auf GND liegt, kann die Spannung an AIN0 ja gar nicht kleiner sein - es müsste als so eine Art Dauer-Interrupt entstehen.

Hast Du schon mal probiert, AIN1 über einen Trimmer auf einen etwas positiveren Wert einzustellen?

becki133
12.07.2008, 23:47
Hallo,
Ja das mit GND hatte ich mir dann auch so gedacht .
Ich habe jetzt die interne Referenz angeschaltet .
Sie ist zwar beim mega8 leider fest auf 2,7 V aber für erste Tests war es ausreichen .
Und liefen auch zu meiner vollen zufriedenheit .
Tut mir leid das ich erst so spät Antworte aber ich habe mal angefangen
das Datenblatt zu Studieren .
Das zieht sich leider mit meinen Englisch kenntnissen etwas hin .

Gruß Becki

Mitch64
12.07.2008, 23:53
Wenn du einen ATmega verwendest:

Du kannst natürlich die interne Referenz-Spannung verwenden.
Dazu mußt du den ADC aktivieren.

Config ADC=Single, prescaler=Auto, Reference=Internal
Start ADC

jetzt müßtest du an ARef-Pin eine Spannung haben. Klemm ein Kondensator 100nF dran (gegen Masse) und verbinde den Pin mit deinem AINx Pin als Referenz.

Bei anderen Controlern mußt du mal ins Datenblatt schauen.

Mitch.

becki133
13.07.2008, 00:01
Hallo ,
ich bin genau andersrum gegangen .
ADC = off
und im Register ACSR das bit ACBG auf 1 gesetzt dann hast du die
Interne Referenz an AIN0 Liegen und kannst an AIN1 Messen .
Ich lese dann das bit ACO aus ob es 1 oder 0 ist.
DA ich den Multiplexer brauche habe ich es so rum gemacht.

Gruß Becki