www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Phasenanschnittsteuerung


Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wer hat Dir denn was von Übertragern geflüstert?

 :-)

Autor: Michael (Gast)
Datum:

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

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hatte mir  ein Optokoppler vorgestellt.
Danke für den Tipp.

Autor: Michael (Gast)
Datum:

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

Autor: Daniel (Gast)
Datum:

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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du die ganzen Interrupts freigegeben?
Michael

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein. Welche muss ich den freigeben?

Autor: Michael (Gast)
Datum:

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

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja,
TIMSK =_BV(TICIE1);

Autor: Maximilian Riess (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Maximilian Riess (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.