Главная > AVR, Tools > ШИМ-генератор для экспериментов.

ШИМ-генератор для экспериментов.

Уже порядком времени меня сильно интересуют разнообразные преобразователи напряжения. Всякие step-up, step-down, push-pull и т.п. Я много читал и думал, слегка посчитывал, и наконец решил потыкать их силовые части на макетке, чтобы окончательно разобраться, как и что там работает.

Ясное дело, что краеугольный камень всех импульсных топологий — генератор ШИМ. И для облегчения жизни во время опытов я решил сделать из моей любимой ATmega48 соответствующий инструмент поудобнее, чтобы экспериментировать максимально комфортно.

Собственно сам двухканальный генератор реализован на базе таймера 0 контроллера (т.е. выходами служат OC0A и OC0B). Контроллер общается с компьютером через UART. Для ПК написана программа-оболочка, позволяющая устанавливать параметры ШИМ. Печатная плата не разрабатывалась, все воткнуто в макетку.

Что есть в генераторе:

— независимая установка коэффициента заполнения двух каналов ШИМ;

— опциональная инверсия для каждого канала;

— синхронизация изменения коэффициента заполнения каналов. Опция предназначена для экспериментов с полумостом и push-pull’ом — при увеличении коэффициента заполнения одного канала второй автоматически синхронно уменьшается;

— генератор умеет выдавать заданное количество периодов (до 65535), после чего останавливаться;

— возможно выбрать одну из частот, определяемых аппаратным предделителем таймера МК (предполагается кварц / внутренний генератор 8МГц);

— при отключении генерации (выбор нулевой частоты / остановка после выдачи заданного количества периодов) выходы переводятся в состояние логического нуля;

Общение с устройством происходит через COM-порт (в моем случае — виртуальный) на скорости 2400 бод. Формат пакета описан в исходниках. В случае, если номер COM-порта больше, чем 9, перед ним надо указывать последовательность «\\.\» .

Кроме всего прочего присутствует красотулька — автоматически генерируемая картинка с ожидаемыми сигналами, а рядом с ней некоторые расчетные параметры.

Скриншот оболочки:

Прошивка МК написана в AVR Studio 4 + AVR-GCC, интерфейс — в C++ Builder, все нативно, никаких унылых дотнетов и шарпов. Исходники всего прилагаются. Там же есть и скомпилированный в релизовом режиме исполняемый файл оболочки.

Понятное дело, что программа создана чисто для себя в чисто некоммерческих и образовательных целях, не содержит мощных защит от дурака и не тестировалась со всех сторон, потому если кто-то еще решит ее использовать, то должен будет делать это только на собственный страх и риск. Я ничего не гарантирую и не отвечаю, если что-то у кого-то взорвется, загорится или еще что.

Рубрики:AVR, Tools
  1. 01/10/2012 в 11:47

    У-у-у ты Даешь!Класс!

    • YS
      03/10/2012 в 20:11

      Спасибо. С этим комментарием аналогично — почему-то был в спаме…

      • 07/12/2012 в 09:53

        По тому, что это просто тупая реклама. Надпись ради отображения ссылки на его сайт и ничего умного — в спаме ему и место.

        • YS
          07/12/2012 в 20:08

          Ну, у Вас ссылка тоже эм… Подозрительная.🙂 Но да, посты вроде наполнены смыслом.🙂

  2. Nobody
    17/09/2012 в 07:19

    Мне кажется что задавать заполнение канала в процентах не очень удачная идея. Лучше использовать 0-255, а процентики можно рядом выводить. Иначе получаем неравномерное изменение, т.е. 1 % реально соответствует либо 0.78 %, либо 1.17%.
    А можно кратко описать формат взаимодействия компмокроконтролер?

    • YS
      17/09/2012 в 20:52

      Ну, это делалось для самостоятельных экспериментов. Проценты для меня нагляднее. Тем более, что ниже в окне приводятся цифры в микросекундах, которые расчитываются не на основе процентов, а на основе реальной гранулярности 0 — 255 (см. исходник GUI).

      Комп передает контроллеру пакет из пяти байт (обязательно пять, контроллер считает байты и анализирует команду сразу после приема пяти байт). Ответа не предполагается. Формат пакета:

      Байт : значение

      0 : коэфф. заполнения канала «А», 0 — 255;
      1 : коэфф. заполнения канала «B», 0 — 255;
      2 : бит 7 — признак инверсии канала «A», бит 6 — признак инверсии канала «B», последние три бита — предделитель таймера (формат как в даташите, значение напрямую копируется в управляющий регистр; но ессно, сначала производится маскирование & 0x07);
      3 : младший байт количества периодов;
      4 : старший байт количества периодов.

      Если [4:3] дают ноль, то генерация идет непрерывно. Если что-то, большее нуля, контроллер выдает указанное количество периодов и переводит выходы в лог. 0. до следующей команды.

  1. No trackbacks yet.

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

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s