Шим на avr регулятор напряжения. Разработка проекта ШИМ-регулятора на микроконтроллерах серии AVR для управления нагрузкой электрических устройств. Логическая схема устройства


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

Особенности:

  • 2 независимых канала ШИМ (с разнесением фаз на 180°);
  • Напряжение питания: 8 - 20 V;
  • Рабочий ток нагрузки: 3.4 A/канал (при питании 12 V эквивалентно 40 W);
  • Низкие потери в силовом ключе (сопротивление открытого канала 45 mΩ);
  • Опциональная Гамма-коррекция позволяет равномерно регулировать яркость;
  • Защита от всплесков на входе (аналоговая и программная фильтрация);
  • Собственное энергопотребление менее 10 mA (0.12 W @ 12 V);
  • Высокая частота ШИМ (~18.75 kHz) не вызывает стробоскопического эффекта и усталости глаз при управлении светодиодной лентой.

Устройство основано на микроконтроллере ATtiny13A, который анализирует входные напряжения на выводах PB3 и PB4, пересчитывает их и выводит ШИМ-сигналы с соответствующим заполнением на выводы PB0 и PB1. Эти сигналы поступают на полевые транзисторы T1 и T2, которые в свою очередь коммутируют мощные нагрузки (в данном примере - светодиодную ленту).

Перемычка J1 задаёт режим работы устройства: когда она установлена в нижнее (по схеме) положение, заполнение ШИМа линейно зависит от напряжения на соответствующем входе. Когда перемычка установлена в верхнее положение микроконтроллер пересчитывает значение требуемого заполнения ШИМ при помощи таблицы значений. В результате получается гамма-кривая, т. е. уровень яркости подстроен под чувствительность человеческого глаза. График зависимости выходного заполнения от входного напряжения приведён ниже:

Зелёный график - перемычка J1 в нижнем положении, синий - в верхнем

Особенности ШИМ-генератора

В отличие от "классического" Fast PWM в данной схеме используется Phase-correct PWM со сдвигом каналов на 180 градусов друг относительно друга. Ниже показано, как работают оба алгоритма.

Компоненты

Схема не требовательна к точному подбору компонентов, большинство деталей можно заменять на аналогичные похожего номинала. Например если у Вас нет переменных резисторов на 100 кОм, то можно поставить 50 кОм или 500 кОм, при этом схема будет продолжать исправно работать. В качестве T1 и T2 можно установить почти любой транзистор серии IRLML (учитывая коммутируемый ток)
Если Вам не нужен второй канал, то можно убрать R2, R4, C2 и T2, а вывод PB4 микроконтроллера заземлить (PB1 при этом оставить неподключенным)

Для индикации использованы 3 светодиода (3мм зелёного свечения) с резисторами 1 кОм, подключенные анодами ко входу питания 12V, а катодами к стокам транзисторов и к минусу питания. Дополнительно, параллельно керамическому конденсатору С3 подключен электролитический конденсатор 100µF, помогающий сгладить пульсации сети. Его установка не обязательна, но желательна.

Конфигурация фьюзов показана ниже:

На скриншоте галочка означает 0 - запрограммированный фьюз. Для Вашего удобства фьюзы описаны в комментариях в файле main.asm.

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

В заключение пара фото (ручки на переменных резисторах ещё не одеты):

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
U1 МК AVR 8-бит

ATtiny13A

1 SOIC-8 В блокнот
VR1 Линейный регулятор

LM78L05

1 TO-92 В блокнот
T1, T2 MOSFET-транзистор

IRLML2502

2 SOT-23 В блокнот
С1-С4 Конденсатор 100 нФ (0.1 мкФ) 4 Керамический 0402 В блокнот
R1, R2 Резистор переменный

100 кОм

2 Линейный В блокнот
R3, R4 Резистор

1 кОм

2 0603 В блокнот
R5 Резистор

10 кОм

1 0603 В блокнот
R6, R7 Резистор

Здоровья всем читателям Муськи!
Благодаря этому замечательному сайту обзавелся множеством полезных вещей и знаний и в ответ решил написать первый отчет о недавно разработанном устройстве. В процессе разработки устройства столкнулся с рядом проблем и успешно их разрешил. Возможно, кому-то из коллег-новичков описание некоторых решений поможет в творчестве.
Для изготовления печатных плат обзавелся микродрелью и стойкой для нее, превращающей дрельку в сверлильный микростанок. Необходимость этого возникла после кучки переломанных сверл 0.5-1мм при использовании в шуруповерте и китайском дремеле. Но, как оказалось, пользоваться таким инструментом без регулятора оборотов невозможно. Регулятор решил сделать самостоятельно, попутно получив новые знания.

Радиолюбительский опыт у меня небольшой. В детстве по книге Борисова собрал несколько приемников, да моргалок на мультивибраторах. Потом пошли другие увлечения и дела.
А тут по случаю заметил Arduino, лихо наваял макетов метеостанций, роботов, и захотелось автоматизировать при помощи микроконтроллеров все, до чего дотянусь. Размеры контроллеров шли по убыванию размеров и облегчению встраивания – Arduino UNO, Arduino Pro Mini, потом кучка ATMega328P, и для самых мелких и простых устройств приобрел ATtiny85.
Тиньки покупал более года назад и они лежали и ждали свой очереди.

Скриншот заказа


(там еще термоусадка в заказе была, потому общая цена выше)


МК приехали как обычно в пакете с пупыркой, сами кучкой в отдельном полиэтиленовом пакетике. Лучше бы конечно в жестком коробке или в пенке, но и так ничего не погнулось и все рабочие.

Поначалу паял схемки на макетных платах, но почитав про ЛУТ, понял, что вполне реально и гораздо удобнее все собирать на нормальных печатных платах.
Также понемногу начал собирать полезный инструмент, среди которого оказалась микродрелька МД-3 с цанговым патроном и станочком для сверления мелких отверстий. Можно было бы конечно купить только цангу, а двигатель откуда-нибудь выковырять, но решил приобрести готовое в местном магазине.

Печатаем на лазернике рисунок на глянцевой фотобумаге Lomond для струйной печати. Но совать в новенький принтер совсем не предназначенную для него бумагу было стремно. Нашел в сети предупреждения, что глянцевое покрытие струйной бумаги может расплавиться, прилипнуть к печке и угробить принтер. Для уверенности провел эксперимент - покатал по поверхности этой бумаги нагретый до 200С паяльник (точную температуру печки так и не нашел, но около того), бумага чуть покоробилась, но ничего не плавилось и не прилипало - значит можно и в принтер.

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

Травить медь решил раствором перекиси водорода и лимонной кислоты как наиболее доступным составом. Возможные варианты химии для травления с расчетами можно посмотреть вот здесь

Перекись взял из аптечки, куплена была года 3 назад, срок годности вышел года 2 как, думал уже выдохлась и работать вообще не будет. Однако ошибся, плату протравило весьма бодро - минуты за три. Вот результат:

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

Плату залудил паяльником с применением оплетки. Напаял детали.




Высокие латунные стойки вкрученные в друг друга с обоих сторон платы через крепежные отверстия – удобная штука, можно плату без корпуса во время монтажа и отладки ставить на стол любой стороной не опасаясь чего либо помять или замкнуть.

Из наиболее трудоемкого было подлезть и припаять выводные светодиоды со стороны проводников. В качестве лицевой стороны решил использовать сторону пайки, т.к. на ней высота деталей гораздо меньше, а пропуск сквозь плату вала переменного резистора уменьшает его длину до нужной.

Конденсатор C2 на схеме подключенный к Reset запаивать не стал, т.к. он хоть и повышает надежность запуска устройства, но при перепрошивке МК может помешаться.

Микроконтроллер запаивал в последнюю очередь, перед этим подключив плату к БП и убедившись, что ничего сразу не выгорит и стабилизатор выдаст штатные 5В. Ничего не задымилось и потому подключаем на штырьки ICSP программатор и заливаем тестовую прошивку.

Прошивку для устройства будем писать в знакомой многим среде программирования Arduino, предварительно добавив в нее поддержку микроконтроллеров ATtiny, скачав и распаковав их в папку Arduino/hardware.

Тестовый скетч (приводить смысла не вижу) просто считывал состояния входных сигналов и отображал их на имеющихся выходных с подключенными светодиодами. Т.к. входных у нас 4 канала, а выходных только 2, пришлось провести проверку в несколько этапов.

Все заработало как и ожидалось, за исключением одного - не читалась кнопка, подключенная к одному каналу с зеленым светодиодом, а светодиод горел заметно ярче красного. Замеры тестером показали, что в состонии PB0 в качестве выхода через светодиод течет более 20мА и на нем падает всего 2.1В. А в состоянии входа с внутренней подтяжкой на ноге всего 1.74В при отпущеной кнопке и 0.6В при нажатой. Неудивительно, что постоянно читается 0. Низковольтный зеленый светодиод даже не светясь при протекании микроамперного тока просаживал напряжение на ноге. Теперь понятно для чего в исходной статье последовательно подключали 2 светодиода.

Но ставить второй светодиод светить внутрь коробки тупо в качестве балласта (и на лицевой панели 2 одинаковых тоже не нужны) показалось несколько кривым решением. Задумался как еще можно приподнять напряжение в цепи светодиода и вспомнил про ВАХ стабилитрона. Если подключить последовательно со светодиодом встречно ему стабилитрон на 2В (чтобы работал штатно, на обратной ветви ВАХ), то получится как раз то, что нам надо. Когда горит светодиод на токе 10мА - стабилитрон пробивается и не мешает протеканию тока, а лишь стабилизирует падающее на нем напряжение на заданном уровне. Нужно лишь заменить токоограничивающий резистор, из расчета, что нужно уже подавить напряжение Uрез=5В-2.1В-2.0В=0.9В на 10мА, т.е. R=90 Ом. А когда нога переключена на вход с подтяжкой - благодаря крутизне ветви ВАХ до момента пробоя перехода, стабилитрон эквивалентен высокоомному резистору и на нем упадет опять же около 2В, подняв напряжение на ноге МК при отпущеной кнопке до 4В, что уже прочитается как TRUE. При нажатии кнопки нога окажется подтянутой к 5В внутренним резистором сопротивленим около 40КОм (по моим расчетам), а к земле - резистором 5КОм (который зашунтирует цепь светодиода), т.е. на ней будет те же 0.6В и считается FALSE.
Подпаял стабилитрон навесом последовательно с резистором и кнопка заработала как надо.

Теперь настала очередь проверки работы ШИМ и тут тоже возникли проблемы. Стандартная ардуинская команда AnalogWrite(нога, заполнение) работать не желала. Значит что-то не так с библиотекой для тиньки. Полез шерстить даташит на МК и просторы интернета.

Выяснилось интересное:
- на выводы 5, 6 (PB0, PB1) могут быть выведены 2 канала ШИМ (OC0A, OC0B) работающие каждый со своей уставкой заполнения (но одинаковой частотой) от Таймера 0;
- на выводы 2, 3 (PB3, PB4) может быть выведен третий канал ШИМ работающий от Таймера 1, причем на ногу 3 может быть выведен прямой сигнал ШИМ (OC1B), а на ногу 2 - его же инверсная версия (/OC1B). Но вывод идет либо только на 3 ногу, либо на обе сразу. А нам надо ШИМ на 2 ноге, хотя бы инверсный (программно его инвертируем обратно), так что придется конфигурировать вывод на 2 и 3 ноги, и на 3 сигнал не пройдет только потому, что она объявлена входом.

