Фазовый регулятор на AVR, нужна помощь...

Обсуждаем контроллеры компании Atmel.
BARSik_
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Вт авг 28, 2012 20:05:45

Re: Фазовый регулятор на AVR, нужна помощь...

Сообщение BARSik_ »

Ага, сегодня вечером попробую реализовать :)
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: Фазовый регулятор на AVR, нужна помощь...

Сообщение ibiza11 »

zero648 писал(а):...тогда отключаем триак и останавливаем сам таймер, т.е. TCCR=0. И так для каждого полупериода.
Я говорил не о таком подходе.
У Вас : триак включается в начале полупериода, а выключается через некоторое время.
У меня : триак выключен в начале полупериода, включается через некоторое время. По достижении нуля триак и так сам выключится.
Ставим плюсы: )
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Re: Фазовый регулятор на AVR, нужна помощь...

Сообщение zero648 »

ibiza11 писал(а):Я говорил не о таком подходе.
У Вас : триак включается в начале полупериода, а выключается через некоторое время.
Триак включается не в начале полупериода, а в заданное время по таймеру, первый отсчет таймера устанавливает обработчик INT1, время импульса устанавливается в обработчике таймера.
ibiza11 писал(а):У меня : триак выключен в начале полупериода, включается через некоторое время. По достижении нуля триак и так сам выключится.
Триак не отключится по достижении нуля, если не снять сигнал.

Код для примера:
Спойлер

Код: Выделить всё

; ---------- EXTERNAL INT1 interrupt vector ----------

EXT_INT1:
            push    r17
            push    r16
            in      r16, SREG
            push    r16

            ser     INT1_FLG
            ldd     r16, Y+$0
            ldd     r17, Y+$01
            std     Y+$05, r17
            out     TCNT0, r16
            ldi     r16, (0b011<<CS00)
            out     TCCR0, r16        ; Enable TCNT0
                                      ; Normal mode
                                      ; Prescaler 011=1:64
                                      ; 001=1:1,010=1:8,011=1:64,100=1:256,101=1:1024
            pop     r16
            out     SREG, r16
            pop     r16
            pop     r17
            reti

.............................

; ---------- TIMER0 OVF interrupt vector - SINEWAVE CONTROL ----------

TMR0_OVF:
            push    r16
            in      r16, SREG         ; Сейф SREG
            push    r16

            ldd     r16, Y+$05
            subi    r16, 1
            std     Y+$05, r16
            brcc    T0_EXIT
            tst     INT1_FLG
            breq    clos_triac
open_triac: sbi     PORTB, 5          ; Open TRIAC
            clr     INT1_FLG
            ldi     r16, (0x00-0x20)
            out     TCNT0, r16
            std     Y+$05, INT1_FLG
            pop     r16
            out     SREG, r16
            pop     r16
            reti
clos_triac:
            cbi     PORTB, 5          ; Close TRIAC
            out     TCCR0, INT1_FLG   ; Стоп Timer0
T0_EXIT:
            pop     r16
            out     SREG, r16         ; Ресторе SREG
            pop     r16
            reti

Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: Фазовый регулятор на AVR, нужна помощь...

Сообщение ibiza11 »

неправильно понял Ваше сообщение. прошу прощения.
Триак не отключится по достижении нуля, если не снять сигнал.
Я с этим и не спорил вроде как :dont_know:
Ставим плюсы: )
BARSik_
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Вт авг 28, 2012 20:05:45

Re: Фазовый регулятор на AVR, нужна помощь...

Сообщение BARSik_ »

Убрал задержу в 10мс. получилось так:

Код: Выделить всё

ISR(INT0_vect){
   counter = 0;

   TCCR1B |= (1 << WGM12) | (1 << CS11);    
   GIFR = 0;
}

ISR(TIMER1_COMPA_vect){

 if(flag1 == 0){

    if(counter == ch1){
        CH1_ON;
        _delay_us(150);
        CH1_OFF;

        flag1 = 1;
 
        TCCR1B = 0;
        GIFR = 0;
    }
 }else{
    CH1_ON;
    _delay_us(150);
    CH1_OFF;

    flag1 = 0;

    TCCR1B = 0;
    GIFR = 0;
}

 counter++;

 if(counter == 99){
    TCCR1B = 0;
    GIFR = 0;
 }

}


Микросекундные задержки пока не убрал, времени не было, завтра уберу. Все это дело в принципе работает, но есть несколько замечаний:
1) Присутствует дрожание, небольшое но есть.
2) Нет максимальной яркости, визуально доходит процентов до 85-90, даже если переменная ch1 равна нулю, т.е. включение симистора происходит сразу.

Из-за чего это может быть? Подозреваю "кривое" детектирование перехода через 0, сейчас стоит резистор 1М., подключенный к INT0. Завтра соберу что-нибудь более существенное.
Последний раз редактировалось BARSik_ Чт дек 06, 2012 20:12:07, всего редактировалось 1 раз.
BARSik_
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Вт авг 28, 2012 20:05:45

Re: Фазовый регулятор на AVR, нужна помощь...

Сообщение BARSik_ »

Собрал другой детектор нуля, вот такой:
Изображение

В работе почти ничего не изменилось, на максимальную яркость лампа не включается, и присутствует мерцание. В какую сторону копать?
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Re: Фазовый регулятор на AVR, нужна помощь...

Сообщение zero648 »

В моем алгоритме flag1 включается в прерывании INT, а выключается в первом входе в прерывание таймера. Таймер станавливает себя во втором входе, когда flag1 = 0. Почему у вас таймер останавливается при любом flag1?
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Фазовый регулятор на AVR, нужна помощь...

Сообщение ChipKiller »

на максимальную яркость лампа не включается, и присутствует мерцание. В какую сторону копать?
... в сторону понимания , что в "чистом 0" симистор не может включится
BARSik_
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Вт авг 28, 2012 20:05:45

Re: Фазовый регулятор на AVR, нужна помощь...

Сообщение BARSik_ »

zero648 писал(а):В моем алгоритме flag1 включается в прерывании INT, а выключается в первом входе в прерывание таймера. Таймер останавливает себя во втором входе, когда flag1 = 0. Почему у вас таймер останавливается при любом flag1?


В каком смысле - во втором входе в прерывание? Таймер же за один полупериод успевает войти в прерывание 100 раз. Xто-то я совсе запутался... Можете кусочком кода поделиться? :roll:
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Re: Фазовый регулятор на AVR, нужна помощь...

Сообщение zero648 »

Выше пример приводил, но там таймер срабатывает по переполнению, а не по совпадению, атмега8 однако.
Ответить

Вернуться в «AVR»