ATiny85 AC Dimmer Timer1 mit 2 Kanäle zero cross

OP #4943511
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?
Gast #4943518
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?
OP #4943532
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.
(Firma: matzetronics) #4944057
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.
(Firma: Vescomp) #4944111
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...
#4944653
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.
OP #4944920
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.
OP #4944923
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.
(Firma: matzetronics) #4945446
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.
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren