Forum: Mikrocontroller und Digitale Elektronik ATiny85 AC Dimmer Timer1 mit 2 Kanäle zero cross


von Gerd L. (gerdl)


Lesenswert?

Hallo,

welche Möglichkeit gibt es dieses Problem zu lösen?

ATtiny85 8MHz keine Möglichkeit PLL zu nutzen da nur 3.3V zur Verfügung 
stehen.

Es sollen 2 Kanäle mit unterschiedlicher Dimmzeit als Ausgang benutzt 
werden können. Derzeit funktioniert das nur mit einer Dimmzeit.

Der zero cross Interrupt wird an INT0 gelegt.
PB0 und PB1 sind die Ausgänge.
Der Timer0 ist für die Serielle Kommunikation belegt.

1
Setup:
2
DDRB |= (1<<PB0) | (1<<PB1);
3
PORTB &= ~(1<<PB0) | ~(1<<PB1);
4
MCUCR  = (1 << ISC01);
5
GIMSK |= (1 << INT0);
6
TIMSK |= (1 << OCIE1A) | (1 << TOIE1);
7
TCCR1 = (1 << CS13) | (1 << CS11) | (1 << CS10);
8
9
ISR(INT0_vect){
10
  TCNT1 = 0;
11
  TCCR1 = (1 << CS13) | (1 << CS11) | (1 << CS10);
12
}
13
14
ISR(TIMER1_COMPA_vect) {
15
  PORTB |= (1<<PB0);
16
  PORTB |= (1<<PB1);
17
  TCNT1 = 253;
18
}
19
20
ISR(TIMER1_OVF_vect) {
21
  PORTB &= ~(1<<PB0);
22
  PORTB &= ~(1<<PB1);
23
  TCCR1 = 0;
24
  TCNT1 = 0;
25
}
26
27
int main(){
28
 while(1){ 
29
30
  for(i=1;i<61;i++){
31
    OCR1A = i;
32
  }
33
34
 }
35
 return 0;
36
}

Das funktioniert wunderbar nur leider beide Ausgänge mit der selben 
Dimmzeit. Ein Versuch ISR(TIMER1_COMPB_vect) mit ins Boot zu nehmen 
scheiterte. Habe versucht in TIMER1_COMPB_vect ein OCR1A += OCR1A und in 
TIMER1_COMPB ein OCR1B += OCR1B und dann noch das ganze im 
TIMER1_OVF_vect per IF abfragen zu realisieren, haut aber auch nicht hin 
da wohl die 8MHz einfach zu langsam sind.

Ist es überhaupt machbar hier unterschiedliche Dimmzeiten zu 
realisieren?
Hat eventuell jemand einen Lösungsansatz?

: Verschoben durch User
von Dieter F. (Gast)


Lesenswert?

Gerd L. schrieb:
> ATtiny85 8MHz keine Möglichkeit PLL zu nutzen da nur 3.3V zur Verfügung
> stehen.
>
> Es sollen 2 Kanäle mit unterschiedlicher Dimmzeit als Ausgang benutzt
> werden können. Derzeit funktioniert das nur mit einer Dimmzeit.

Für weniger kompetente wie mich - wo ist denn da der Zusammenhang?

Hat der nicht 2 (PWM-fähige) Timer?

von Gerd L. (gerdl)


Lesenswert?

Mit 16MHz also Nutzung des PLL wäre es in Software möglich das ganze per 
IF Abfragen zu realisieren.Mit 8MHz ist er einfach zu langsam so das das 
ganze flackert. 16MHz sind aber nur ab 4,5V stabil möglich

Hat er. Nur hier muss ein Phasenabschnitt realisiert werden. PWM ist da 
denk ich eher ungeeignet.

: Bearbeitet durch User
von Dieter F. (Gast)


Lesenswert?

Gerd L. schrieb:
> PWM ist da
> denk ich eher ungeeignet.

PWM war in Klammern - er hat 2 Timer zuf Verfügung.

von Gerd L. (gerdl)


Lesenswert?

