Страница 1 из 2

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

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

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

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

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

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

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

Добавлено: Пн дек 03, 2012 02:18:05
afynfpbz
Надо ли так сложно?
Посмотрите на MOC3063(M) - симисторный оптрон широкого применения с коммутацией нагрузки в момент перехода сетевого напряжения через ноль.
В datasheet-е на него пример применения.

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

Добавлено: Пн дек 03, 2012 07:07:47
zero648
afynfpbz писал(а): MOC3063(M) - симисторный оптрон широкого применения с коммутацией нагрузки в момент перехода сетевого напряжения через ноль.

Это для фазового регулирования не подходит.

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

Добавлено: Пн дек 03, 2012 09:13:49
afynfpbz
Человек хочет включать нагрузку при переходе через 0 и выключать в нуле - это вообще не фазовое регулирование. Для этой цели и нужен такой оптосимистр.

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

Добавлено: Пн дек 03, 2012 09:30:08
zero648
Тогда зачем чего-то ждать?
2) После перехода через 0, ждем N времени и открываем симистор, а при следующем переходе через 0 закрываем его.

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

Добавлено: Пн дек 03, 2012 09:40:24
BARSik_
Да, хочу сделать фазовое регулирование, но не могу до конца понять принцип, поэтому и прошу помощи.

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

Добавлено: Пн дек 03, 2012 10:12:17
Аlex
а при следующем переходе через 0 закрываем его.
Не нужно. Он закроется сам.

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

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

- В какой момент его выключать?
Как только отсчитали необходимое время после перехода :)

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

Добавлено: Пн дек 03, 2012 11:08:55
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%).

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

Добавлено: Пн дек 03, 2012 16:06:04
Аlex
Узнать что тут не так сможете только Вы, зная свой код, прогнав его в отладчике. Возьмите тот-же протеус, подайте на МК синус и подцепите осциллограф на него и на выход открытия триака. И всё сразу станет понятно, работает или нет и почему не работает.

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

Добавлено: Пн дек 03, 2012 16:11:25
BARSik_
А сам алгоритм правильный?

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

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

Вот и сравнивайте его со своей программой.

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

Добавлено: Пн дек 03, 2012 16:35:17
s_black
BARSik_ писал(а): Очень надеюсь на вашу помощь :)

Помощь

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

Добавлено: Пн дек 03, 2012 22:01:27
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, как тогда быть? Задержки явно не подойдут... В общем думал, думал и все какой-то огромный код получается, слишком много всего считать надо (да, с программным ШИМ все намного проще было). Что посоветуете?

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

Добавлено: Пн дек 03, 2012 22:30:15
ibiza11
BARSik_ писал(а):В общем думал, думал и все какой-то огромный код получается, слишком много всего считать надо (да, с программным ШИМ все намного проще было). Что посоветуете?
:shock:
Уважаемый, с программным многоканальным ШИМом считать нужно ровно столько же или почти столько же.

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

Добавлено: Пн дек 03, 2012 22:42:38
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 каналов, отлично работает, а считается всего одна переменная :) А тут у меня на каждый канал получается не менее двух отдельных переменных. :(

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

Добавлено: Пн дек 03, 2012 23:09:28
BARSik_
Так что с многоканальностью посоветуете?

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

Добавлено: Ср дек 05, 2012 00:21:02
BARSik_
Уважаемые коты, нуждаюсь в вашей помощи, хотя бы подтолкните в нужном направлении :roll:

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

Добавлено: Ср дек 05, 2012 07:58:31
ibiza11
:facepalm:
в каждый момент перехода через 0 запускается таймер на время = дискрету регулировки. Если нужно 100 шагов, то таймер запускаем на 10/100=0,1мс.
В прерывании инкрементируем переменную и последовательно сравниваем ее с уставками каждого канала, при превышении уставки - включаем симистор.
Все повторяется в каждом полупериоде.

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

Добавлено: Ср дек 05, 2012 11:16:03
BARSik_
Это я понял, А вот как организовать задержки для включения симистора (50, 100 мкс. и т.д.)? Через второй таймер?

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

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

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