2016-12-29 32 views
0

我試圖通過attiny85接受通過I2C發送的命令來調暗燈泡。我的問題是燈泡幾乎不變暗,並且閃爍很多。Attiny85用於調光燈泡的AC相位控制

我的電路在這裏可以看到: Attiny85 dimming circuit controlled over I2C

光隔離器(以及因此三端雙向可控硅)經由引腳2(AKA PB3,AKA PCINT3)和AC控制零交叉檢測在銷3進行( AKA PB4,AKA PCINT4)Attiny85

該代碼使用引腳變化中斷使能,而不是單個外部中斷使能,因爲外部中斷引腳是引腳7(又名PB2),用作I2C通信的SCL。

使用8MHz的內部時鐘,定時器/計數器預分頻器爲1024.這意味着我有一個有效的輸入範圍(見代碼中的level變量)大約爲0-65。我的交流電源是美國(60Hz)。

#include <avr/interrupt.h> 
#include <avr/io.h> 
#include <TinyWireS.h> 

#define PULSE 4  //trigger pulse width (counts) 
#define I2C_SLAVE_ADDR 0x4 // the 7-bit address (remember to change this when adapting this example) 

byte trigger = 3; 
byte detector = 4; 

byte level = 50; 
byte maxLevel = 65; 
byte minLevel = 0; 


void setup() { 
    TinyWireS.begin(I2C_SLAVE_ADDR); // join i2c network 
    TinyWireS.onRequest(requestEvent); //setup i2c requester 

    digitalWrite(detector, HIGH); //enable pull-up resistor 
    pinMode(trigger, OUTPUT);// Set AC Load pin as output 

    TCCR1 = 0;  //stop timer 
    OCR1A = level; //initialize the comparator 
    TIMSK = _BV(OCIE1A) | _BV(TOIE1); //interrupt on Compare Match A and enable timer overflow interrupt 

    GIMSK = 0b00100000; //Enable pin change interrupt 
    PCMSK = 0b00010000; //PB4, physical pin 3 PCINT4 
    TCCR1 = B00001011; //Prescale the timer 
    sei(); // Turn on interrupts 
} 


ISR(PCINT0_vect){ //interrupt looking for zero crossing 
     TCNT1 = 0; //reset timer - count from zero 
     OCR1A = level; 
     TCCR1 = B00001011;// prescaler on 1024, see table 12-5 of the tiny85 datasheet 
} 

ISR(TIMER1_COMPA_vect){ //comparator match 
     digitalWrite(trigger,HIGH); //set triac gate to high 
     TCNT1 = 255-PULSE;  //trigger pulse width for a few cycles for triac to latch on. 255 bc the counter can only count up to 255 
} 

ISR(TIMER1_OVF_vect){ //timer1 overflow 
     digitalWrite(trigger,LOW); //turn off triac gate 
     TCCR1 = 0; //disable timer stop unintended triggers 
} 


void loop() {} 

void requestEvent(){ 
    if (TinyWireS.available()) { 
     level = TinyWireS.receive(); 
     if (level > maxLevel) { 
      level = maxLevel; 
     } 
     else if (level < minLevel){ 
      level = minLevel; 
     } 
    } 
    TinyWireS.send(OCR1A); 
} 

我試過各種燈泡,沒有任何工作比另一個更好。

這裏是在示波器上的零交叉檢測器(黃色)和觸發(藍色),因爲我把它不同的調光級別Bad phone video

我想感謝所有和任何幫助的視頻。謝謝。

+0

只是快速的答覆。你試過什麼樣的燈泡?白熾燈和鹵素燈泡是可調光的,LED和熒光燈(氖燈和CFL)不是。此外,我會添加一個緩衝網...然後..爲什麼輸出黃色波浪單端? – frarugi87

+0

白熾燈和可調光LED。 是的,我想過緩衝器,我現在只是沒有手上的零件。我認爲這會有所幫助,但我認爲這不會改變我目前的問題。 – thread9000

+0

黃色是來自零交叉檢測器的響應。這是什麼被喂入attiny85。 – thread9000

回答