Hallo,
ich baue gerade einen 3 Phasen Dimmer. Nun hats heute beim Programmieren
die ganze Zeit gesponnen und gerade eben kam ich darauf, mir einfach mal
die Nulldurchgangserkennung anzusehen.
Im Anhang der Schaltplan. Momentan hängen alle drei Phasen auf einer um
zu sehen, wie falsch die Nulldurchgänge gezählt werden.
Nun hab ich nach einer kurzem Zeit, in der das Gerät läuft, z.B.
folgende Ausgabe für gezählte Nulldurchgänge:
L1: 607
L2: 242
L3: 2479
Der Controller ist ein mega1284p, der mit 16mhz läuft. Laufen tut er mit
den 16 sicher, ein Timer lässt zum Testen alle Sekunde eine LED toggeln.
Hier der Quellcode:
1 | volatile unsigned int zero_crossings[3] = { 0, 0, 0 };
|
2 |
|
3 | ISR(PCINT1_vect) { // zero cross detection
|
4 | cli();
|
5 | if(!(PINB&(1<<PB1))) { // PHASE L1
|
6 | zero_crossings[0]++;
|
7 | }
|
8 | if(!(PINB&(1<<PB3))) { // PHASE L2
|
9 | zero_crossings[1]++;
|
10 | }
|
11 | if(!(PINB&(1<<PB4))) { // PHASE L3
|
12 | zero_crossings[2]++;
|
13 | }
|
14 | sei();
|
15 | }
|
16 |
|
17 | void show_zero_cross() {
|
18 | lcd_clrscr();
|
19 | while(get_btn() != BTN_DOWN) {
|
20 | printf_lcd(0,0,"L1:%05u L2:%05u", zero_crossings[0], zero_crossings[1]);
|
21 | printf_lcd(0,1,"L3:%05u", zero_crossings[2]);
|
22 | }
|
23 | return;
|
24 | }
|
Initialisiert wird der PCINT so:
1 | PCICR = (1<<PCIE1);
|
2 | PCMSK1 = (1<<PCINT9)|(1<<PCINT11)|(1<<PCINT12);
|
3 | DDRB &= ~((1<<PB1)|(1<<PB3)|(1<<PB4));
|
Ich würde gerne Wissen, was da schief läuft, da sitz ich seit gestern
Abend dran...