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

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

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

Сообщение BARSik_ »

Решил разобраться с фазовым управление симистором, пробежался по интернету, почитал сайты, но до конца так и не понял. Вроде как алгоритм такой:

1) Ждем перехода напряжения через 0, (определяем компаратором или прерыванием)
2) После перехода через 0, ждем N времени и открываем симистор, а при следующем переходе через 0 закрываем его.
3) Повторям п.1.

Ну в программе что-то вроде такого: пришло прерывание INT0 -> запретили прерывание INT0 -> запустили таймер -> отсчитали интервал -> включили симистор.

Сразу возникло несколько вопросов:
- Какое должно быть время одного тика?
- Как определить, сколько времени ждать до включения симистора?
- В какой момент его выключать?

Очень надеюсь на вашу помощь :)
afynfpbz
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Пт сен 21, 2012 22:58:16

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

Сообщение afynfpbz »

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

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

Сообщение zero648 »

afynfpbz писал(а): MOC3063(M) - симисторный оптрон широкого применения с коммутацией нагрузки в момент перехода сетевого напряжения через ноль.

Это для фазового регулирования не подходит.
afynfpbz
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Пт сен 21, 2012 22:58:16

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

Сообщение afynfpbz »

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

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

Сообщение zero648 »

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

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

Сообщение BARSik_ »

Да, хочу сделать фазовое регулирование, но не могу до конца понять принцип, поэтому и прошу помощи.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

а при следующем переходе через 0 закрываем его.
Не нужно. Он закроется сам.

- Какое должно быть время одного тика?
Это уже решать Вам, на сколько дискрет делить период. Чем больше дискрет, тем плавнее регулирование вых. мощности.

- Как определить, сколько времени ждать до включения симистора?
Очень просто. Это время будет обратное времени открытия триака. Т.е. = еденица минус время открытия в тиках. Еденица - это полное кол-во тиков за пол-периода.

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

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

Сообщение BARSik_ »

Время одного полупериода 10мс. Если, к примеру, взять таймер с временем тика 0,1мс, то получится 100 градаций яркости. А вот программная реализация...

Может сделать так:

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

ISR(INT0_vect){ //словили переход через 0
 TCCR1B |= (1 << WGM12) | (1<< CS11);    //запуск таймера 1, тактовая частота таймера 1МГц., предделитель 8
 TIMSK |= (0 << INT0) | (1 << OCIE1A);    // запретили прерывание INT0, разрешили прерывания по совпадению
}

ISR(TIMER1_COMPA_vect){
 count++; //начали отсчитывать время

 if(count > 99){counter = 0; //прошло 10мс.
     TCCR1B = 0; //отключили таймер
     TCNT1 = 0;   //сбросили счетчик, на всякий случай
     GIFR = 0;     //сбросили флаг прерывания
     TIMSK |= (1 << INT0) | (0 << OCIE1A); //включили прерывания INT0, выключили прерывания по совпадению
 }

 if(count >= pow){ //если прошло определенное время, включаем симистор
    PORTD &= ~_BV(PD0); //включили симистор
 }else{
    PORTD |= _BV(PD0); //симистор выключен
 }

}


Теперь хотелось бы узнать, что тут неправильно (а в том, что что-то неправильно уверен на 100%).
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Узнать что тут не так сможете только Вы, зная свой код, прогнав его в отладчике. Возьмите тот-же протеус, подайте на МК синус и подцепите осциллограф на него и на выход открытия триака. И всё сразу станет понятно, работает или нет и почему не работает.
BARSik_
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Вт авг 28, 2012 20:05:45

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

Сообщение BARSik_ »

А сам алгоритм правильный?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Алгоритм прост.
1. Ждём перехода через ноль.
2. Отсчитываем время, равное полпериоду минус время открытия.
3. Открываем триак микросекунд на 100-200.
4. Отсчитываем 10 миллисекунд.
5. Открываем триак на 100-200 мкс.
6. Переходим на пункт №1.

Вот и сравнивайте его со своей программой.
Аватара пользователя
s_black
Мучитель микросхем
Сообщения: 411
Зарегистрирован: Вс авг 10, 2008 19:35:49
Откуда: Евпатория
Контактная информация:

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

