Итак. Частота тока в сети 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;Что я сделал не так?



