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

 
 
> странность с ШИМ на atmega48
Ermol
сообщение Jan 12 2011, 12:02
Сообщение #1





Группа: Новичок
Сообщений: 5
Регистрация: 12-01-11
Пользователь №: 62 169



Приветствую! Сразу скажу что я не особо секу в проргаммировании rolleyes.gif

Я настраиваю таймеры для работы ШИМ на атмеге48 - 20 Мгц, но получается что-то непонятное в те моменты когда ничего генерироваться не должно.

вот код

Код
#include <avr/io.h>

int main()
{

    DDRB = (1<<PB1)|(1<<PB2);

    TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM10);
    TCCR1B = (1<<WGM12)|(1<<CS11)|(0<<CS10);
    OCR1A = 0;
    OCR1B = 0;

      for(;;)
    {
    }    
}


а вот что получается - диничные имульсы через каждые 100мкс


картинка из протеуса, но осциллограф с ней согласен.

при этом шим работает адекватно, за исключением нулевого значения в OCR1A и OCR1B.

Подскажите, где не прав?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
Палыч
сообщение Jan 12 2011, 12:46
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Ermol @ Jan 12 2011, 18:02) *
когда ничего генерироваться не должно.
С чего это Вы взяли? Вот когда Вы зададите значение ТОР (в Вашем случае - FF), вот тогда импульсов не будет (но будет высокий уровень)...
Go to the top of the page
 
+Quote Post
Ermol
сообщение Jan 12 2011, 13:06
Сообщение #3





Группа: Новичок
Сообщений: 5
Регистрация: 12-01-11
Пользователь №: 62 169



Цитата(Палыч @ Jan 12 2011, 18:46) *
С чего это Вы взяли?

Тяжело сказать... Но я был в этом уверен cranky.gif

Убрать эти импульсы можно, я пологаю, просто отключая таймер когда мне нужен низкий уровень, прописывая в TCCR1B = (0<<CS11) ?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 12 2011, 13:36
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Ermol @ Jan 12 2011, 19:06) *
Убрать эти импульсы можно, я пологаю, просто отключая таймер когда мне нужен низкий уровень, прописывая в TCCR1B = (0<<CS11) ?
Вам, вероятно, нужно получить два различных выходных сигнала... Если Вы остановите таймер для получения "чистого" нуля на одном выходе, то что Вы будите иметь на втором выходе?
Если Вы желаете иметь "чистый" ноль, но не принципиально иметь "чистый" высокий уровень можно это организовать инверсией выхода (СОМ1х1:0=3) с одновременной инверсией значений, заносимых в OCR1х.
Go to the top of the page
 
+Quote Post
Ermol
сообщение Jan 12 2011, 15:20
Сообщение #5





Группа: Новичок
Сообщений: 5
Регистрация: 12-01-11
Пользователь №: 62 169



Точно, нужны оба выхода.
Идею я понял, спасибо!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 12 2011, 17:48
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Ermol @ Jan 12 2011, 18:06) *
Убрать эти импульсы можно, я пологаю, просто отключая таймер когда мне нужен низкий уровень, прописывая в TCCR1B = (0<<CS11) ?
Достаточно сбросить COM1A1 или COM1B1, предварительно записав в соответствующий разряд PORTx ноль.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 05:30
Рейтинг@Mail.ru


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