Так вот, насколько я понял, в пакете поддержки ATtiny для Ардуино канал ШИМ от Таймера 1 может выводиться только на ногу 3. Видимо вывод его же инверсной версии посчитали излишеством. Придется сконфигурировать таймер и ШИМ самостоятельно (см. код, функция PWM3_init), вместо использования AnalogWrite.

Еще заметил, что при перенастройке Таймера 1 сбивается работа функции millis() – оказывается, по умолчанию для внутренних часов используется Таймер 1. Но можно перенастроить время на Таймер 0 при помощи макроопределения в файле Arduino\hardware\tiny\cores\tiny\core_build_options.h
/* For various reasons, Timer 1 is a better choice for the millis timer on the "85 processor. */ #define TIMER_TO_USE_FOR_MILLIS 0
Чем мы и воспользуемся, поскольку Таймер 0 в этом проекте как раз полностью свободен.

Также возник вопрос по диапазону уставки оборотов, читаемой с переменного резистора. Автор исходной схемы добавил последовательно с переменником 10K постоянный резистор 36K, видимо из расчета чтобы код АЦП вписался в диапазон 0-255. Реально получилось 0-230, причем максимум плавал. А хотелось бы именно 0-255 для соответствия полной шкалы уставки с 8-битным ШИМом. Для этого я выпаял постоянник и заменил перемычкой на +5В, АЦП стал читать весь диапазон, а 4 младших бита отбрасываем программно. И зачем нужна была лишняя деталь?

После тестовых испытания каналов ввода вывода загружаем в микроконтроллер боевую прошивку, написанную на С в среде Arduino по мотивам исходников на Бейсике автора исходной схемы.

Текст программы

