Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ATMEGA128 и ШИМ
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Oleg_IT
Ни как не могу заставить OC1A работать в режиме Fast PWM, меняется частота. На OC0 всё нормально. Чего-то я не пойму. Какие там биты, регистры ставить нужно?
Savrik
Страница 135 даташита на ATMega128 (Rev. 2467S-07/09) http://www.atmel.com/dyn/resources/prod_do...nts/doc2467.pdf , регистр TCCR1A:
Цитата
Combined with the WGMn3:2 bits found in the TCCRnB Register, these bits control the counting
sequence of the counter, the source for maximum (TOP) counter value, and what type of waveform
generation to be used, see Table 61.....
Oleg_IT
Прошёл все сочетания бит WGM13:0. Меняется только частота, ШИМ ни как!
SysRq
Допустим, при COM1A1 = 1, COM1A0 = 1 получим режим: установка OC1A в 1 при совпадении TCNT1 с OCR1A, сброс OC1A в 0 при TCNT1 = 0. Значения для ШИМ писать в OCR1A по переполнению (флаг TOV1).
Счет может быть от 0 до, или: 0x00FF, 0x01FF, 0x03FF, ICR1, OCR1A, - выбирается значением WGM13..0.

PS: не забыть DDRB |= (1 << 5) в инициализации.
Maik-vs
Цитата(Oleg_IT @ Feb 17 2010, 21:59) *
Прошёл все сочетания бит WGM13:0. Меняется только частота, ШИМ ни как!

Это похоже на режим CTC.
Oleg_IT
Но обещано Fast PWM. Ладно, перешёл на другой таймер.

SysRq - сложно это. Я так понял в этом случае прерывания нужны, что бы "Значения для ШИМ писать в OCR1A по переполнению (флаг TOV1)." или в основном цикле проверять флаг. В любом случае сложно, легче таймер сменить.
Savrik
Почему не получается? Дайте пример Вашего кода.
Вот что должно быть: смотрим таблицу 61, ищем режим Fast PWM, 10бит это режим№7. Записываем значения битов:
WGM13 = 0 ; WGM12 = 1 (обратите внимание, что эти биты находится в регистре TCCR1B); WGM11 = 1; WGM10 = 1. Далее, исходя из таблицы 59, выбираем режим (то, что будет на выходе ШИМов). Возьмем, к примеру, не инвертирующий выход, это COM1A1 = 1, COM1A0 = 0. Теперь выбираем частоту. Это биты CS12, CS11, CS10 регистра TCCR1B. Выберем частоту системного таймера, без деления CS12 = 0, CS11 = 0, CS10 = 1.
Теперь записываем значения в регистры
Код
TCCR1A = 0b10000011; //0x83;
TCCR1B = 0b00001001; //0x09

Записывая в OCR1AH и OCR1AL 0..1023(так как ШИМ 10-ти битный) определяют величину ШИМ:
Код
uint value = 512;
OCR1AH = (char)(value>>8);
OCR1AL = (char)value;

Все, должно работать. Если не можете разобраться в регистрах, советую CodeVisionAVR, там есть генератор начального кода, очень наглядно и поможет разобратся. Так же советую пройти сюда http://[banned]/. Все вычисления заняли 5 минут.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.