ШИМ, увеличение частоты
- Войдите на сайт для отправки комментариев
Втр, 05/11/2013 - 23:16
Добрый день
Есть задачка управлять электронным редуктором воздуха через Arduino. Управляется он следующим образом: на вход подается напряжение от 0В до 5В. Подключил к А0, вывожу нужное напряжение через analogWrite.
Но проблемма в том, что частота, на котрой работает ШИМ Arduino слишком мала: редуктор как бы дрибижит на нужно давлении, вместо того, чтобы работать плавно, ну или "держать" его. Я так понимаю, что частота, на которой работает микроконтроллер редуктора выше чатоты ШИМа Arduino.
Может подсажите как частоту ШИМа можно поднять?
Спасибо
На помять не подскажу, но на сайте этот вопрос очень хорошо освещался. Воспользуйтесь поиском по сайту.
Какая дуина? На каком пине analogWrite?
Поставьте LC фильтр - индуктивеость и конденсатор. Выбор номиналов будет зависеть от тока потребоения. При малых токах вы легко получите обычное напряжение без пульсаций или с минимальными пульсациями, но это уже будет не шим. В этом смысле частота шима будет влиять только на индуктивность и емкость конденсатора, но она будет не столь принципиальна
частоту можно поднять
http://habrahabr.ru/post/141442/
частоту можно поднять
http://habrahabr.ru/post/141442/
частоту можно поднять
http://habrahabr.ru/post/141442/
"не читайте советских газет" (c)
совершенно крамольная статья. Взялся за МК всерьез - читай даташиты, а не форумы, пусть даже "зарубежные". И зачем было влезать в ардуино, чтобы потом написать на голом Си и развести пальцы от крутости?
Arduino Uno, в будущем буду переходить на Mega, так как нужно управление несколькими редукторами
Мне, как сказать, ШИМ и не нужно использовать: мне надо чтобы на выходе было напряжение от 0В до 5В. Если использовать ШИМ в голом виде, то редуктор какбы "прыгает": довольно хорошо слышно скачки.
Есть и другое решение, точнее идея. Можно купить подобный редуктор, управление в нем осуществляется по каналу шириной 10бит. Но тогда получается, что я заберу 10 ног с Ардуинки, не совсем мне это подходит...
Ну коль такое советуете... Увеличте-ка частоту ШИМа вот в таком простеньком примере:
Если на этом же порту нужно мигать диодом, то придется ставить условие внутри for, и изменять через определенное количество циклов запись в порт, например PORTA = B10000001; потом снова цикл и обнуление.
Мне, как сказать, ШИМ и не нужно использовать: мне надо чтобы на выходе было напряжение от 0В до 5В. Если использовать ШИМ в голом виде, то редуктор какбы "прыгает": довольно хорошо слышно скачки.
2 Варианта.
Первый, подразумевает, что скорость редуктора быстро не меняется. Ставь RC Цепочку.
Выход ардуино через резистор 300ом-1к соеденяешь с конденсатором (на землю). Если твой редуктор имеет высокоомный вход - подключаешь, если не очень, то ставить коллекторный повторитель. Любой транзистор типа КТ 315, коллектор на плюс, базу к конденсатору, эмиттер -выход. + резистор на землю. конденсатор подбераешь эксперементально. Нужен осцилограф.
Второй:
Ставить R-2R Матрицу или профессиональный DAC. Почитай. Недостаток: Занимает выходы. для 8 бит -8 шт. Что бы сьекономить их: Или ты ставишь мультиплексор, сдвиговый регистр или покупаешь мегу. Первый вариант "дешевле"
не пугайте осцилографом)) ТС беспокоят признаки (дребезжание) которые индентифицируются без осцилографа. Я думаю, что ему будет достаточно, чтобы больше не дребезжало. Вместо RC лучше ставить LC, но и то и то подойдет
Если верить инструкции:
Входной сигнал (Входное сопротивление) (0 ÷ 5 V DC (10 кОм))
Выходной сигнал (см. примечание 1)
Аналоговый выход 1-5 V DC
(сопротивление на нагрузке не менее 500 кОм)
Выходной ключ типа NPN или PNP, выход с открытым коллектором, напряжение до 30 V, ток до 50 мА,
падение напряжения 2.4 V, предназначен для использования совместно с ПЛК или реле
Выходной сигнал ошибки
Выходной ключ типа NPN или PNP, выход с открытым коллектором, напряжение до 30 V, ток до 50 мА,
падение напряжения 2.4 V, предназначен для использования совместно с ПЛК или реле
не пугайте осцилографом)) ТС беспокоят признаки (дребезжание) которые индентифицируются без осцилографа. Я думаю, что ему будет достаточно, чтобы больше не дребезжало. Вместо RC лучше ставить LC, но и то и то подойдет
На самом деле я его вместо вольтметра использую. Купил вот этот, собрал и пользуюсь:
http://www.watterott.com/de/Digitales-Speicher-Oszilloskop-Bausatz-DSO-062
размер: Как расберии пи.
Без него настройка займет дольше времени. Мне почему-то кажется, что ТС с 2-ой попыки попадет и останется довольным.
Если верить инструкции:
Входной сигнал (Входное сопротивление) (0 ÷ 5 V DC (10 кОм))
нам только это важно. 10 ком для нашего случая нормально, ставьте RC или LC фильтр. Если вам не нужно быстро менять напряжение можете поставить электролит на несколько десятков или дажу сотню мкФ
Часто не надо менять, я думаю в районе 5 раз за день, а может и того меньше
зы/ а можно приблизительную схемку подключения фильтра? лучше RC конечно
Ну коль такое советуете... Увеличте-ка частоту ШИМа вот в таком простеньком примере:
Если на этом же порту нужно мигать диодом, то придется ставить условие внутри for, и изменять через определенное количество циклов запись в порт, например PORTA = B10000001; потом снова цикл и обнуление.
Не важно тот же порт или нет. Ладно, конкретизирую, пусть будет тот же:
13 вывод это PB5 и 11 это PB3. Покажите пример кода эквивалентный этому с увеличенной частотой ШИМа.
Часто не надо менять, я думаю в районе 5 раз за день, а может и того меньше
зы/ а можно приблизительную схемку подключения фильтра? лучше RC конечно
Так сразу бы и писал. А то тут тебе все такого (сложного) советуют ... Вот собственно схема. Ничего сложного. Вместо 1 микрофарады поставь 10 или 50, резистор лучше по меньше, 1к . Но так тоже работать будет!
http://arduino-info.wikispaces.com/Analog-Output
Если ты по английски понимаешь, то почитай. Под 1 картинкой, есть вторая, это на тот случай, если бы входное сопротивление было маленьким...
Часто не надо менять, я думаю в районе 5 раз за день, а может и того меньше
зы/ а можно приблизительную схемку подключения фильтра? лучше RC конечно
Так сразу бы и писал. А то тут тебе все такого (сложного) советуют ... Вот собственно схема. Ничего сложного. Вместо 1 микрофарады поставь 10 или 50, резистор лучше по меньше, 1к . Но так тоже работать будет!
http://arduino-info.wikispaces.com/Analog-Output
Если ты по английски понимаешь, то почитай. Под 1 картинкой, есть вторая, это на тот случай, если бы входное сопротивление было маленьким...
Большое спасибо, буду пробовать
Вы, кстати, зря не попробовали увеличить частоту ШИМа, может фильтр и не нужен, так как он (фильтр) может уже быть в самом клапане. Но так как вы отказались написать на каком выводе у вас клапан, попробывать не получится.
На D5 и D6 (использую 2 редуктора). Выбрал я эти выходы потому, что когда пробовал на других (не помню точно на каких) дребезг был еще больше. Методом тыка остановился на этих
В принципе можно использовать любые, так как все выходы/входы доступны
зы/забыл сказать плата Arduino Uno
5 и 6 лучше не трогать, подключите на 9 и 10 и в сетап добавьте строки:
и будет вам ШИМ с частотой 64 кГц.
Спасибо, буду пробовать. Но есть вопрос, где можно прочитать про эти конструкции? Я так понимаю, тут затрагиваються системные таймера?
maksim, Подскажите пожалуйста можно ли повысить частоту шим на 9 и 10 пине в районе около 100 кГц, и как записать это в сетап ?
http://arduino.ru/forum/apparatnye-voprosy/shim-bolee-chem-8-bit#comment...
Сложно все как то (
А можно как то так, как в 21 посте? Какая частота получится следующая? или это предел?
Записал в сетап как в 21 посте, померял тестером при 50% скважности, тестер показывает 31,5 кГц.
Поставил по умолчанию ,показывает примерно 475 гЦ, ну почти 490.
5 и 6 лучше не трогать, подключите на 9 и 10 и в сетап добавьте строки:
и будет вам ШИМ с частотой 64 кГц.
Ура, получилось!!! Так просто, совет от maksim (пост21), просто вставил в скетч. На стандартном ШИМе, моторчик на мощности ниже 50% противно пищит. Повысив частоту ШИМ, писк исчез.
Но, теперь моторчик отказывается крутиться на низкой мощности, а максимума достигает уже при выборе значения 40 (из 255).
Maksim подскажите, что можно изменить в Вашем примере кода для снижения частоты до 18кГц и до 9кГц?
http://forum.arduino.cc/index.php?topic=117425.0, ссылка на бибилотеку в конце 1 поста
библиотека позволяет выставлять любую частоту по желанию от 31Гц до 2мГц, а заодно задавать 16 битный шим 0-65535(конечно только на 16 битных выводах)
http://forum.arduino.cc/index.php?topic=117425.0, ссылка на бибилотеку в конце 1 поста
библиотека позволяет выставлять любую частоту по желанию от 31Гц до 2мГц, а заодно задавать 16 битный шим 0-65535(конечно только на 16 битных выводах)
Эх, хорошо Вам если понимаете как этим пользоваться. Я же новичек.
Дайте хотя бы краткую инструкцию, как это применить без танцев.
да собственно ничего сложного. Там вместе с библиотекой идут 2 примера в которых в начале скетча все расписано и показано, почитайте(правда на англицком). А для борьбы с писком двигателей применять надо RC фильтр (см. выше) в сочетании с операционным усилителем (ну это с паяльником надо дружить).
Да и схему подключения мотора к Ардуине нужно было бы посмотреть, чтоб понять почему он так реагирует на изменение частоты ШИМа.
Будет 8 кГц.
А для борьбы с писком двигателей применять надо RC фильтр (см. выше) в сочетании с операционным усилителем (ну это с паяльником надо дружить).
Да и схему подключения мотора к Ардуине нужно было бы посмотреть, чтоб понять почему он так реагирует на изменение частоты ШИМа.
Спасибо ребята за отклик!
В качестве управляющей платы я использую ардуинку про мини. А вот в качестве силовой, использую родную (силовую) плату управления этим двигателем. Так вот, он управляется ШИМ сигналом на частоте 18кГц (проверял осциллографом). И никакого писка. Тихо тихо даже на самом маленьком режиме. Там уже стоит фильтр скорее всего расчитанный на эту частоту. Если для Вас вытащить нужное из рекомендованного примера, как "два пальца об асфальт" , то буду чрезмерно благодарен. Так как приходиться учиться (догадываться) по обрывкам из разных статей, у меня могут уйти дни, прежде чем я получу результ.
В целом надо следующее: на одном пине ШИМ- 18кГц (50%), а на другом менять скважность на той же частоте (желательно от 0 до 1023) .
ну вот Вам первый пример, который идет с библиотекой:
- в строке 13 подключаем бибилиотеку PWM.h;
- в строке 19 задаем желаемую частоту - в Вашем случае 18000;
- в строке 24 чтобы все заработало запускаются таймеры;
- в строке 27 выставленная частота устанавливается для соотвествующего пина (SetPinFrequencySafe(led, frequency);).
Всё, дальше в коде вместо analogWrite используем pwmWrite.
Также доступна функция pwmWriteHR, - она то как раз дает возможность задавать значения ШИМ 0-65535 вместо 0-255, но для проМини будет работать только для пинов 9 и 10.
Наконец-то дошли руки замерить максимально возможную частоту по цифровому порту, при использовании IDE ардуино
Код естественно самый простой:
Имеем интерестный результат...
Это UNO R3
А Это MEGA2560 R3
Как видно прирост у UNO, целых 30%. При прочих равных. Это как понимать? Настолько кривой фреймворк, или особенность микросхем?
А так. Это плата за переносимость, простоту и читабеность кода.
Попробуйте так:
Будут вам одинаковые результаты, да и частота выше в несколько раз.
Но только есть одно НО - на Uno это будет 13 вывод, а на Mega 11 вывод.
А так. Это плата за переносимость, простоту и читабеность кода.
как и предпологалось особенность фреймворка, но это же неправильно? А если у меня проект построен на дергании пина с максимально доступной частотой. К примеру я знаю что UNO, дергает порт с частотой <90кГц.
Настраиваю проект на частоту 80кГц, даю другу, не зная о том что у него MEGA. от запускает скетч.... и бреется, так как его MEGA не дергает порт с частотой более чем 60кГц. Это ведь неправильно! Ясно же что частота работы портов на платах должна быть одинаковая (при той же частоте кварца), пусть даже по самому минимальному значению.
Кстати и UNO, и MEGA показала по потру 1,6мГц.
но это же неправильно? А если у меня проект построен на дергании пина с максимально доступной частотой.
Пишите для каждого контроллера свой код или универсальный код, но в отличии от дуинофункций пишите так, что бы выбор контроллера вносил изменения до компиляции кода, а не во время его выполнения.
А вообще для вашей задачи есть функция tone(), вот она и будет вам на всех контроллерах давать одинаковую заданную частоту.
В принципе да, вроде при определённых условиях хрошая функция, да и работает до 80кГц. Спасибо!
Параметра изменения ШИМ от 30.64 Hz до 62500.00 Hz
видел тут
http://t-brain.ru/?p=112
На Ардуино, чаще всего, используется базовая частота в 16 МГц.
Если посмотреть в wiring.c в IDE, то можно увидить, что параметр prescaler, на ВСЕ TCCRxB ставится "011" битовое, то есть делитель 64.
Режим ставится - phase correct pwm mode, в этом режиме счетчики считают вверх, потом вниз, при пересечении заданного значения "вверх" - выключаем пин порта вывода, на обратном - включаем. Всего в периуде - 255+255=510 тактов.
Итого частота 16 000 000 / (510*64) = 490 Гц.
Всего в нашем процессоре используются 5 вариантов "прескалер" - 1,8,64,256,1024 - "001","010","011","100","101" - соответственно
Тем, кто хочет быстрее, можно задать прескалер в 1 или 8, и получить примерно 32КГц и 4КГц.
Только нужно учесть, что таймер используется сразу несколькими ШИМ выводами.
Для моей ардуинки на 32U4 - примерно так
таймер 0 - d3, d11
таймер 1 - d9, d10
таймер 3 - d5,
таймер 4 - d6, d13( если есть ШИМ на нем)
для 168:
Три таймера 6 выходов
0 - 8 бит, два выхода, номера пинов ищите на схемотехнике своей ардуинки, OC0A, OC0B
1 - 16 бит, OC1A и OC1B
2 - 8 бит, хитрый, OC2A и OC2B
Для других - иначе - читайте датаШит сами ;).
Из таблички видно, что проще всего "трогать" третий таймер, он управляет частотой ШИМ только на пине d5.
установить 4 КГЦ:
установить 32 КГЦ:
вместо макросов можно использовать битовые операции, но тогда код не сильно читаемый.
---------------------------------------
Можно делать более тонкую настройку, так как Таймеры 1и 3 - 16 разрядные, а wiring - библиотека использует их как 8-разрядный., но тогда нужно глубоко понимать работу контроллера, задавать TOP отдельно, и лучше делать это с Таймером4, он 10 разрядный.
Все это потребует глубокого погружения в программирование на С и микроконтроллеры.
Без проблемм - написано выше: вариант 4 и 32 КГц.
Какие есть ещё способы уеличения частоты?
Разгон.
http://forum.arduino.cc/index.php/topic,10537.0.html
100КГц ШИМ
5 и 6 лучше не трогать, подключите на 9 и 10 и в сетап добавьте строки:
и будет вам ШИМ с частотой 64 кГц.
Добрый день. Возникло несколько вопросов:
1. Частота ШИМа меняется на всех "ногах" или только на 9 и 10?
2. Если я у себя в изменю код (просто добавлю в сетап 2 строчки) , то получу необходимое увеличение частоты на выводе 9 и 10?
Заранее спасибо за ответы.
Не забудьте защитить входы :http://olden.in.ua/articles/182-protecting-adc-inputs
АЦП
Пробовал arduino nano до максимума разогнать шим, конечно он ужасной формы. Предел оказался 2мгц,