Hallo, ich will ein Zündimpuls (ca.2mS) für eine Phasenanschnittsteuerung erzeugen. Das erste Problem ist das der Impuls mit der Netzfrequenz synchronisiert werden muss. Das zweite, die Zeit zwischen Sinusnulldurchgang und Impuls muss variabel sein, damit ich die Drehzahl ändern kann. Meine Frage: Ist so was möglich?, und ist es auch machbar das, das ganze im Hintergrund abläuft wie z.B. PWM. Danke.
Such mal im gesammten Forum nach Dimmer. Aber warum mit einem Übertrager? Das ist Technik von vor 30 Jahren. Dafür hat der liebe Gott einkristallines Silizium erfunden. Und der böse Teufel hat's verdreckt(dotiert). Michael
Ich habe den Zündimpuls so interpretiert. Kann natürlich auch ein Holzweg gewesen sein. Michael
MOC 3023, einen Widerstand und eine gute Entstörung, fertig ist der Dimmer. Nur noch die Nulldurchgänge detektieren und auswerten. Michael
danke , aber mein Problem ist nicht die Wahl des Optokoppler, sondern die Registerkonfiguration.
Ich habe damals einen Timer im Capture-Modus gefahren. Nullspannung detektiert, Timer läuft los bis zur nächsten Nullpunktdetektion. Sollte knapp 10ms dauern. Diese Timerzeit retten und auf Null setzen für die nächste Halbwelle. Im Hauptprogramm kannst du diese Zeit z.B durch 256 teilen und so ein DMX-Signal damit erschlagen. Z.B Zählerstand im Nullpunkt 7650. 7650 / 256 = 29,88... Also bei Integer 29. Jetzt hast du einen DMX-Wert empfangen von z.B, 143. 29 x 143 = 4147. Wenn der Zählerstand Timerzeit - 4147 ereicht hat, Triac zünden. Ein häufig gemachter Fehler: sobald ein Nullpunkt erkannt wurde, den Triac ausschalten, damit der Triac nicht in die nächste Halbwelle gezündet reinläuft. Ich hoffe, ich habe nichts gravierendes übersehen. Den Nullpunkt habe ich mir generiert, indem ich einen Vorwiderstand ans Netz, eine kleine Gleichrichterbrücke und dahinter den Optokoppler. Der Vorwiderstand dient zur Strombegrenzung der Fotodiode. Das müßte es im Großen und Ganzen gewesen sein. Anstelle des DMX-Wertes kannst du dir ja auch ein Poti an einen AD-Port knüppern, halt irgend einen Sollwert vorgeben. Michael
also ich hab folgendes probiert. #define AVR_ATmega128 #include <avr/io.h> #include <inttypes.h> #include <string.h> #include <stdlib.h> #include "lcd.h" DDRD = 0x00; DDRB = 0xFF; TCCR1A = (_BV(COM1A0)| _BV(WGM10)); TCCR1B = (_BV(CS12)| _BV(CS11)| _BV(CS10)| _BV(WGM13)); OCR1A = 1; Die Registerwerte TCNT1, OCR1A,ICR1 werden am Display angezeigt. OCR1A = 1, TCNT1 wechselt von 1 auf 0, aber ICR1 zeigt ständig 0. Die Frequenz am PWM Ausgang stimmt auch nicht, die ist gleich Frequenz am T1 Eingang / 4. Meinst Du mit der Timerzeit den Wert im ICR1 Register ? Was mach ich falsch? Daniel
Schau dir mal TIMSK an. Freigeben mußt du den Input Capture Modus. Und in SREG bit 7. Michael
Tut mir leid, ich krig es nicht gebacken. SIGNAL(SIG_INPUT_CAPTURE1) { sbi(PORTB,1); // nur um zu sehen ob die Funkt. Aufgerufen wird } int main (void) { DDRA = 0xFF; // DDRD = 0x00; // DDRB = 0x7F; // TCCR1A = _BV(COM1A1) | _BV(COM1A0; TCCR1B = _BV(WGM13) | _BV(CS11)| _BV(CS12);//Phase +Frequenz Correct, Ext. clock sei(); TIMSK =_BV(TICIE1); for (;;) { ...// Registerinhalt anzeigen cbi(PORTB,1); } } Der Pin1 am PortB, wird nur nach jeden dritten Impuls am T1 Eingang gesetzt. Am OC1A Ausgang , hab ich ca. jede 25Sek ein Impuls bei einer Frequenz am T1 = 500KHz. >> Diese Timerzeit retten und auf Null setzen für die >>nächste Halbwelle. Welche Timerzeit meinst Du? OCR1A? Hab den Timer in der Intepruptroutine auf Null gesetzt, hat aber nichts gebracht. Sind die TCCR1A und TCCR1B falsch gesetzt? Sollte nicht der Zählerstand zum Triggerzeitpunkt im ICR1 gespeichert werden? Hilfeeeeeeee.
Ich nehme jetzt mal an: Clock 16 MHz Timer 1 Vorteiler 8 erwartete Frequenz am Input Capture Pin 100 Hz bedeutet daß im Input Capture Register irgend etwas < 20000 stehen muß. Ich weiß nicht, wie deine Hardware aussieht. Wenn du High-aktive Pulse hast, mußt du den Trigger auf steigende Flanke stellen. Mit der steigenden Flanke wird der Inhalt von TCNT1 ins Capture Register geladen (so funktioniert es bei mir). Der Input Capture Pin ist Port D 4. Prüfe das mal nach.
Zur Hardware: Atmega 128, Clock = 8MHz, 100 Hz an Pin4 Port D Vorteiler = 8 TCCR1A = _BV(WGM10) |_BV(COM1A1) | _BV(COM1A0); TCCR1B = _BV(WGM13) | _BV(CS11); SIGNAL(SIG_INPUT_CAPTURE1) { sbi(PORTB,1); a=TCNT1; // speichern TCNT1=0; // zurücksetzen } Im Hauptprogramm wird der Inhalt von a und Input Capture Register angezeigt, und der ist immer =0. Kannst Du bitte meine Registerkonfiguration überprüfen? Und/oder ein klein Beispiel Code schreiben? Ich bin am verzweifeln. Daniel
Hast du bit 5 in TIMSK gesetzt? Mein Code ist auf nen IAR Compiler geschrieben. Ich würde erst einmal den Output Compare ausklammern, einen Teil nach dem anderen zum laufen bringen. Michael
>> Im Hauptprogramm wird der Inhalt von a und Input Capture Register >> angezeigt, und der ist immer =0. Hast du die Variable a volatile definiert ?? probier das mal! Gruß Maxx
Tschuldigung - ich nochmal: laß doch im Hauptprogramm auch eine variable anzeigen, die du in der interrupt-routine nur hochzählen läßt... dadurch siehst du, ob die routine überhaupt angesprungen wird - das problem hatte ich nämlich auch schon mal ;-) Gruß Maxx
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.