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

Ноль на выходе вместо меандра с интервалом 5 мс

Добавлено: Чт июн 17, 2010 10:16:13
poligon
Решил сделать себе диммер. Почитал теорию. Усвоил. Дошло до практики. И вот первые грабли...

Итак. Частота тока в сети 220 В равняется 50 Гц (колебаний в секунду). Т.е. период одного полного колебания 1 / 50 = 0,02 сек. Соответственно один полупериод 0,01 сек или 10 мс. Мощность отдаваемая в нагрузку это площадь под "кривой синуса". Соответствено половина мощности это площадь под кривой синуса за период от 0 до пи/2. Т.е. 0,01 / 2 = 0,005 сек или 5 мс.
Откуда следует что если мы отключим напряжение через 5 мс после прохождения нуля и будем продолжать так постоянно делать, то получим 50% нагрузки. С этим всё ясно.

Дальше. Чтобы проверить это создал простой проект в CodeVisionAVR. Контроллер ATMega8. Частота 16 МГц.
Использую 16-ти битный таймер. Делитель таймера 8. Следовательно:
16 / 8 = 2 МГц частота таймера.
2000000 / 65536 = 30,517578125 Гц частота "переполнения". Или же 1 / 30,517578125 = 0,032768 сек. время одного "переполнения".
В одном "переполнении" у нас 65536 тиков. Следовательно 0,032768 / 65536 = 0,0000005 сек. время одного тика таймера.
Чтобы получить 0,005 сек необходимо чтобы таймер тикнул 0,005 / 0,0000005 = 10000 раз.
10000 в 16-тиричной системе это 2710.

Изображение

CodeVisionAVR сгенерировал следующий код:

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

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 2000,000 kHz
// Mode: CTC top=ICR1
// OC1A output: Toggle
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x40;
TCCR1B=0x1A;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x27;
OCR1AL=0x10;
OCR1BH=0x00;
OCR1BL=0x00;
Но вот незадача. В протеусе осциллограф подключенный на выход PB1 показывает постоянно 0. Т.е. нет никаких колебаний. Хотя я поставил режим toggle. Т.е. изменить бит при каждом сбросе таймера по совпадению.

Что я сделал не так?

Re: Ноль на выходе вместо меандра с интервалом 5 мс

Добавлено: Чт июн 17, 2010 17:43:48
Барсик
Вы выбрали моду CTC top=ICR1 А потом у Вас написано:
ICR1H=0x00;
ICR1L=0x00;
А теперь, внимание, вопрос! Чему равно значение, до которого должен считать Ваш Счётчик?
Может он досчитать до 10000 ? :)

Вы не так выбрали моду.

"Когда пользуетесь визардом в кодевижене, смотрите внимательно на поля, Вами заполняемые. Иначе такое использование будет пустою забавою..."
(с) Козьма Прутков программист

Re: Ноль на выходе вместо меандра с интервалом 5 мс

Добавлено: Чт июн 17, 2010 19:47:03
poligon
Спасибо за ответ. Правда я сам уж понял в чём ошибся :) Исправил. Работает. Поставил CTC top=OCR1A.

Хотелось бы узнать ещё вот что. Правильно ли я делаю:

При переходе через ноль:

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

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 2000,000 kHz
// Mode: CTC top=OCR1A
// OC1A output: Clear
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off

//Устанавливаем лог. 1 на PB.1
PORTB.1^=1;

// по прерыванию (по спаду) запускаем таймер (т.е. при переходе через 0)
TCCR1A=0x80;                 
TCCR1B=0x0A;        
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x27;
OCR1AL=0x10;
OCR1BH=0x00;
OCR1BL=0x00;

} 

// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
// он отсчитал 5 мс, установил на РВ.1 ноль (Out A clear).
// останавливаем таймер

TCCR1A=0x80;
TCCR1B=0x08;     

}
Изображение

Запустить в протеусе не получается. Не хватает мощи компа почему то (2-х ядерник).

Правильно?

Re: Ноль на выходе вместо меандра с интервалом 5 мс

Добавлено: Пт июн 18, 2010 14:04:43
Барсик
Неправильно. Моду выбрать Normal top=FFFFh. Прерывание Compare A Match. В регистр сравнения загрузить 2710h.

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

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
PORTB.1 = 1; // установили 1
TCNT1 = 0; // сбросили таймер
}

// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
PORTB.1 = 0; // установили 0
}
Всё!

Полный текст в прикошаченном файле

Re: Ноль на выходе вместо меандра с интервалом 5 мс

Добавлено: Вс июн 20, 2010 22:18:03
poligon
Спасибо!!!! Только не пойму чего то. Собрал по классической схеме:
Изображение

Использую MOC 3052 и BT136. При выключенном светодиоде оптрона напряжения в цепи быть не должно. Но вольтметр показывает 165 вольт :shock: Если подключить лампочку, то она мерцает (видео 1). Чтобы проверить просто подаю 5 вольт (через резистор 300 Ом) на светодиод оптрона. Лампа начинает устойчиво гореть в полный накал.

Убрал цепочку из резистора 39 Ом и конденсатора 0,01 мкФ. Мерцания прекратились. Но если при выключенном светодиоде вставить вилку в розетку, то спираль лампы слабо нагревается и гаснет. (видео 2). Почему???? Светодиод то выключен!!! Это нормально???

http://depositfiles.com/files/6pk68rtxh

Re: Ноль на выходе вместо меандра с интервалом 5 мс

Добавлено: Пн июн 21, 2010 10:23:25
Modest
Кстати тоже была такая проблема, и тоже пришлось исключить RC цепочку. Подскажите ктонить, будет очень интерестно услышать обьяснения.

Re: Ноль на выходе вместо меандра с интервалом 5 мс

Добавлено: Пт июн 25, 2010 15:48:53
shev377
Увеличить R2 Уменьшить R1?
Может импульс от искры включения вилки открывает семистор?

Re: Ноль на выходе вместо меандра с интервалом 5 мс

Добавлено: Пт июн 25, 2010 16:02:52
Modest
Так он моргает, на глаз, герц 25. Какого ... он это делает??