2016-12-29 27 views
0

Я пытаюсь затушить лампочку через attiny85, который принимает команды, отправленные через I2C. Моя проблема в том, что лампочка едва светится и мерцает совсем немного.Attiny85 AC Phase Control для затемнения лампочки

Моя цепь можно увидеть здесь: Attiny85 dimming circuit controlled over I2C

В оптоизолятор (и, таким образом, симистор) управляется через контакт 2 (АКА PB3, АКА PCINT3) и переменного тока через нуль, определение выполняется на выводе 3 (AKA PB4, AKA PCINT4) на Attiny85

Код использует прерывание прерывания смены контактов, а не одно внешнее прерывание, потому что вывод внешнего прерывания является контактом 7 (aka PB2), который используется как SCL для связи I2C.

Используется внутренний такт 8 МГц, а предварительный делитель таймера/счетчика - 1024. Это означает, что у меня есть эффективный диапазон ввода (см. level переменная в коде) примерно 0-65. Мой источник переменного тока - США (60 Гц).

#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

Только быстрый ответ. Какие луковицы вы попробовали? Лампы накаливания и галогенные лампы являются регулируемыми, светодиодные и флуоресцентные (неоновые и CFL) - нет. Более того, я бы добавил демпферную сеть ... Тогда .. Почему выход желтой волны несимметричен? – frarugi87

+0

Лампы накаливания и затемнения. Да, я подумал о демпфере, у меня просто нет деталей на руке прямо сейчас. Я думаю, что это поможет, но я не думаю, что это исправит мою текущую проблему. – thread9000

+0

Желтый ответ от детектора нуля. Это то, что кормит в attiny85. – thread9000

ответ