// Attiny85 at 1MHz // Не забыть задать таймер 0 для millis и др! // Arduino\hardware\tiny\cores\tiny\core_build_options.h -> TIMER_TO_USE_FOR_MILLIS 0 #include // Подключения #define MODE_LED_PIN PIN_B0 #define MODE_BUT_PIN MODE_LED_PIN #define PWM_LED_PIN PIN_B3 #define AM_PIN PIN_B1 #define SP_PIN A1 #define CUR_PIN A2 // Состояния #define MODE_MANUAL 0 #define MODE_WAITING 1 #define MODE_SETUP_XX 2 #define MODE_SETUP_MAX 3 #define MODE_START 4 #define MODE_DRILLING 5 #define MODE_STOP 6 // Переменные byte Mode = MODE_MANUAL; byte ModeLedVal = LOW; byte SetPoint = 0; int CurrentFiltered = 0; byte CurrentU8 = 0; byte AMButton; byte AMButtonFlt = LOW; static byte ModeButton; static byte ModeButtonFlt = HIGH; // начальные значение для static byte ModeButtonOld = LOW; // исключения срабатывания при старте static byte SetupStep = false; unsigned long BlinkFromMs; unsigned long StartFromMs; unsigned long ModeFromMs; byte W, W0, W1, W2, Wxx, Wmax, Uxx, Uon, Uoff; void PWM3_init() { // Настройка ШИМ на PB3 (pin 2) используя Таймер 1 TCCR1 = _BV (CS11) | _BV (CS10); // prescaler /4 GTCCR = _BV (COM1B0) | _BV (PWM1B); // clear OC1B on compare OCR1B = 255; // начальное заполнение 0% (используем инверсный выход!) OCR1C = 255; // частота ШИМ = 1КГц (1 000 000 /4 /256) } void analogWrite_PB3(uint8_t duty_value) { // analogWrite на PIN_B3 OCR1B = 255-duty_value; // заполнение 0-255 (0-100%) (используем инверсный выход!) } byte ScanButton(void) { // Чтение кнопки подключенной к одному выходу со светодиодом // Ускоренная версия с восстановлением выхода и без отключений ШИМ byte value,port_bak; port_bak = PORTB; // сохранить выход DDRB &= ~(1<interval)){ \ outvar = varname;\ }\ }\ else {\ __lastChange_##varname=millis();\ } // Инициализация void setup() { pinMode(MODE_LED_PIN, OUTPUT); // основное состоние - индикация pinMode(PWM_LED_PIN, OUTPUT); PWM3_init(); // восстанавливанием настройки из EEPROM если они там есть if (EEPROM.read(11)==0xAA) { Wxx = EEPROM.read(0); Wmax = EEPROM.read(1); Uon = EEPROM.read(2); Uoff = EEPROM.read(3); } else { // значения по-умолчанию Wxx = 1; Wmax = 255; Uon = 255; // исключает старт до проведения настройки Uoff = 0; } // Плавный разгон до холостого хода или ручной настройки if (digitalRead(AM_PIN)==HIGH) W0 = Wxx; else { W0 = 255- (analogRead(SP_PIN) >> 2); // 0-255, переменный резистор у нас инверсным получился } W1 = 0; for(W=0 ; W<=W0; W++) { analogWrite_PB3(W); W1 = W1 + 4; delay(W1); } delay(800); Mode = MODE_WAITING; } // Рабочий цикл void loop() { // Индикация текущего режима морганием switch (Mode) { case MODE_MANUAL: ModeLedVal = LOW; // выключено break; case MODE_WAITING: (ModeLedVal==HIGH) ? ModeLedVal=LOW: ModeLedVal=HIGH; // в полнакала break; case MODE_START: case MODE_DRILLING: case MODE_STOP: ModeLedVal = HIGH; // на полную break; case MODE_SETUP_XX: if ((millis()-BlinkFromMs > 400)) { // редко (ModeLedVal==HIGH) ? ModeLedVal=LOW: ModeLedVal=HIGH; BlinkFromMs = millis(); } break; case MODE_SETUP_MAX: if ((millis()-BlinkFromMs > 100)) { // часто (ModeLedVal==HIGH) ? ModeLedVal=LOW: ModeLedVal=HIGH; BlinkFromMs = millis(); } break; } digitalWrite (MODE_LED_PIN, ModeLedVal); // Тумблер Auto/Manual, в Auto размыкается и читается HIGH AMButton = digitalRead(AM_PIN); Debounce(AMButton, AMButtonFlt, 200); // Кнопка настройки, читается спецпроцедурой т.к. совмещена со светодиодом, при нажатии читается LOW ModeButton = ScanButton(); Debounce(ModeButton, ModeButtonFlt, 200); SetupStep = (ModeButtonFlt==LOW) && (ModeButtonOld==HIGH); ModeButtonOld = ModeButtonFlt; // Крутилка SetPoint = 255- (analogRead(SP_PIN) >> 2); // 0-255, переменный резистор у нас инверсным получился // Ток мотора // Основной фильтр RC-цепочка 36K+68nF (постоянная времени 2.5мс, частота среза 65Гц) // но на всякий дополним программным // БИХ-фильтр НЧ первого порядка y(i) = y(i-1) + alpha*(x(i)-y(i-1)) // (он же Экспоненциальное скользящее среднее, EMA) // в фильтре вместо float используем повышенную точность int, для чего сдвигаем влево на свободные 5 бит (знак еще пригодится) // умножение на дробный коэффициент alpha заменяем сдвигом вправо // (6 = /64 = *0.016) 100 циклов - 80% значения, 200 циклов - 96% значения, 369 циклов - 99.6% значения // (5 = /32 = *0.031) 50 циклов - 80% значения, 100 циклов - 96% значения, 179 циклов - 99.6% значения // (4 = /16 = *0.063) 25 циклов - 80% значения, 50 циклов - 96% значения, 90 циклов - 99.6% значения // (3 = /8 = *0.125) 12 циклов - 80% значения, 25 циклов - 96% значения, 45 циклов - 99.6% значения // период работы = АЦП 110мкс + программа = 0,2мс // постоянная времени = 8*0,2мс = 1,6мс, частота среза 625Гц CurrentFiltered = CurrentFiltered + (((analogRead(CUR_PIN) << 5) - CurrentFiltered) >> 3); // для простоты использования приводим к 0-255 // (сдвиг обратно на 5 бит и 2 старших отбрасываем т.к. все интересное (холостой ход) <1В) CurrentU8 = byte (CurrentFiltered >> 5); // если >1В чтобы не перепутать с малыми if ((CurrentFiltered >> 5) & 0x7F00) CurrentU8=255; // Автомат состояний switch (Mode) { case MODE_MANUAL: // Ручное регулирование крутилкой analogWrite_PB3(SetPoint); if (SetupStep) Mode = MODE_SETUP_XX; if (AMButtonFlt==HIGH) { // При переходе в автомат притормозим analogWrite_PB3(Wxx); StartFromMs = millis(); Mode = MODE_STOP; } break; case MODE_WAITING: // Ждем роста тока if (CurrentU8 > Uon) { // Запуск StartFromMs = millis(); analogWrite_PB3(Wmax); Mode = MODE_START; } if (SetupStep) Mode = MODE_SETUP_XX; if (AMButtonFlt==LOW) Mode = MODE_MANUAL; break; case MODE_START: // Раскрутка if (millis()-StartFromMs > 300) Mode = MODE_DRILLING; if (AMButtonFlt==LOW) Mode = MODE_MANUAL; break; case MODE_DRILLING: // Сверлим, ждем падения тока if (CurrentU8 < Uoff) { // Тормозим analogWrite_PB3(Wxx); Mode = MODE_STOP; } if (AMButtonFlt==LOW) Mode = MODE_MANUAL; break; case MODE_STOP: // Тормозим и ждем пока выйдем на ток ХХ if (CurrentU8 < Uon) { // Замедлились if (millis()-StartFromMs > 300) // надежно Mode = MODE_WAITING; } else { StartFromMs = millis(); } if (AMButtonFlt==LOW) Mode = MODE_MANUAL; break; case MODE_SETUP_XX: // Настройка холостого хода Wxx = SetPoint; analogWrite_PB3(Wxx); if (SetupStep) { Uon = byte(1.1 * CurrentU8); EEPROM.write(0,Wxx); EEPROM.write(2,Uon); Mode = MODE_SETUP_MAX; } break; case MODE_SETUP_MAX: // Настройка макс.оборотов Wmax = SetPoint; analogWrite_PB3(Wmax); if (SetupStep) { Uoff = byte(1.1 * CurrentU8); EEPROM.write(1,Wmax); EEPROM.write(3,Uoff); EEPROM.write(11,0xAA); // Тормозим analogWrite_PB3(Wxx); StartFromMs = millis(); Mode = MODE_STOP; } break; default: Mode = MODE_WAITING; return; } }


Подключаем в качестве шунта 5 ваттный резистор 2.2 Ом. Для защиты схемы от индуктивных выбросов напряжения на заднем фронте ШИМ подключаем параллельно мотору диод Шоттки SS34, а для подавления помех от коммутации обмоток – конденсатор 100нФ. И начинаем испытания по управлению мотором дрели.

Сразу достает зубодробильный вой ШИМа на 4КГц (1МГц/256). Добавляем настройку делителя /4 - сразу полегчало, хотя писк никуда не делся, но 1КГц почему-то переносится гораздо легче даже при продолжительной работе.

В ручном режиме обороты мотора нормально регулируются 0-100%, а в автоматическом АЦП цепи обратной связи все время читает MAX значение и ничего не работает. Попутно замечаю, что плата громко пищит даже при отключенном моторе. WTF?

Берем тестер, откапываем осциллограф и начинаем изучать, что же мы выдаем и чего получаем. И роняем челюсть. На шунте вместо пологих волн тока через индуктивность в начале импульсов ШИМ видим иголки в десятки вольт. Значит, через шунт течет импульсный ток в десяток ампер! Причем даже при отключенном двигателе. Не удивительно, что плата зазвенела. Но что же замыкает цепь без двигателя? Крошечный конденсатор 100нФ! Помехи при коммутации обмоток он может и подавит, а пока устраивает кратковременное КЗ на каждом периоде ШИМ! Вывод - помехоподавлящий конденсатор не совместим с ШИМ управлением и контролем с помощью шунта, надо убирать.

