Извращенский ШИМ из UART

Распечатать
Пока писал статью про UART пришла в голову одна извращенная идея — на базе UART же можно организовать самый натуральный низкодискретный ШИМ!

Достаточно только сделать где-нибудь в памяти переменную, куда мы будем совать число с заданной скважностью нулей и единиц, а по прерыванию опустошения буфера это число снова пихать в регистр UDRE. Таким образом, генерация ШИМ будет самопроизвольной, без лишних телодвижений. Правда можно получить всего 10 разных значений ШИМ, но зато нахаляву!!!

Для тех кто не понял как, приведу числа которые надо будет непрерывно слать через UART:
два дополнительных значения мы получим за счет старт и стоп битов.

00000000 — 1/10
00000001 — 2/10
00000011 — 3/10
00000111 — 4/10
00001111 — 5/10
00011111 — 6/10
00111111 — 7/10
01111111 — 8/10
11111111 — 9/10

Да и частоты там можно получить нефиговые!
Красота!=)))))

Запись опубликована в рубрике AVR. Учебный курс с метками , , , , . Добавьте в закладки постоянную ссылку.

19 комментариев: Извращенский ШИМ из UART

  1. XDN говорит:

    UART — ппц универсальная штука. Из него шину 1-wire можно враз сделать.

  2. Fi5t говорит:

    И чем этот ШИМ может быть нам полезен? Может я чего-то не допонял…

  3. Fi5t говорит:

    Про движок подробней опиши. Реализацию в студию пожалуйста =)

    • DI HALT говорит:

      Как это какой?

      Получить нахаляву ШИМ не используя программные методы генерации.

      Тебе еще не приходилось забивать под завязку контроллер, когда начинаешь считать байты и выкидывать все лишнее? А у меня два раза такое было, когда память уже закончилась, а нужные фичи еще не реализованы. В итоге приходилось выкидывать все что можно и нельзя, сокращать текстовые строки и извращаться как только можно. В результате в 16кб прошивке, написанной на асме и заоптимизированной как тока можно, осталось свободными всего 14 байт.

      • Cluster говорит:

        Дык в АВРках можно аппаратно реализовать ШИМ через таймер, генерируя его на OC1A/OC1B ногах. И проще этого способа явно никакого нет, экономия памяти как раз будет больше, да и UART всё таки чаще нужен, чем OC1 ноги. Или ты не знал?

        • DI HALT говорит:

          Ок, ну начнем с того, что на AVR свет клином не сошелся, и например в моем горяче любимом АТ89С51 нельзя сделать аппаратный ШИМ на таймере. Там из периферии есть только UART и порты. Все :) Во вторых иногда нужен не один шим, а дохера — мне как то раз потребовалось 15 каналов. Для управления многофазным двигателем. И когда у тебя кончаются ШИМы на таймерах можно, экономя программные ресурсы, сделать его еще и на UART. Иногда выводы ШИМ от таймеров оказываются заняты (например на них висит SPI память), или таймеры нужно пустить на что либо более нужное, скажем на подсчет частоты. Или просто разводку платы проще сделать так, что можно ШИМ вывести с УАРТа (если конечно качества этого ШИМ хватит). Короче, вариантов множество.

          Ты просто не сталкивался еще с такими задачами когда один МК делает сразу же дохера всего да еще с критичной ко времени выполнения скоростью.

  4. jusupoff говорит:

    Тогда уж вывести ШИМ еще и через SPI, аналогично. :)))
    Частота будет максимально: такт/2/8.
    Вот только для вывода каждого байта заваливаться в прерывание… Или через каждые 16 тактов выводить очередной байт.
    С UART тоже придется делать что-то подобное.

    ИМХО — ерунда все это, если только побаловаться… Вместо того, чтобы выкручиваться и изголяться, дешевле (для нервов) железо под задачу подобрать нормально. :)

    • DI HALT говорит:

      Прерывания можно похерить. А по поводу побаловаться и железо под задачу… Есть такая вещь как стоимость. Порой цена на нужную железку превышает вдвое, а то и втрое. Когда один девайс то пофигу, а вот когда серийное производство? Я делаю мелкосерийку, максимум 50шт в месяц и то зажимаю каждую копейку.

  5. Алексей говорит:

    Да, действительно извращенческая идея! Но мне очень понравилась! Вообще, 10 градаций не предел — можно чередовать байты: 0x0f — 0×07 — 0x0f — 0×07 например будет давать что-то среднее…

Добавить комментарий