Регулируем скорость вращения двигателя с помощью ШИМ(PWM) на ATtiny2313
Реализация регулировки скорости вращения двигателя довольно не сложная. Для этого необходимо знать что такое Широтно Импульсная Модуляция (ШИМ по английски PWM), иметь понятие о возможных вариантах её реализации.
В данном примере я расскажу как использовать программную ШИМ, то есть специальные таймеры-счетчики при программной ШИМ не будут задействованы. ШИМ с применением аппаратного ресурса таймеров-счетчиков называется аппаратной ШИМ про нее хорошо рассказал мой коллега.
И так, алгоритм следующий, необходимо организовать уменьшение и увеличение заполненности импульсов, при нажатии на кнопки "+" и соответственно "-". Подпрограммы уменьшения и увеличения скорости вращения будет включаться двумя кнопками, которые в свою очередь будут присоединены к прерываниям int0 и int1. Такое решение в связи с тем что управляющих кнопок больше не будет, а значит прерывания просто грех не использовать. Соответственно скорость будет увеличиваться или уменьшаться в зависимости от заполненности импульсов коммутирующих силовую схему управления двигателем.
Схема устройства представляет из себя следующее:
Используется только один полевой транзистор из сборки.
В основном цикле программы будет сама непосредственно программа реализации программной ШИМ.
//Подключаем стандартные библиотеки необходимые для работы #include <avr/io.h>//библиотека ввода/вывода #include <avr/interrupt.h>//библиотека прерываний #define nop() {asm("nop");}//функция позаимствованная из ассемблера "nop" //перечисление переменных unsigned int i=1;//переменная для ШИМ unsigned int p;//переменная для ШИМ unsigned int pp=50;//переменная для ШИМ скорость нарастания напряжения unsigned int ms;//переменная для задержки unsigned int x;//переменная для задержки //Попрограммы обработки прерываний SIGNAL(SIG_INTERRUPT0)//обработка прерываний кнопки "+" {pp=pp+1;} //увеличение при нажатии на кнопку "+" на 1 SIGNAL(SIG_INTERRUPT1)//обработка прерываний кнопки "-" {pp=pp-1;} //уменьшение при нажатии на кнопку "-" на 1 //функция задержки void delay_ms(int ms) {for (x=ms;x>0;x--) nop (); } //Функция включения бита 0 порта B void ledon(int ms) { PORTB = 0x01; delay_ms(ms); } //Функция выключения бита 0 порта B void ledoff(int ms) { PORTB = 0x00; delay_ms(ms); } //Основная программа int main( void ) { DDRB=0x01;//конфигурирование порта B на выход GIMSK=0b11000000; //разрешаем прерывание int0 и int1 MCUCR=0b00001111;// прерывание по возрастающему фронту - для кнопки 1 и 2 sei();//разрешаем прерывания for (;;)//бесконечный цикл { p=pp-i;//реализация ledon(p);//программного ledoff(i);//ШИМ } }
Вывод 12 микроконтроллера AtTiny2313 необходимо соединить с силовой схемой. Силовую схему для управления двигателем предлагаю построить на сборке из двух полевых транзисторов IRF7105. Довольно дешевая, компактная и доступная в продаже сборка. Преимущество применения именно полевых транзисторов в том что на них практически нету падения напряжения, и собственно они за счет этого не греются. Небольшим недостатком является напряжение открытия полевых транзисторов этой сборки оно составляет по паспорту 5В, но экспериментально проверено что оно порядка 4В.
А это значит что мы будем иметь довольно узкий диапазон изменения скорости вращения двигателя от 4В до 5В. В принципе можно использовать любую другую схему для управления мощной нагрузкой, применение такой схемы обусловлено маленькой мощностью портов микроконтроллера ATTiny2313 да и вообще всех микроконтроллеров семейства AVR. Что бы не сжечь порты микроконтроллера как-раз и применяется силовая схема управления нагрузкой а в данном случаи коллекторным двигателем.
На фотографии:
- макетная плата для attiny2313;
- сборка IRF7105 на полевых транзисторах;
- маломощный коллекторный двигатель.
Видео работы регулятора:
Это круто! :) Спасибо за
Это круто! :) Спасибо за статью и исходник. Запустил свой движок. Конешно не обошлось без танцев с бубном. Но это главным образом из-за самого движка. Движок у меня достаточно мощный (из таких часто делают мини дрели для сверления плат). Проблема в том что он никак не хотел запускаться на малых оборотах и при понижении оборотов глох, ну и сам режим ШИМ не подходил-работало не так как хотелось бы. Плюс в программе не предусмотрены "ограничители" по скорости. Т.е. нажимаем например все время кнопку уменьшения громкости. Скорость уменьшается, уменьшается. И потом наступает момент когда переменная для ШИМ переходит через нуль в отрицательные значения. В этот момент мой практически остановившийся движок... можно сказать "Взлетел" со стола на максимальных оборотах. Я мягко говоря был в шоке. Хорошо что к оси был преклеен всего-лишь листочек бумаги, а не что-то "по-тяжелее". В общем через пару часов копания в программе, изменения переменных, диапазона, удалось добиться более-менее нормальных результатов. В целом проблема с малыми оборотами осталась (ну такой движок, ничего не поделаешь), но шим работает шикарно. С прерываниями все тоже гуд! :)
необходима помощь
не подскажете как можно при помощи подобного схемного решения управлять двигателем мн-145А с номинальными характеристиками напряжения 27 вольт и током 0.6-0.7 ампера
Да собственно схема остается
Да собственно схема остается той же, единственное что полевой транзистор надо взять мощнее, можно взять например irfz44. И обрати внимание на микроконтроллер больше 5 Вольт нельзя подавать!
Помогите на tiny85 сделать
Помогите на tiny85 сделать управление сервомашинкой через USB (без дополнительных микросхем и кварцев) - чтобы можно было открывать com порт и писать туда нужный мне угол?
И я хочу чтобы в сутках было
И я хочу чтобы в сутках было 34 часа.
Фраза "...через USB..." "...открывать com порт..." убила
ну а чего такого? виртуальный
ну а чего такого? виртуальный ком-порт - разве нельзя?
"...через USB (без
"...через USB (без дополнительных микросхем и кварцев)..." - нуууууу, с такими условиями.
ну делают
ну делают же)
obdev.at/products/vusb/easylogger.html
только задача несколько другая, и документации мало)) или переделка аналогового входа в цифровой - намного сложнее?
Оцени по сложности этот
Оцени по сложности этот проект с учетом того, что исходника нету.
От 1 до 100. Если помигать светодиодом это к примеру 5-ть!
И скажи, много ты знаешь людей, которые могут сами написать софтовый протокол USB ???
некорректная постановка
некорректная постановка задачи. что брать за 95? (у меня фантазии не хватает)))
этот - USB ШИМ?
исходник USB части вроде как раз есть (на том самом V-USB), причем вроде бы встречались реализации именно подобных вещей с передачи данных от компьютера к устройству. остается только повесить шим и все это объединить в одном проекте.
меня для начала не хватает разобраться с работой программного USB))) нужно, чтобы это было хорошо разжевано) - поэтому и спрашиваю)))
Нужен совет!
Кто подскажет в чём трабла собрал эту схему мотор молотит постоянно на кнопки не гу гу!фузы?
программу копировал прямо с этой страничке ! разводку кнопок с http://avrlab.com/node/37 как я понял. прошивка льётся нормально и компелируется гуд!
Код с сайта если взять и
Код с сайта если взять и скопировать то работать не будет, надо удалить нумерацию строк.
Глянь на всякий случай не включена ли оптимизация кода, она может лишние паузы убирать и будет плохо работать программа.
Кнопки действительно подтянуты резисторами +5Вольт.
Нумирация строк не копируется
Нумирация строк не копируется при копировани копируется чистый код !
Тут же все основано на
Тут же все основано на прерывании!
Просто для проверки прерывания напии програмку простенькую, которая по нажатию на кнопку внешнего прерывания включает светодиод или типа того. Таким образом проверишь работает ли у тебя в самом микроконтроллере прерывания.
Обрати внимние на подключение библиотеки прерываний, конфигурирование прерываний и само глобальное разрешение прерываний. Все должно быть как в листинге программы на страничке сайта.
Эх если бы я умел писать программ!
Эх если бы я умел писать програмы ! почему эта не работает вот в чём секрет ?
Эх если бы я умел чаво
Эх если бы я умел чаво писать)) для мено писать код это как в космос)
Не ну есть такое выражение
Не ну есть такое выражение "...высраться и не надуться..."
Не в обиду сказано, но без труда ичего не будет.
Если есть проблема - её верное решение лежит в понимании её решения и умении сделать то, что необходимо для решения.
Без этого никак.
Я понимаю всё! просто новичёк
Я понимаю всё! просто новичёк в этой сфере, чё да как на примерах разбираю, кодописательство ещё в планах ну типа научится а там хз как будет!собераю примеры рабочие программы коды пробую делаю чё не получается ищу причину! Часы недавно по схеме соберал всё с первого раза заработало там не сложнее чем эта хрень, а тут загвоздка не знаю почему прошивка не робит или компелируется как то не так кароче хз!
Так ты смог залить прошивку в
Так ты смог залить прошивку в МК?
Или не смог?
Да конечно все компелируется
Да конечно все компелируется нормально и зиливается в мк! на управляющею ногу же идёт сигнал!
А кварц нужен или на
А кварц нужен или на внутренний настроено? мож фьюза как надо запрограмировать?
Все от внутреннего, хотя
Все от внутреннего, хотя легко можно и от внешнего подключить.
И так будет работать и так!
А у тебя есть готовая
А у тебя есть готовая прошивка может у меня как то не так прошивается!
Кароче я в панике не пошуть
Кароче я в панике не пошуть кнопки!
Особенности ШИМ
Доброго времени суток!
Есть пару вопросов по ШИМу:
Какова частота ШИМа у вашей схемы??
Мне нужно собрать две схемки
Первая - управление мощным движком с защитой по току, контролем напряжения питания , режимом торможения. Вопрос: лучше использовать программную или апаратную ШИМ? Я думаю аппаратная. Какая получится частота?
Вторая- нужно получить сигнал несущая 50 гц (20мС) и управлять длинной импульса от 1 до 2мС Вопрос: тот же. (если в этой проге будет считаться точные интервалы времени то все уже почти готово)
Лучше использовать аппаратную
Лучше использовать аппаратную ШИМ, по частоте даже не скажу, лучше заглянуть в документацию на конкретный микроконтроллер, так или иначе частота ШИМ будет напрямую зависеть от частоты тактирующего кварца.
Двигатель помощнее
А можете подсказать полевик для аналогичного, с минимумом обвязки, управления TTL-уровнем двигателем 12V 15-20А? Или проект ссылку на проект на нем?
Попробуйте IRFZ44 поставить,
Попробуйте IRFZ44 поставить, у него выходные характеристики до 65 Ампер, должен выдержать. Только необходимо будет поставить наверное драйвер по типу IRF4427 микроконтроллер может ток не дать который нужно для полноценного открытия полевого транзистора.
Спасибо, в недалеком будущем
Спасибо, в недалеком будущем этот проект мне понадобится.
Нарисовал схему и внес еще
Нарисовал схему и внес еще больше сумятицы :)
Включение показанное на схеме называется полумостовое, мостовое- если оба вывода двигателя соединены с транзюками, тогда можно будет реализовать еще и реверс:
1-я сборка управляется ШИМом
2-я сборка подает "+" или "-" Шим прийдется в одном из этих случаев инвертировать.
По схеме включения - устройство питается двух полярным напряжением со средней точкой. По логике и фото питание у тебя однополярное напряжение.
Если так то можно использовать один мосфет. Второй у тебя похоже коротит двигатель и тем самым его тормозит.
Вот что называется
Вот что называется выкладывать схему уже опосля того как забыл даже что собирал это :-)
Поправил в соответствии с собранным устройством на фотке выше.
extremist, респект за
extremist, респект за статью.
"А это значит что мы будем иметь довольно узкий диапазон изменения скорости вращения двигателя от 4В до 5В." Диапазон регулирования зависит от скважности и схемы подключения нагрузки. На выходе может быть от 0 до напряжения питания с заданной дискретностью. Схема действительно не помещала бы.
По тому поводу смотри
По этому поводу смотри картинку ниже, на графике показано момент где 4Вольта и где 5 Вольт. Так как это уже не первый раз большого внимания этой фразе, наверное придется перефразировать.
А схемку выложить
А схемку выложить сможешь??? Заранее огромное спасибо))
по поводу кода
добрый день, я начинающий радиолюбитель, и пока что только начинаю разбираться с микроконтроллерами. Подскажите, мне кажется, или переменная i тут лишняя? Потому что судя по тому, как я понял код, она вообще нигде не изменяется, проще было или создать константу, или уж тогда просто поставить в основном коде 1 вместо нее. Я прав? Или тогда я исхожу из следующих соображений pp=i+p, т.к. pp у нас получается период, а i и p ответственны за скважистость. И при постоянном периоде получается надо при увеличении i уменьшать p и наоборот.
Подскажите. Я не прав, или код не однозначный?
p и i - это переменные для
p и i - это переменные для скважности импульса.
При p=0, i=max - скважность минимальная,
при p=max, i=0 - скважность максимальная.
Какбэ можно было не тратить
Какбэ можно было не тратить переменную, а просто объявить константу static const int i = 999;
я про что и говорю, а где в
я про что и говорю, а где в коде i-то меняется? такое ощущение, что как в начале мы инициализировали i так оно и осталось.
Она названа переменной только
Она названа переменной только потому что можно ёё менять в процессе выполнения программы, что в данном примере кода не реализовано. Эта переменная задает шаг изменения скважности.
bolek не страдай х..ней
На фото все показано по поводу 4-5 Вольт
В статье написано, что двигатель микромощный, коллекторный. Ток не превышает 200мА.
Если кто хочет крутить двигатель мощностью 1кВатт - эт схему не стоит использовать, ничего не получится.
че-то я не доганяю... а разве
че-то я не доганяю... а разве не можно использовать эту схему для управления мощным выходным каскадом, который будет управлять хоть 10-ю киловаттами??
Схему управлеия
Схему управлени МОЖНО а выходной каскад НЕТ!
Управляющая схема подойдет даже для управдения мегаВаттной нагрузой, главное что бы силовой каскад обладал управляющим напряжением до 5Вольт и током до 50мА а на выходе уже ясен перец что надо что бы были характеристики выдерживающие нагрузку.
Можно, крутил аппаратным
Можно, крутил аппаратным ШИМом движок постоянного тока ДПР-72. Силовая схема была мостовая.
еще бы добавить индикацию
еще бы добавить индикацию текущих заданных оборотов в виде 10 светодиодов...
Реально проще добавить
Реально проще добавить символьный ЖКИ типа WH1602A и сделать тахометр, который и будет показывать количество оборотов. Правда из-за того что изначально устройство не предусматривало такие фишки были задействованы прерывания для повышения и понижения оборотов двигателя. По этому надо будет это учесть. Тахометр в ближайшее время будет.
Светодиоды с парой сдвиговых
Светодиоды с парой сдвиговых регистров будут надежней и дешевле :) Но менее презентабельно
хотелось использовать данное
хотелось использовать данное устройство для двигателя отопителя автомобиля, потому жк монитор не особо хотелось использовать, а вот 10 светодиодов для отображения текущих установок оборотов, было бы в самый раз..
Так а какой диапазон оборотов
Так а какой диапазон оборотов будет? Ты плавно хочешь регулировать? Или как вариант взять RGB светодиод, синий - 500 оборотов, зеленый - 1000 оборотов, красный - 1500 оборотов. Или как захочешь ам уже по количеству оборотов, как настроишь. А сама идея не прмиенять 10 светодиодов а взять один трехцветный. Хотя и 10 можно как полоску и 10 градаций скорости вращения. Сделай ТЗ - техническое задание, поставь цель с определенными характеристиками устройства и будем думать как реализовать.
вот именно с линейкой в 10
вот именно с линейкой в 10 светодиодов и хотелось бы.. т.е. фактически 10 положений оборотов. Хотя 10 для отопителя - это многовато.. а вот 6 было бы в самый раз.. первый светодиод отображает что питание на системе есть (при включенном зажигании) - двигатель не вращается. а остальные 5 - от малых оборотов до максимума.
p.s. все никак не хотят меня регистрировать на сайте..
По поводу светодиодов
По поводу светодиодов сложного не вижу вообще ничего. Давай начинай и выкладывай код н афорум будем вместе чето думать.
По поводу регистрации напиши логин и пароль на admin(dog)avrlab.com я просто вручную проверяю ящики, если в инете вижу связь со спамом сразу блокирую, может твой ящик по ошибке заблочил.