И тут до меня доходит, что эти высоковольтные выбросы идут почти прямо на АЦП тиньки (т.к. тут амплитудный детектор, то конденсатор на ноге заряжается до максимального напряжения в иголке и благополучно хранит его, т.к. разряд только через утечку диода). Тинька вроде пока помирать не собирается, но что с ее ногой? Приборы показывают постоянное напряжение на ноге 5.2В, выше напряжения питания, но куда делось остальное? Вспоминаем - для борьбы с перенапряжениями в нем есть специально обученные диоды на «+» и «-« питания, стравливающие излишек в БП. Но встроенные диоды хилые и сильно рассчитывать на них не стоит.

Убираем чертов конденсатор, меряем ногой напряжения - работает! Надежные МК делает Atmel! Видимо спасло, что емкость конденсаторов невысока была, немного заряда прокачивали.

Без конденсатора иголки пропали, плата перестала музицировать, нога вроде реально меряет амплитуду тока ШИМ импульса. Запускаем процедуру настройки и пробуем сверлить. Вроде все как надо - при нагрузке добавляет обороты, при выходе сверла сбрасывает. Но не только - несколько раз в минуту самопроизвольно без нагрузки разгоняется и тормозится. Почему непонятно, приборы ничего не показывают. То ли нога подгорела, то ли емкость проводов генерит незаметные иголки как тот кондер, то ли помехи от того же коллектора лезут.

Тут решил бороться с проблемой кардинально, ибо обратил внимание, что больше ни в одной схеме пиковый детектор не используется. Наоборот, везде контролируется интегральное значение тока, пропущенное через RC-фильтры. И такие измерения как раз нечувствительны к помехам в виде единичных выбросов. Меняем диод на резистор - и амплитудный детектор превращается в ФНЧ.

Изменяемое АЦП напряжение упало сразу на порядок - действующее напряжение гораздо ниже амплитудного в случае сигнала в виде пологих волн с паузами между ними. Ловить пришлось напряжение около 0.2 В. Можно конечно было увеличить сопротивление шунта, но для того ли мы городили ШИМ, чтобы греть атмосферу. А еще при большом заполнении ШИМ и нагрузке на мотор можно получить перенапряжение. Потому придется работать с низким U холостого хода.

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

Финальная схема устройства:


Устройство было смонтировано в корпусе, в роли которого выступила герметичная электромонтажная «Коробка Тусо распаечная пластиковая без сальников 120х80х50 мм, IP55 серая 67052 Рувинил Россия». Хотелось найти более плоскую, но ничего типа 110*60*30 не нашел. Чтобы не разводить гирлянды на столе, скрутил регулятор с БП в единое целое. Кирпич получился знатный, но нам его и не в кармане носить. И хотя после сверления пары десятков отверстий, сколько-нибудь заметного наощупь нагрева ключевого полевика, шунта и стабилизатора заметно не было, насверлил немного вентиляции на дне и задней стенке.







С тех пор станочек с регулятором участвовал в создании еще 2 плат (сколько ему потребовалось сверлить можете глянуть по словам «AVR Fusebit Doctor». Его работой весьма доволен.

Еще хочу отметить, что твердосплавные сверла с Али имеют хвостовик 3.2 мм, а цанги были только 3.0 и 3.5 - в одну сверло не лезет, а в другой не зажимается. Намотал на сверло медной проволоки и кое-как вставил в 3.5 мм, но некрасиво. Если кто встречал цангу на 3.2 диаметром 6 мм (везде разве что дремелевские, со сточенным до 5мм хвостом), подскажите.

При смене сверл процедуру настройки приходится проходить заново – видимо на токе двигателя сказывается разный момент инерции «тощего» обычного сверла и твердосплавного с утолщенным хвостовиком. Но это делается быстро и не напрягает. Желающие могут добавить в прошивку сохранение профилей сверл:)

Неоднократно встречал совет сверлить платы под слоем воды, чтобы не дышать стеклянными опилками. У меня не получилось. Точно спозиционировать сверло, когда оно высоко, мешает преломление в воде, глазомер косячит. А когда сверло входит в воду, начинает идти рябь и вообще ничего не видно. Надо что ли остановленную дрель выставлять, а потом включать? В итоге, миску с водой просто поставил рядом и периодически макаю в нее плату – чтобы смочить и смыть опилки. В этом случае опилки сырые и тоже не летят, собираются конусом над отверстием.

И еще одно лирическое отступление, про мелкий крепеж.

В устройство решил поставить разъем питания типа «DS-225, Гнездо питания на панель». Для его крепления требовались винтики с гайками с резьбой 2.5мм. В кладовке ничего подходящего не нашлось, а тут еще вспомнил, что в другое поделие 2мм винтики требуются. Значит стоит пополнить коллекцию крепежа, чтобы в следующий раз ради гаечки на другой конец области не лететь. В строительных магазинах ничего меньше M3 не попадалось, значит надо искать специализированные.

Первым относительно удобным магазином оказался сетевой
Внутри глаза разбежались от всяких полезностей, но вот незадача – самые малые винтики были только M2.5 одной длины, а вот гаек и шайб к ним нет и не бывает! Впечатлила продажа гаечек поштучно за 2р/шт и ссыпание всего купленного в один мешок-майку (мелких пакетиков для разных размеров не было). Опять же накладно брать про запас разных размеров.

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

Планирую купить +67 Добавить в избранное Обзор понравился +76 +152

Регулятор оборотов микродрели на PIC-контроллере
ПОТАПЧУК,
г.Ровно, Украина. E-mail: [email protected]