Timer0 ist leider für die Serielle Kommunikation belegt.
Trotzdem Danke

von Dieter F. (Gast)


Lesenswert?


von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Gerd L. schrieb:
> Das funktioniert wunderbar nur leider beide Ausgänge mit der selben
> Dimmzeit.

 Wieso ?
 PWM Frequenz ist TIMER1_OVF_vect.
 Pulsdauer 1 ist TIMER1_COMPA.
 Pulsdauer 2 ist TIMER1_COMPB.

 P.S.
 Und TCNT1 in Ruhe lassen.

: Bearbeitet durch User
von Gerd L. (gerdl)


Lesenswert?

Sobald einer der Compare Interrupts aufgerufen wird, wird TCNT=253 neu 
gesetzt. Funktioniert so also nicht.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Gerd L. schrieb:
> Sobald einer der Compare Interrupts aufgerufen wird, wird TCNT=253 neu
> gesetzt. Funktioniert so also nicht.

 So natürlich nicht.
 Deswegen schrieb ich auch, dass du TCNT1 in Ruhe lassen sollst.

 Mit 8MHz und Vorteiler 32 hast du eine PWM Frequenz von 977 Hz.

 Pulsweite von 0 bis 100% in Schritten von 0,39%.

 Ist es so schwer ?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Wenn man den Tiny im ATTiny15 Kompatibilitätsmodus verwendet, hat er 
1,6MHz Takt und erreicht mit einem Vorteiler durch 64 ziemlich genau 97 
Hz - ideal für einen 50Hz Dimmer.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Matthias S. schrieb:
> Wenn man den Tiny im ATTiny15 Kompatibilitätsmodus verwendet, hat er
> 1,6MHz Takt und erreicht mit einem Vorteiler durch 64 ziemlich genau 97
> Hz - ideal für einen 50Hz Dimmer.

 Und der praktische Nutzen davon wäre... was ?

: Bearbeitet durch User
von Ingo L. (corrtexx)


Lesenswert?

Du könntest dir Interrupts mit 50Hz x 360 = 18kHz erzeugen und alles in 
Software machen. Dann hast du 1 Grad Auflösung und beliebig viele 
Kanäle.

Du musst dich dann nur auf den Nulldurchgang der Spannung 
synchronisieren...

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Marc V. schrieb:
> Und der praktische Nutzen davon wäre... was ?

Überlge einfach mal. Du kannst den vollem Bereich der OCR Register 
ausnutzen, und musst weder mit TCNT noch mit irgendwelchen Überläufen 
rechnen.
Mein Tiny Dimmer auf diesem Prinzip jedenfalls funktioniert hervorragend 
und lässt an jedem OC Ausgang verschiedene Sequenzen zu. Ich benutzte 
allerdings noch eine Linearisierungstabelle, um Glühlampen linear zu 
dimmen.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Matthias S. schrieb:
> Du kannst den vollem Bereich der OCR Register
> ausnutzen, und musst weder mit TCNT noch mit irgendwelchen Überläufen
> rechnen.

 Normal muss man ja auch nicht rechnen, nur die entsprechenden
 OCR Werte reinschreiben und beim COMPx ausschalten, beim OVF wieder
 einschalten (oder nicht, wenn Wert gleich Null ist).

> Überlge einfach mal.

 Ich kann bis übermorgen überlegen, wird nicht besser, da ich mich mit
 Dimmen nicht auskenne.
 Dachte nur, dass 97Hz etwas wenig ist - das sind mehr als 10ms.

 Auf jeden Fall habe ich nicht darüber nachgedacht, dass das Ein- und
 Ausschalten auch später passiert, bei voller Spannung, da ist zero-
 cross nutzlos...

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Marc V. schrieb:
> Dachte nur, dass 97Hz etwas wenig ist - das sind mehr als 10ms.

Optimal wären genau 100Hz, da jede Halbwelle der 50Hz 10ms lang ist und 
der Dimmer in jeder Halbwelle einmal zündet. Der Timer im Tiny15 Modus 
wird vom ZC zurückgesetzt und durchläuft während der Halbwelle fast die 
ganzen 255 Werte.

