реклама на сайте
подробности

 
 
> Реализация 2-канального ШИМ на таймере T0 ATmega88
koluna
сообщение May 23 2008, 07:38
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



Здравствуйте!

Необходимо организовать двух-канальный ШИМ (вообще-то трёх-канальный, но для начала - двух-канальный).
256 градаций хватит.
Активный уровень - низкий (управление драйвером MBI1801 светодиодов).

Решил это осуществить на 8-битном таймере T0.
Выходы обоих каналов ШИМ - выводы OC0 (OC0A, OC0B).

Алгоритм следующий.
Загружаем в регистры сравнения соответствующие длительностям ШИМ значения.
Настраиваем таймер в режиме Normal, разрешаем прерывание по переполнению, режим работы блока сравнения (управление выводами OC0) - "состояние выводов меняется на противоположное".
Т. е., при равенстве счётного регистра и регистра сравнения состояние вывода OC0 меняется на противоположное. Далее, при переполнении таймера (период ШИМ) - состояние опять меняется на противоположное. Т. о., получается ШИМ,

Вкратце, код тестовой программы такой:

Код
...

void TIMER0_OVF_vect(void)
{
    TCCR0B |= (1 << FOC0A) | (1 << FOC0B);
    sei();
    return;
};

...

int main (void)
{
        ...

    OCR0A = n_red;
    OCR0B = n_green;
    TCNT0 = 0x00;
    TIMSK0 |= 1 << TOIE0;
    TCCR0A = 0b01010000;
    sei();
    TCCR0B = 0b00000011;
    
        ...
};


Всё просто, код маленький, работает.
Изначально выводы OC0 настраиваю как выходы и перевожу в состояние "1".
Но заметил странную особенность, которую никак объяснить не могу!
При выполнении команды TCCR0A = 0b01010000 состояние выводов OC0 меняется на противоположное, т. е., на "0".
Вопрос. Почему?
Ни в Евстифееве, ни в даташите на контроллер я ответа на свой вопрос не нашёл...
Обидно... несколько пугает и обескураживает wink.gif
Помогите разобраться, пожалуйста!

Спасибо заранее!


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
GDI
сообщение May 23 2008, 09:41
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Цитата
Но в этом режиме каждый из таймеров, к великому огорчению, может обеспечить только один канал ШИМ

Откуда такие данные? Я конечно с мега88 не работал но у других мег такого что то не припомню.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
koluna
сообщение May 23 2008, 11:09
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



Цитата(GDI @ May 23 2008, 13:41) *
Откуда такие данные? Я конечно с мега88 не работал но у других мег такого что то не припомню.


Евстифеев (про меги книжка).
И даташит.
Правда не дословно это написано...
Так написано в таблице управление выводами OCn:
OCnB, OCnC - зарезервировано.

Блииин... какойже я невнимательный... несколько раз читал и только сейчас обратил внимание на нижние в таблице два режима... "Сбрасывается или устанавливается при равенстве регистров и устанавливается или сбрасывается при достижении счётчиком максимального значения...".
Т. е., всё замечательно yeah.gif
Виноват...

Цитата(=GM= @ May 23 2008, 14:19) *
1) Установка OC0А, OC0В должна быть выполнена до установки DDR соответствующего пина. У вас этого не видно.


А откуда это следует? Можно ссылочку на страницу даташита, пожалуйста? smile.gif
Т. е., как на работу влияет последовательность установки регистров сравнения и настройки DDR?

Цитата
2) Как вы определили, что именно после выполнения команды TCCR0A=0х50, состояние пинов OC0А, OC0В меняется?


Создавал временные задержки и по длительности импульсов определил кусок кода smile.gif


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 07:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.0137 секунд с 7
ELECTRONIX ©2004-2016