В радиолюбительской практике одним из самых важных инструментов является дрель. В качестве миниатюрных электродрелей для сверления плат часто используются двигатели постоянного тока с приделанным микровыключателем на рукоятке. Питание на такую микроэлектродрель подается от внешнего блока питания. В большинстве случаев обороты электромотора не регулируются, а чтобы "сверлилка" лучше работала, на нее подается завышенное напряжение питания. Это приводит к преждевременному выходу со строя электромотора. Еще одним слабым звеном устройства является кнопка включения. Это и не удивительно, если учесть, что пусковой ток электромотора может достигать 3 А и более.

Эти недостатки побудили разработать регулятор оборотов на современном микроконтроллере ф.Microchip PIC16F627/628. Важной особенностью данной модели микроконтроллера является наличие внутреннего двухскоростного RC-генератора. Используя эту особенность, в процессе выполнения программы можно переключать тактовую частоту микроконтроллера с 4 МГц на 32 кГц и наоборот. Данная микросхема содержит также встроенный широтно-импульсный модулятор (ШИМ), что позволяет реализовать весь диапазон регулировки оборотов. Коэффициент заполнения импульсов (величина, обратная скважности) меняется от 0 до 1. Это позволяет построить очень эргономичное устройство практически на одной микросхеме с минимальным количеством внешних компонентов.


Технические характеристики

Напряжение питания, В 8...25
Ток потребления устройством в рабочем режиме
(зависит от мощности электромотора), А 0.5...3
Ток потребления в ждущем режиме работы, мА < 1
Частота работы ШИМ, кГц 15
Коэффициент заполнения ШИМ 0.4...1
Количество ступеней регулировки напряжения на электродвигателе 50
Плавность регулировки скважности ШИМ, ступени/с 2

К выводам 18, 7 и 8 микроконтроллера (рис.1) подключены кнопки управления устройством. Следует отметить, что от электромотора и соединительного шлейфа во время работы идет довольно солидное электромагнитное излучение, которое может привести к самопроизвольному срабатыванию кнопок SB2 и SB3. Для предотвращения этого используются блокировочные конденсаторы С4 и С5, которые шунтируют высокочастотные наводки на выводах кнопок. Цепь R2-VD2 представляет собой простейший параметрический стабилизатор, снижающий уровень напряжения, которое подается с кнопки SB1 на цифровой вход микроконтроллера, до стандартных TTL-уровней сигнала. Резистор R3 формирует на
выводе 18 DD1 уровень логического "О" в то время, когда кнопка SB1 отпущена. Светодиод HL1 отображает режимы работы устройства.
ШИМ-сигнал с выхода микроконтроллера через резистор R4 подается на составной транзистор VT1, VT2. Коллекторы транзисторов подсоединены к одному из полюсов электромотора. Электромотор подключается к устройству при помощи трехпроводного шлейфа. Два провода используются для подачи питания, третий — для приема сигнала от кнопки "Пуск". Напряжение питания на двигателе зависит от коэффициента заполнения ШИМ-сиг-нала. Стабилизатор на микросхеме DA1 обеспечивает питанием микроконтроллер. Конденсаторы С1 и С2 используются для фильтрации высокочастотных помех, поступающих как с блока питания, так и от самого электромотора. Для этих же целей установлен конденсатор СЗ, включенный параллельно полюсам питания электромотора. Диод VD1 гасит токи самоиндукции, которые появляются в цепи питания электромотора при работе.
Подробно разобраться в принципах работы устройства поможет схема алгоритма, представленная на рис.2. В соответствии с ним сразу после старта программы микроконтроллер проходит начальную инициализацию. Во время инициализации настраиваются порты микроконтроллера, таймеры (счетчики), и переключается тактовая частота с 4 МГц на 32 кГц. После этого микроконтроллер входит в программный цикл ожидания нажатия кнопки "Пуск" (SB1). В этом цикле также происходит обработка прерывания по переполнению таймера-счетчика 2, которое используется для задания периодов работы светодиодаНL1.
После нажатия кнопки SB1 программа микроконтроллера сразу же переключает частоту тактирования с 32 кГц на 4 МГц и проводит инициализацию внутреннего ШИМ-контрол-лера. Далее процессор читает сохраненное ранее в энергонезависимой памяти (EEPROM) значение длительности импульса ШИМ и записывает его в соответствующий служебный регистр. Проделав все эти операции, микроконтроллер запускает ШИМ и снова оказывается в программном цикле ожидания нажатия кнопок SB2, SB3, либо отпускания кнопки SB1.
При нажатии кнопки SB2 (SB3) микроконтроллер увеличивает (уменьшает) длительность импульса ШИМ, и тем самым изменяет напряжение, прикладываемое к электромотору. После каждого изменения длительности импульса ШИМ текущее значение сохраняется в виде константы в энергонезависимой памяти микроконтроллера (EEPROM). Это позволяет не проводить начальную настройку скорости вращения "сверлилки" каждый раз при начале работы. Если же программа обнаруживает, что кнопка SB1 отпущена, микроконтроллер сразу же переходит на программную ветвь завершения работы ШИМ-регулятора. В этой ветви производится выключение ШИМ (на выводе 9 DD1 устанавливается низкий уровень), и микроконтроллер снова переходит в цикл ожидания нажатия кнопки "Пуск". Дальше алгоритм работы устройства повторяется.
Управляющая программа микроконтроллера приведена в табл.1, а карта прошивки — в табл.2. Основные ее задачи — сканирование кнопок и управление ШИМ-сигналом.
Благодаря наличию в данном микроконтроллере регистра периода ШИМ, можно задать практически любую его частоту. В данном устройстве из практических соображений частота ШИМ выбрана около 15 кГц (точное значение зависит от частоты внутреннего RC-генератора). Коэффициент заполнения (К3), как уже упоминалось выше, можно задать от 0 до 1. Но практика показала, что большинство электромоторов при К3 меньше 0,4 не вращаются. По этой причине диапазон возможных К3 в данной программе составляет 0,4.. 1. Программа обеспечивает дискретное изменение К3 (50 ступеней) при нажатии соответствующих кнопок управления.
Устройство управляется с помощью трех кнопок SB1.. SB3. При помощи кнопки SB1 осуществляется включение и выключение электромотора (пока эта кнопка нажата, мотор вращается). Кнопка SB2 увеличивает обороты, a SB3 — уменьшает. Каждое изменение оборотов запоминается в энергонезависимой памяти микроконтроллера. Поэтому при следующем включении питания электродвигатель вращается со скоростью, заданной раньше.
Когда электродрель выключена, микроконтроллер находится в режиме энергосбережения (частота RC-генератора — 37 кГц), и ток потребления составляет менее 1 мА. О данном режиме сигнализирует светоди-Од HL1, который неравномерно мигает (с интервалом в 3 с). После пуска электромотора кнопкой SB1 светоди-од гаснет Изменение К3 можно производить только при включенном электромоторе. Все нажатия кнопок SB2 и SB3 подтверждаются миганием светодиода HL1. Если во время регулировки оборотов достигнут верхний либо нижний предел, светодиод HL1 перестает мигать, сигнализируя о том, что регулятором достигнут предел регулировок.
Устройство собрано на плате размерами 55x38 мм (рис.3). На одном ее конце сверлят три отверстия, в которые впаивают выводы шлейфа питания электромотора, длина которого может быть 0,5... 1 м. На корпусе электромотора в удобном месте монтируют кнопку SB1, а также блокировочный конденсатор СЗ и импульсный диод VD1. В описываемом устройстве используется микроконтроллер PIC16F627 или PIC16F628. Без какой-либо коррекции программы возможно замена на PIC16F627A, PIC16F628A или PIC16F648A, которые в большинстве случаев стоят дешевле. Основное различие между этими тремя микроконтроллерами заключается в разном объеме памяти программ. Так, у PIC16F627/627A объем памяти программ составляет 1024 слова, у PIC16F628/628A — 2048 слова, а у PIC16F648A — 4096 слов. Кроме того, PIC16F648A имеет больший объем ОЗУ и EEPROM (по 256 байт). Саму микросхему микроконтроллера выгодно установить в плату на "панельке". Это позволяет модернизировать устройство, не прибегая к паяльнику, т.к. в любое время можно вынуть микроконтроллер и запрограммировать его обновленным программным обеспечением.
Поскольку ток потребления электромотора может быть довольно большим, транзистор VT2 желательно установить на теплоотвод размерами не менее 40x40 мм (я использовал теплоотвод от блока разверток старого телевизора). Транзистор VT2 подбирается по мощности используемого мотора, например, КТ817 имеет рассеваемую мощность с теплоот-водом 20 Вт, а КТ819 — 60 Вт . В моем устройстве работает электромотор типа ДПМ-25-03.
В некоторых случаях необходимо, чтобы электродрель плавно набирала обороты при пуске (например, при сверлении отверстий в платах без кернения). Для таких случаев разработан второй вариант программы (карта прошивки — в табл.3).

