Перипетии нуба с ШИМом на Attiny13

Возникла давеча простенькая задачка. Нужен был регулируемый вручную ШИМ для теста одной идейки. Под рукой тинька 13 — т.е. цепляем переменник на АЦП и выводим что нам нужно. Казалось бы — проще только светодиодом помигать. Однако. Смеркалось.
Всё быстро воткнуто в макетку, с помощью мастера в CodeVision несколькими щелчками собран проект. Для теста на выход — светодиод. Включаю: горит на полную, кручу резистор — реакции нет. Шустро проверяю все соединения, питание, схему, прошивку — эффект остается. После трехкратного повторения тех же действий возникло недоумение. Беру другую тиньку, прошиваю, включаю — болт. Похоже проблема не в чипе. Некоторое время созерцаю код сгенерированный CodeVision — придраться не к чему. Открываю datasheet, вникаю. Изучил ADC, проверил — всё по канонам. Перешёл к ШИМ.
Краткое описание устройства аппаратного ШИМ на Attiny13 для начинающих:
ШИМ сделан на базе таймера. Т.е. у таймера есть несколько режимов работы, два из них относятся к ШИМу (FastPWM и Phase Correct PWM). Таймер настраивается с помощью двух регистров: TCCR0A,TCCR0B. В них задается режим, частота (делитель), какие каналы используются (есть два — 0A и 0B), режим работы выхода(прямой, инвертированный). Значение ШИМа задаются в регистрах OCR0A и OCR0B — соответственно для каждого канала. Есть ещё у ШИМа такая настройка — чем определяется максимальное значение таймера(TOP), при достижении которого он сбрасывается и бежит с начала — это может быть либо 0xFF, либо значение в регистре OCR0A. У меня был установлен второй режим и значение ШИМа я задавал в регистре же OCR0A.
Немало времени ушло у меня пока я нашёл свою ошибку и ещё больше пока догнал её смысл. Хотя сейчас всё кажется очевидным. Для тех кто, как и я, в танке — TOP должен быть 0xFF. Надо заметить, что настройка режимов через регистры не радует интуитивно понятным интерфейсом. Так вышеозначенный режим определяется битами WGM02:0, два из которых находятся в регистре TCCR0A(00,01), а третий(02) в TCCR0B. Правда мастер CodeVision при начальной настройке здесь наше всё, но когда нужно что-то подправить уже в процессе вот тут-то и приходится поднапрячься.
Короче, следующие грабли. Яркость регулируется, но вот беда: когда довожу ручку до минимума всё равно подсвечивает. Т.е. на АЦП у нас 0, а на выходе не 0. Обидно, понимаешь. Причина такого поведения в том, что в тот момент, когда таймер сбрасывается в 0, на выходе чип выставляет 1, и хотя значение ШИМа у нас задано 0, и уже в следующем такте он это видит и обнуляет выход, но вот этого несчастного скачка достаточно что бы светодиодик светил. Дискомфорт — ты ждешь на выходе чистый 0, а тут тебе гребеночка такая. Вообще говоря проблема известная. Решение приходит в голову практически сразу: когда меняем значение ШИМа, добавляем проверочку на 0 — при оном отключаем ШИМ совсем. Воникает вопрос: как отключать? Можно останавливать таймер. Не лучший вариант: а вдруг на этот таймер что-нибудь ещё посажено? Второй ШИМ, например, или прерывания, или отсчет времени до взрыва? Можно отключать выход таймера — это уже получше, и просто и понятно, получается примерно так:
if(OCR0A==0)TCCR0A&=0x3F;
else TCCR0A=0x83;

Как вариант можно менять режима работы самого пина выход/вход.
P.S.
Из комментариев к статье были получены ещё такие решения:
1. Если не принципиально получать 100% заполнения ШИМ, то можно использовать инверсный режим работы выхода;
2. При работе ШИМ в режиме Phase Correct PWM проблема отсутствует.

2-x фазный ШИМ (PWM) генератор на STM32F030F4

Для питания ряда устройств (например электродвигателей переменного тока) иногда необходимо наличие сдвинутых по фазе питающих напряжений. Для питания 2-х фазных индукционных двигателей необходимо наличие двух фаз синусоидального напряжения с частотой 400 Герц и сдвинутых по фазе на 90 градусов. Один из примеров таких двигателей являются двигатели серии ДИД. Они интересны тем, что их частота вращения может составлять от 16000 до 18000 об/мин. Для питания таких двигателей и было сделано данное устройство, которое представляет собой задающий генератор 2-х фазного 400 Гц напряжений сдвинутых по фазе на 90 градусов относительно друг друга.
В качестве микроконтроллера использован STM32F030F4. Его выбор обусловлен его «минимализмом» — наименьший из корпусов в серии STM32F0 и естественно с минимальной стоимостью. Схема подключения изображена ниже. Микроконтроллер работает на частоте 48 МГц. В качестве задающего генератора использован TIM3, так как в данном контроллере только этот таймер можно конфигурировать так, чтобы использовать выходы трех каналов. Третий канал можно в случае необходимости использовать для генерации 3-фазного напряжения. Таймер работает в режиме генерации ШИМ (PWM). Для получения синусоидального напряжения 400 Гц в канале используется высокочастотное изменение коэффициента ШИМ с частотой 40 кГц, на которую настроен системный таймер SysTick. Синусоида формируется с помощью таблицы значений синуса с шагом 360/100 градусов. Очень полезный калькулятор для такого рода таблиц можно найти на сайте. При желании с помощью АЦП можно управлять амплитудой, фазой, частотой генерации. Но в данной реализации это не сделано.