Сообщение s_black »

BARSik_ писал(а): Очень надеюсь на вашу помощь :)

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

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

Сообщение BARSik_ »

Пока сделал так, схитрил и поставил задержки:

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

ISR(TIMER1_COMPA_vect){// время одного тика 0,1мс.
 
 if(counter == pow){
      ON;
      _delay_us(150);
      OFF;

      _delay_ms(10);
 
      ON;
      _delay_us(150);
      OFF;

      TCCR1B = 0;
      TIMSK |= (1 << INT0) | (0 << OCIE1A);

      counter = 0;
 }

 counter++;

 if(counter > 100){
    TCCR1B = 0;
    TIMSK |= (1 << INT0) | (0 << OCIE1A);
    counter = 0;
 }
}


В железе работает неплохо, правда есть небольшое дрожание света, а между 100% яркости и примерно 90% провал, т.е. резко переходит от одного значения к другому. Но, думаю, это можно без проблем исправить. Сейчас интересует другое, вот на один канал все понятно, а если их надо несколько, например 4-5, как тогда быть? Задержки явно не подойдут... В общем думал, думал и все какой-то огромный код получается, слишком много всего считать надо (да, с программным ШИМ все намного проще было). Что посоветуете?
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

BARSik_ писал(а):В общем думал, думал и все какой-то огромный код получается, слишком много всего считать надо (да, с программным ШИМ все намного проще было). Что посоветуете?
:shock:
Уважаемый, с программным многоканальным ШИМом считать нужно ровно столько же или почти столько же.
Ставим плюсы: )
BARSik_
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Вт авг 28, 2012 20:05:45

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

Сообщение BARSik_ »

Ну не скажите:

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

ISR (TIMER0_OVF_vect){ // ШИМ для светодиодов

 if (pwm_counter++ > 255){
      OFF;
      pwm_counter = 0;
   }

   if (pwm_counter > led[0]){L1_ON;}
      if (pwm_counter > led[1]){L2_ON;}
         if (pwm_counter > led[2]){L3_ON;}

         if (pwm_counter > led[3]){L4_ON;}
            if (pwm_counter > led[4]){L5_ON;}
               if (pwm_counter > led[5]){L6_ON;}
}


Делал вот так на 6 каналов, отлично работает, а считается всего одна переменная :) А тут у меня на каждый канал получается не менее двух отдельных переменных. :(
BARSik_
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Вт авг 28, 2012 20:05:45

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

Сообщение BARSik_ »

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

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

Сообщение BARSik_ »

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

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

Сообщение ibiza11 »

:facepalm:
в каждый момент перехода через 0 запускается таймер на время = дискрету регулировки. Если нужно 100 шагов, то таймер запускаем на 10/100=0,1мс.
В прерывании инкрементируем переменную и последовательно сравниваем ее с уставками каждого канала, при превышении уставки - включаем симистор.
Все повторяется в каждом полупериоде.
Ставим плюсы: )
BARSik_
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Вт авг 28, 2012 20:05:45

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

Сообщение BARSik_ »

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

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

Сообщение zero648 »

BARSik_ писал(а):А вот как организовать задержки для включения симистора (50, 100 мкс. и т.д.)? Через второй таймер?
Не надо второй, этим же таймером, просто нужно создать переменную-флаг первого входа в прерывание.

Например, детектор нуля подключен на INT1, вход INT1 настроен на изменение логического состояния, при срабатывании прерывания по данному условию (изменение логического состояния) в обработчике прерывания INT1 инициализируем, например, таймер 0, задаем сколько он должен отсчитать (у меня это обычно табличное значение) до прерывания по таймеру, включаем флаг первого входа. В прерывании таймера проверяем флаг, если включен, значит первый вход, тогда включаем триак и выключаем флаг, устанавливаем длину сигнала, т.е. число, которое этот же таймер отсчитает, например 250 usec. При повторном прерывании таймера проверяем флаг, если он выключен значит это второй вход, тогда отключаем триак и останавливаем сам таймер, т.е. TCCR=0. И так для каждого полупериода.
Ответить

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