В электронном виде таблицы можно найти по адресу http //radio-mir.com

1. Полупроводниковые приемно-усилительные устройства (Р.М.Терещук и др.). — К., 1987.
2. http://www.microcontrollers.narod.ru

Имеется большое количество различных схемных решений, однако в нашем случае мы разберем несколько вариантов ШИМ регулятор яркости светодиода () на PIC-микроконтроллере.

PIC10F320/322 это безупречный вариант для конструирования различных регуляторов освещения. При этом мы обретаем достаточно конструктивно навороченный прибор с наименьшей стоимостью и незначительными затратами времени на построение. Рассмотрим несколько вариантов диммера.

Первый вариант. Базовый регулятор яркости светодиода в котором изменение яркости свечения светодиодов осуществляется путем вращения ручки переменного , при этом яркость изменяется от 0 до 100%

Яркость свечения светодиодов устанавливается потенциалом сниманием с переменного резистора R1. Это изменяемое напряжение идет на ввод RA0, функционирующий как аналоговый ввод и подсоединенный к входу AN2 АЦП микроконтроллера. Вывод ШИМ RA1 контролирует силовой ключ на транзисторе V1.

Силовой транзистор возможно выбрать произвольный с логическим уровнем управления, то есть это те транзисторы, которые при получении 1…2 вольта на затвор целиком открывают свой канал.

К примеру транзистором IRF7805 возможно управлять током до 13 ампер соблюдая необходимые требования, а при любых других условиях до 5 ампер гарантировано. Разъем CON1 необходим, лишь для внутрисхемного программирования микроконтроллера, для этой же цели необходимы и сопротивления R2 и R5, то есть если микроконтроллер запрограммирован, то все эти радиоэлементы возможно не ставить.

Сопротивление R4 и BAV70 служат для защиты от перенапряжения и неправильного включения источника питания. Емкости C1 и C2 керамические и служат для снижения импульсных помех, и для надежности функционирования стабилизатора LM75L05.

Второй вариант. Здесь управление яркостью светодиодов так же осуществляется переменным резистором, а включение и выключение выполняется кнопками.

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

Четвертый вариант. По сути такой же, как и третий вариант, но при удержании нажатой кнопки происходит плавное изменение свечения светодиодов.

Потребовалось мне сделать регулятор скорости для пропеллера. Чтобы дым от паяльника сдувать, да морду лица вентилировать. Ну и, для прикола, уложить все в минимальную стоимость. Проще всего маломощный двигатель постоянного тока, конечно, регулировать переменным резистором, но найти резюк на такой малый номинал, да еще нужной мощности это надо сильно постараться, да и стоить он будет явно не десять рублей. Поэтому наш выбор ШИМ + MOSFET.

