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
intmain(){
28
while(1){
29
30
for(i=1;i<61;i++){
31
OCR1A=i;
32
}
33
34
}
35
return0;
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?
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?
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.
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.
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 ?
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.
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 ?
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...
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.
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...
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.
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.
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.
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.
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
voidTimer_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.