http://forum.getchip.net/

Организация произвольного количества ШИМ (PWM) каналов.
http://forum.getchip.net/viewtopic.php?f=18&t=164
Страница 1 из 3

Автор:  GetChiper [ 25 янв 2012, 22:39 ]
Заголовок сообщения:  Организация произвольного количества ШИМ (PWM) каналов.

Широтно-импульсная модуляция широко используется в микроконтроллерах. В каждом из таймеров МК есть по несколько таких каналов. И обычно их хватает, но что делать если нужно больше каналов? Тут выход один - делать их программно. Вот для этого и создан этот кусочек кода.
Программа для организации произвольного количества ШИМ каналов. sshot-1.png
sshot-1.png [ 9.1 КБ | Просмотров: 19092 ]
- Для каждого канала уровень ШИМ задается в переменной Bri* (где * - номер канала).
- Все действия производятся в прерываниях таймера0 (или другого по выбору).Для основной программы работа программного ШИМ незаметна. Менять уровень канала можно в любое время, в любом месте программы.
- Задействован только один регистр общего назначения (и его можно освободить храня переменную в памяти).
- Обработка одного канала занимает 7 слов памяти и 8 тактов процессорного времени (не забываем, что для обеспечения частоты ШИМ в 120Гц необходимо каналы обрабатывать 120*256=30720 раз в секунду).
- Теоретически (при частоте задающего генератора 20МГц) можно организовать до 100 таких каналов (если ножек хватит :)).P.S. Отдельной процедурой (прерыванием?) выложу вариант организации ШИМ-каналов, когда данные каналов выводятся не отдельно на ножки, а через SPI интерфейс в сдвиговый регистр (это значительно сэкономит память и процессорное время при большом количестве каналов).

Вложения:
Комментарий к файлу: Организация произвольного количества ШИМ (PWM) каналов.
PWM-test.zip [15.21 КБ]
Скачиваний: 845

Автор:  LeXSS [ 08 фев 2012, 21:18 ]
Заголовок сообщения:  Re: Организация произвольного количества ШИМ (PWM) каналов.

Уважаемый, GetChiper.
Пожалуйста разъясните:
1. Мне кажется таймер настроен неправильно прерывания будут 8000000/256=31250 раз в секунду,
а нам надо 120*256=30720 (Clock select:CK/256 , и добавить оператор |120->TCNT0 в тело и в обработку прерывания)
2. Почему Таймер в режиме PWM-это же аппаратный ШИМ режим?
3. Для чего сохраняем в стек R17?

Автор:  GetChiper [ 08 фев 2012, 23:12 ]
Заголовок сообщения:  Re: Организация произвольного количества ШИМ (PWM) каналов.

Разъясняю:
1 Разница между 31250Гц и 30720Гц несущественна. Вообще можно свободно варьировать частоту обработки каналов в широких пределах, начиная с 80Гц (меньше не стоит - будет заметно мерцание) и заканчивая 150-200Гц (больше просто бессмысленно). Частота в 120Гц (или около того) выбрано мною просто исходя из времени переполнения таймера.
2 Таймер нужен просто чтобы вызывать прерывания в заданные промежутки времени (в данном случае по переполнению) в каком режиме он работает неважно.
3 r17 сохраняю на всякий случай. Мало ли что захочется впихнуть в прерывание в будущем (билдер использует пару регистров r16 и r17 для реализации макроопераций, поэтому желательно их сохранять до обработки прерывания и восстанавливать после).

Автор:  LeXSS [ 09 фев 2012, 08:48 ]
Заголовок сообщения:  Re: Организация произвольного количества ШИМ (PWM) каналов.

Большое спасибо. Сделаю в железе с кнопочкой отпишусь.

Автор:  SVN [ 08 май 2012, 12:31 ]
Заголовок сообщения:  Re: Организация произвольного количества ШИМ (PWM) каналов.


Автор:  SVN [ 08 май 2012, 14:07 ]
Заголовок сообщения:  Re: Организация произвольного количества ШИМ (PWM) каналов.

Косвенно причину обнаружил. Это наложение прерываний от разных таймеров, а вот как это победить, пока не получается. :(

Автор:  SVN [ 08 май 2012, 15:39 ]
Заголовок сообщения:  Re: Организация произвольного количества ШИМ (PWM) каналов.

Упорство принесло вознаграждение. Суть: При обработке значений АЦП не хватало времени уйти на следующие прерывание для ШИМ, в итоге задержка и как результат, подмаргивания. Вышел из положения банально просто, разрешив глобальные прерывания при обработке значений АЦП, и всё стало работать корректно. Автору программы РЕСПЕКТ! :-)

Автор:  Часто проходящий [ 21 ноя 2012, 01:14 ]
Заголовок сообщения:  Re: Организация произвольного количества ШИМ (PWM) каналов.

Делал PWM по данному алгоритму, нужно было чтобы когда 255 - то горело непрерывно.
А там один импульс пролетает. Чтобы этого не было - добавляется одна команда (на рисунке красным). Теперь если 0 - выключено, 255 - включено, от 1 до 254 - ШИМ.

Автор:  GetChiper [ 21 ноя 2012, 12:24 ]
Заголовок сообщения:  Re: Организация произвольного количества ШИМ (PWM) каналов.

Да, так действительно будет "чистый" высокий уровень на выходе.

Автор:  Гость [ 18 фев 2013, 18:21 ]
Заголовок сообщения:  Re: Организация произвольного количества ШИМ (PWM) каналов.

А где же:

"P.S. Отдельной процедурой (прерыванием?) выложу вариант организации ШИМ-каналов, когда данные каналов выводятся не отдельно на ножки, а через SPI интерфейс в сдвиговый регистр (это значительно сэкономит память и процессорное время при большом количестве каналов)."

Очень ждем.

Страница 1 из 3 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/