Ниже показаны выходные осциллограммы генератора. Синяя и фиолетовая синусоиды — сдвинуты на 90 градусов, желтая — выход таймера для синей синусоиды, зеленый — тестовый сигнал генерируемый при начале формирования синусоиды




Читать дальше

Сверлильный аппарат с регулятором мощности для ПП из подручных средств.

Добрый вечер всем. Это моя первая публикация, так что прошу не судить строго. Была у меня проблемка со сверлением отверстий в ПП, то делал это при помощи электродрели, то шуруповерта или электромотора с цанговым зажимом. Понятное дело, неудобно, громоздко. В общем решил что-то с этим делать. Выбор сразу пал на регулировку оборотов при помощи ШИМ. Первое, что сразу же пришло в голову — классика NE555, как раз валялись в закромах пару мелкосхем в DIPе. Порыскав интернете, нашел множество схем. В общем из кучи собрал что-то похожее на рабочее.



Читать дальше
  • +3
  • 18 ноября 2014, 19:20
  • Jman
  • 1

8 канальный ШИМ на attiny13

AVR attiny13 довольно популярный микроконтроллер (далее МК) и довольно дешевый (20 рублей на ebay). Но есть у него небольшой недостаток: 6 пинов I/O. А на деле вообще 5 (если не шаманить с reset). Если надо большое кол-во пинов на вывод чем может позволить микроконтроллер, то с легкостью используется микросхема регистра сдвига 74HC595, которая потребует 3-х пинов. Потратив 3 пина, можно получить 8*N пинов для вывода(где N — кол-во микросхем 74HC595).

Если со статическим выводом всё ясно, то что делать с ШИМ (PWM)?


Читать дальше

Генератор ШИМ/импульсов на STM32F050

Иногда полезная приблуда — управляемый по RS232 генератор на 6 каналов ШИМа + 1 импульсный.


Читать дальше

Лабораторный инвертор для индукционной плавки металлов топик-ссылка

Наткнулся на интересную статейку с описанием лабораторного инвертора для индукционной плавки металлов.

Макетная плата контроллера электродвигателя. Часть 3. Макетирование.

Внезапно (с) кончился тонер в принтере, фоторезист я еще не осваивал, но желание собрать схему перебороло и я решил по-быстрому спаять все на макетке.
По совету участников обсуждения я таки уменьшил номиналы резисторов в драйверах полевиков и решил отказаться от отдельного блока питания верхнего плеча в пользу бутстрепной схемы и ограничения заполнения ШИМ 96%. Думаю, что эти 4% особого вклада в мощность не внесут, зато избавляют от множества деталей и сильно упрощают схему.
(Здесь будет фоток побольше, чем обычно)


Читать дальше

Макетная плата контроллера электродвигателя. Часть 2. Драйверы MOSFET.

После негативного опыта с вроде бы предсказуемыми микросхемами драйверов у меня было много времени на размышление, обдумывание и моделирование, в процессе которого (а еще и в процессе ремонта инвертора одного жк-монитора) созрела мысль сделать драйверы на рассыпухе. Самое большое преимущество такого решения — можно получить ровно те параметры, которые нужно. Недостаток — деталей на 4-5 штук больше, и нужно выполнить весьма противоречивые требования по разводке платы, причем чем больше частота и токи, тем противоречивей требования.
Ну да мы трудностей не боимся, а нестандартные решения вообще — хобби.


Читать дальше

Макетная плата контроллера электродвигателя. Часть 1. Формирователь dead-time и защита от сквозных токов.

Сегодня хочу показать уважаемому сообществу мою версию логического блока защиты и формирователя мертвого времени для контроллера электродвигателя.
На самом деле в начале моей работы в этом направлении я сделал силовой модуль для управления коллекторным электродвигателем на мощных полевых транзисторах с применением микросхем драйверов IR2110.
Поскольку я хотел иметь возможность ширины импульса ШИМ до 100%, то решил использовать отдельный повышающий преобразователь для питания драйвера верхнего плеча. Результатом (если это можно так назвать) стало четыре микросхемы с выгоревшими верхними драйверами и еще пара полевиков.
Это сильно меня огорчило, и я надолго отложил этот проект. Однако сейчас, набравшись немного опыта, решил вновь к нему вернуться, при этом идя по пути максимального упрощения.

Читать дальше

Простой формирователь ШИМ-сигнала с ручной регулировкой

В ходе размышлений над контроллером электродвигателя придумался мне простой формирователь ШИМ-сигнала на инверторе с триггером шмитта.


Читать дальше