Forum: Mikrocontroller und Digitale Elektronik Phasenanschnittsteuerung


von Daniel (Gast)


Lesenswert?

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.

von Michael (Gast)


Lesenswert?

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

von OldBug (Gast)


Lesenswert?

Wer hat Dir denn was von Übertragern geflüstert?

 :-)

von Michael (Gast)


Lesenswert?

Ich habe den Zündimpuls so interpretiert. Kann natürlich auch ein
Holzweg gewesen sein.
Michael

von Daniel (Gast)


Lesenswert?

ich hatte mir  ein Optokoppler vorgestellt.
Danke für den Tipp.

von Michael (Gast)


Lesenswert?

MOC 3023, einen Widerstand und eine gute Entstörung, fertig ist der
Dimmer. Nur noch die Nulldurchgänge detektieren und auswerten.
Michael

von Daniel (Gast)


Lesenswert?

danke , aber mein Problem ist nicht die Wahl des Optokoppler, sondern
die Registerkonfiguration.

von Michael (Gast)


Lesenswert?

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

von Daniel (Gast)


Lesenswert?

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

von Michael (Gast)


Lesenswert?

Hast du die ganzen Interrupts freigegeben?
Michael

von Daniel (Gast)


Lesenswert?

Nein. Welche muss ich den freigeben?

von Michael (Gast)


Lesenswert?

Schau dir mal TIMSK an. Freigeben mußt du den Input Capture Modus. Und
in SREG bit 7.
Michael

von Daniel (Gast)


Lesenswert?

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.

von Michael (Gast)


Lesenswert?

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.

von Daniel (Gast)


Lesenswert?

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

von Michael (Gast)


Lesenswert?

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

von Daniel (Gast)


Lesenswert?

ja,
TIMSK =_BV(TICIE1);

von Maximilian Riess (Gast)


Lesenswert?

>> 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

von Maximilian Riess (Gast)


Lesenswert?

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