[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
Лучше всего - посредством PCA (Programmable Counter Array) и/или аппаратного PWM, если таковые имеются в Вашем MCU. Этот вариант самый простой, быстрый и точный - т.к. PWM генерится аппаратно, то нет никакого дребезга фронтов из-за разного времени реакции на прерывание.
Другой вариант - полупрограммный, с использованием 16-битного таймера. Больше мороки, практически неизбежный дребезг фронтов, бОльшая трата ресурсов процессора.
Третий вариант - чисто программный, основанный на генерации точных задержек. Практически полная загрузка процессора, медленно (таймеры во многих MCU считают быстрее машинного цикла), правда, если отказаться от прерываний (бывают и такие задачки ведь!:о), то можно получить PWM без дребезга.
Первые два варианта на блюдечке выложены у Cygnal в виде весьма грамотных статей с исходниками (см. ссылку), только учтите, что Cygnal - это одно-, а не 4-, 6-, или 12-тактная машинка в отличие от большинства известных инкарнаций х51. Собственно, подход будет весьма схожим и для других (не х51) архитектур.
Удачи!
E-mail: info@telesys.ru