von Peter D. (peda)


Lesenswert?

Gerd L. schrieb:
> TCNT1 = 253;

Wie kommst Du darauf?
Man darf Code kommentieren, d.h. wie man auf magische Nummern kommt.
Besonders als Anfänger stellt man sich nur selbst alle Beine, wenn man 
auf Kommentare verzichtet.

Ich komme auf:
8MHz / 512Vorteiler / 100Hz = 156 Stufen, das sollte reichen.

TCNT1 wird nur durch den Nulldurchgang rückgesetzt, das ist auch der 
einzige Interrupt. Die Outputs setzen die beiden Timercompare in 
Hardware ohne Interrupt.

Die UART sollte vorzugsweise als Polling in der Mainloop erfolgen, sonst 
kann es zu Jitter (Flackern) kommen.

: Bearbeitet durch User
von Gerd L. (gerdl)


Lesenswert?

Matthias S. schrieb:
> Marc V. schrieb:
>> Und der praktische Nutzen davon wäre... was ?
>
> Überlge einfach mal. Du kannst den vollem Bereich der OCR Register
> ausnutzen, und musst weder mit TCNT noch mit irgendwelchen Überläufen
> rechnen.
> Mein Tiny Dimmer auf diesem Prinzip jedenfalls funktioniert hervorragend
> und lässt an jedem OC Ausgang verschiedene Sequenzen zu. Ich benutzte
> allerdings noch eine Linearisierungstabelle, um Glühlampen linear zu
> dimmen.

Diese Lösung würde mich mal im Detail interessieren. Für jede Lösung die 
ich in Software nutzen wollte war das Ergebnis ein flackern. Nun bin ich 
aber auch kein Profi.

von Gerd L. (gerdl)


Lesenswert?

Peter D. schrieb:
> Gerd L. schrieb:
>> TCNT1 = 253;
>
> Wie kommst Du darauf?
> Man darf Code kommentieren, d.h. wie man auf magische Nummern kommt.
> Besonders als Anfänger stellt man sich nur selbst alle Beine, wenn man
> auf Kommentare verzichtet.
>
> Ich komme auf:
> 8MHz / 512Vorteiler / 100Hz = 156 Stufen, das sollte reichen.

So hatte ich gerechnet:
8MHz/64 Vorteiler/50Hz
Dann per Try und Error den besten Wert genommen.

von Gerd L. (gerdl)


Lesenswert?

Vielen Dank für die super Hilfe!!!

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Angehängte Dateien:

Lesenswert?

Gerd L. schrieb:
> Diese Lösung würde mich mal im Detail interessieren.

Schaltung ist mal angehängt. Wohlgemerkt, der Tiny25 läuft im ATTiny 15 
Mode (Fuse gesetzt).
Timer wird so initialisiert:
1
// set the timers in normal mode 
2
// with a period of about 96 Hz
3
// F_CPU = 1600000 / 64 /256 = 97 Hz
4
void Timer_Init(void) {
5
   TCNT1 = 0;
6
   OCR1A = 4; // will be updated very soon in PCINT ISR
7
   OCR1C = 255;
8
   TCCR1 = (1 << CS13) | (1 << CS11) | (1 << CS10);
9
// irq setup
10
   TIFR |= (1 << TOV1) | (1 << OCF1A); // clr pendings
11
   TIMSK |= (1 << OCIE1A) | (1 << TOIE1);
12
}
Der OC Interrupt triggert mit einem 10µs den Triac, da ich nicht möchte, 
das zuviel Strom verbraucht wird, wg. des schwachen 
Kondensatornetzteiles.
Der andere Kanal wird hier nicht benutzt.
Dieser Dimmer ist programmgesteuert, das Programm wird im ZC Interrupt 
abgearbeitet und dort auch OCR1A gesetzt.
Der OVF Interrupt tut nichts ausser den Triac Trigger zu löschen - für 
den Fall der Fälle.

: Bearbeitet durch User
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.