Ключ я взял IRF630 . Почему именно этот MOSFET ? Да просто у меня их откуда то завелось штук десять. Вот и применяю, так то можно поставить что либо менее габаритное и маломощное. Т.к. ток тут вряд ли будет больше ампера, а IRF630 способен протащить через себя под 9А. Зато можно будет сделать целый каскад из вентиляторов, подсоединив их к одной крутилке — мощи хватит:)

Теперь пришло время подумать о том, чем мы будем делать ШИМ . Сразу напрашивается мысль — микроконтроллером. Взять какой-нибудь Tiny12 и сделать на нем. Мысль я эту отбросил мгновенно.

  1. Тратить такую ценную и дорогую деталь на какой то вентилятор мне западло. Я для микроконтроллера поинтересней задачу найду
  2. Еще софт под это писать, вдвойне западло.
  3. Напряжение питания там 12 вольт, понижать его для питания МК до 5 вольт это вообще уже лениво
  4. IRF630 не откроется от 5 вольт, поэтому тут пришлось бы еще и транзистор ставить, чтобы он подавал высокий потенциал на затвор полевика. Нафиг нафиг.
Остается аналоговая схема. А что, тоже неплохо. Наладки не требует, мы же не высокоточный девайс делаем. Детали тоже минимальные. Надо только прикинуть на чем делать.

Операционные усилители можно отбросить сразу. Дело в том, что у ОУ общего назначения уже после 8-10кГц, как правило, предельное выходное напряжение начинает резко заваливаться, а нам надо полевик дрыгать. Да еще на сверхзвуковой частоте, чтобы не пищало.


ОУ лишенные такого недостатка стоят столько, что на эти деньги можно с десяток крутейших микроконтроллеров купить. В топку!

Остаются компараторы, они не обладают способностью операционника плавно менять выходное напряжение, могут только сравнивать две напруги и замыкать выходной транзистор по итогам сравнения, но зато делают это быстро и без завала характеристики. Пошарил по сусекам и компараторов не нашел. Засада! Точнее был LM339 , но он был в большом корпусе, а впаивать микросхему больше чем на 8 ног на такую простую задачу мне религия не позволяет. В лабаз тащиться тоже было влом. Что делать?

И тут я вспомнил про такую замечательную вещь как аналоговый таймер — NE555 . Представляет собой своеобразный генератор, где можно комбинацией резисторов и конденсатором задавать частоту, а также длительность импульса и паузы. Сколько на этом таймере разной хрени сделали, за его более чем тридцатилетнюю историю… До сих пор эта микросхема, несмотря на почтенный возраст, штампуется миллионными тиражами и есть практически в каждом лабазе по цене в считанные рубли. У нас, например, он стоит около 5 рублей. Порылся по сусекам и нашел пару штук. О! Щас и замутим.


Как это работает
Если не вникать глубоко в структуру таймера 555, то несложно. Грубо говоря, таймер следит за напряжением на конденсаторе С1, которое снимает с вывода THR (THRESHOLD — порог). Как только оно достигнет максимума (кондер заряжен), так открывается внутренний транзистор. Который замыкает вывод DIS (DISCHARGE — разряд) на землю. При этом на выходе OUT появляется логический ноль. Конденсатор начинает разряжаться через DIS и когда напряжение на нем станет равно нулю (полный разряд) система перекинется в противоположное состояние — на выходе 1, транзистор закрыт. Конденсатор начинает снова заряжаться и все повторяется вновь.
Заряд конденсатора С1 идет по пути: «R4->верхнее плечо R1 ->D2 «, а разряд по пути: D1 -> нижнее плечо R1 -> DIS . Когда мы крутим переменный резистор R1 то у нас меняются соотношения сопротивлений верхнего и нижнего плеча. Что, соответственно, меняет отношение длины импульса к паузе.
Частота задается в основном конденсатором С1 и еще немного зависит от величины сопротивления R1.
Резистор R3 обеспечивает подтяжку выхода к высокому уровню — так так там выход с открытым коллектором. Который не способен самостоятельно выставить высокий уровень.

Диоды можно ставить любые совершенно, кондеры примерно такого номинала, отклонения в пределах одного порядка не влияют особо на качество работы. На 4.7нанофарадах, поставленных в С1, например, частота снижается до 18кГц, но ее почти не слышно, видать слух у меня уже не идеальный:(

Покопался в закромах, которая сама расчитывает параметры работы таймера NE555 и собрал схему оттуда, для астабильного режима со коэффициентом заполнения меньше 50%, да вкрутил там вместо R1 и R2 переменный резистор, которым у меня менялась скважность выходного сигнала. Надо только обратить внимание на то, что выход DIS (DISCHARGE) через внутренний ключ таймера подключен на землю, поэтому нельзя было его сажать напрямую к потенциометру , т.к. при закручивании регулятора в крайнее положение этот вывод бы сажался на Vcc. А когда транзистор откроется, то будет натуральное КЗ и таймер с красивым пшиком испустит волшебный дым, на котором, как известно, работает вся электроника. Как только дым покидает микросхему — она перестает работать. Вот так то. Посему берем и добавляем еще один резистор на один килоом. Погоды в регулировании он не сделает, а от перегорания защитит.

Сказано — сделано. Вытравил плату, впаял компоненты:

Снизу все просто.
Вот и печатку прилагаю, в родимом Sprint Layout —

А это напряжение на движке. Видно небольшой переходный процесс. Надо кондерчик поставить в параллель на пол микрофарады и его сгладит.

Как видно, частота плывет — оно и понятно, у нас ведь частота работы зависит от резисторов и конденсатора, а раз они меняются, то и частота уплывает, но это не беда. Во всем диапазоне регулирования она ни разу не влазит в слышимый диапазон. А вся конструкция обошлась в 35 рублей, не считая корпуса. Так что — Profit!







2024 © kubanteplo.ru.