Что-то не получается. Помогите, пожалуйста.
Пытаюсь запустить ШИМ на Atmega8. Поставил фьюзы для внутреннего генератора на 8Мгц с помощью
калькулятора. С предделителем 256 должна получиться частота 31.25 КГц. Код сгенерировал через Codevision:
Для примера попробую скважность в 50%, в OCR1A вписал 1023/2 = 511 = 1FF:
- Код: Выделить всё
#include <mega8.h>
void main(void){
DDRB=0b00000110;
TCCR1A=0xA3;
TCCR1B=0x0C;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=(char)(0x1FF>>8);
OCR1AL=(char)0x1FF;
while (1) {};
}
Но почему-то вместо частоты в тридцать килогерц светодиод, подключенный к PB1, мигает несколько раз в секунду! Если сделать таймер, например, на 125Кгц - начинает мигать очень часто, но различимо глазом. Навскидку - частота получается в 10000 раз меньше, чем требуется. Вычитал про фьюз-бит SCKDIV8 - делитель частоты, но в Atmega8 его нет. Может быть, я что-то напутал с фьюзами, частота получилась не 8Мгц, и поэтому МК работает медленно?
Что я делаю не так?
Ответ: таймер отсчитывает от 0 до 1023 и на этом промежутке переключает уровень на ножке МК. Поэтому, чтобы узнать частоту ШИМ, нужно частоту таймера разделить на число, до которого таймер считает, в данном случае на 1023, или на 2*1023 для режима [url=http://roboforum.ru/wiki/AVR:ШИМ]Phase Correct[/url].