PWM библиотека, ШИМ Ардуино

Denis_1704
Offline
Зарегистрирован: 28.05.2014

Скачал библиотеку подправил пример(сделал понятным), а проверить осцилогрофа нет, может кто проверит.

и заодно скажет будит ли данная библиотека конфликтовать с RCSwitch.h и Ethernet.h

Библиотека с примером: https://yadi.sk/d/K_hBK_Xii3cMn

Пример:

/*
Пример для мега и Уно.
позволяет менять диапазона частот:
 1 Гц - 2 мГц (2000000 Гц) на 16-битных таймеров 
31 Гц - 2 мГц (2000000 Гц) на  8-битных таймеров 
Стандартная частота ШИМ ардуины 500Гц.
pwmWriteHR() может использоваться пины: на Uno (9 и 10) на Мега (2,3, 5, 6, 7, 8, 11, 12, 44, 45, и 46)
*/
#include <PWM.h>
int led = 5; // пин, светодиод 
unsigned long frequency = 31; // частота  1 - 2000000 (Гц)
int brightness = 125;         // частота ШИМ (0-255)  
//или
//word brightnessHR = 32768;  // частота ШИМ (0-65536) is 32768.
void setup(){
InitTimersSafe();                         //инициализируем все таймеры, кроме 0,
//SetPinFrequencySafe(led, frequency);    //устанавливает частоту для указанного pin
SetPinFrequency(led, frequency);          //устанавливает частоту для указанного pin
}

void loop(){
  pwmWrite(led, brightness);     //0-255   используйте эту функцию вместо analogWrite 
//или
//pwmWriteHR(led, brightnessHR); //0-65536 используйте эту функцию вместо analogWrite     

}

 

Denis_1704
Offline
Зарегистрирован: 28.05.2014

Неужели никто не пользовался данной библиотекой???

Наверное всех радует писк мотора и все пользуются штатной ШИМ?

Кто как меняет частоту ШИМ???

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Denis_1704, прямым программированием регистров таймера :)

Denis_1704
Offline
Зарегистрирован: 28.05.2014

dimax пишет:

Denis_1704, прямым программированием регистров таймера :)

не реально сложно  одновременно для нескольких шим в скетче где все без делайс

Denis_1704
Offline
Зарегистрирован: 28.05.2014

как определить примерную частоту без осцилографа??

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Denis_1704 пишет:

как определить примерную частоту без осцилографа??

Герцметром. Например, http://et67.ru/catalog/chastotomery/ch3-88

А вообще, недорогой осциллограф поможет ещё не раз, подумайте лучше о приобретении, правда - это хороший совет, поверьте.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Думаю Денису будет достаточно залить в свободную дуину скетч частотометра :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

dimax,

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Denis_1704 пишет:

как определить примерную частоту без осцилографа??

У Вас есть Ардуино - это лучше, чем осциллограф.

Действтиельно, Ардуино вполне способен как выполнять некоторую полезную (или не очень) работу, так и сам наблюдать о том, как эта работа выполняется, и докладывать хозяину.

 

PS. А осциллограф - да, вещь порлезная. И можно его сделать на той же Ардуине.

leo_kg
Offline
Зарегистрирован: 20.05.2014

Смотрел осцилографам выходящий сигнал на UNO до 1Мгц похоже на меандр свыше уже начинает перекашивать сильно фронты но это скорей проблемма самой UNO. И не всегда заданая частота соответствует реальной, если задаеш 50 Гц то осцилограф столько и показывает а вот если задать 52 Гц то уже начинает выдавать 52,3Гц, а на 100Гц опять точно выдает 100Гц. 

std
Offline
Зарегистрирован: 05.01.2012

Если со слухом хорошо, или поблизости есть пианина, то для определения частоты сгодится пищалка и любой двоичный счётчик. Слухаем, находим похожую ноту, выясняем частоту (существуют таблицы), умножаем на коэффициент деления счётчика. Если делить так чтобы частоты получались не выше 4 кГц, метода даёт точность около 3%.

И да, музыкальный инструмент иметь необязательно, щас VST-синтезаторов развелось как собак нерезанных. Ставь не хочу.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

leo_kg пишет:

...а вот если задать 52 Гц то уже начинает выдавать 52,3Гц...

std пишет:

Если делить так чтобы частоты получались не выше 4 кГц, метода даёт точность около 3%.

Как бы 0.3Гц от 52Гц - это существенно меньше 3%.

Потом, нота (52 Гц) получается в контроктаве. На слух точно определить не та-то просто, - в этом диапазоне у человеческого уха весьма низкая чувствительность к высоте.

Да и к 3% погрешности (как я понял - это четверть тона, т.е. половина "младшего разщряда") - это только при условии идеально настроенного инструмента. А сплошь и рядом попадаются инструменты, настроенные на 1/4, а то и на 1/2 тона ниже. Бывает и больше.

Цитата:

И да, музыкальный инструмент иметь необязательно, щас VST-синтезаторов развелось как собак нерезанных. Ставь не хочу.

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

Ислам Урус
Offline
Зарегистрирован: 08.07.2016

Шим 255 - это 50 герц?

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Ислам Урус пишет:
Шим 255 - это 50 герц?

Это коэффициент заполнения (duty cycle), а не частота: 255 - это 100%. Частота ШИМ постоянна, у ардуины по-умолчанию 490 Гц.

Ислам Урус
Offline
Зарегистрирован: 08.07.2016

Пончтно. А можно задавать шим в герцах? Я хочу сделать инвертор с регулируемой частотой от 0 до 10 герц. Такое возможно?

Ислам Урус
Offline
Зарегистрирован: 08.07.2016

Точнее от 0 до 100 герц

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Ещё раз: у ШИМ частота постоянна, а меняется скважность/коеффициент заполнения.

Широтно-импульсная модуляция

Ислам Урус
Offline
Зарегистрирован: 08.07.2016

Извините за невнимательность! Мою идею как-нибудь можно реализовать на ардуино?

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Ну генерить разную частоту на ардуино можно. Вот хорошая тема: Генератор с регулируемоей частотой на ардуино

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

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012
sunjob
sunjob аватар
Offline
Зарегистрирован: 18.07.2013

автор спрашивает:

Наверное всех радует писк мотора и все пользуются штатной ШИМ?

т.е. разговор идет об повышении частоты ШИМ-а... а ему тут "советуют" ...

варийант медленного ШИМ например

или я чего то непонимаю?

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

поясните, если не сложно?

спасибо

nevkon
Offline
Зарегистрирован: 20.01.2015

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sunjob пишет:

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

Вы можете увелечить частоту ШИМ выше звукового предела (20кГц и выше) или уменьшить ниже - менее 20Гц). Как это делается писалось здесь сотни раз с кодами и примерами.

А можете вообще отказаться от регулирования двигателя через непосредственно ШИМом. Например, микросхема ТА7291 работает через опорное напряжение (постоянное) и никакого ШИМа. Опорное напряжение, конечно тоже делается из ШИМа, но там ШИМ заранее интегрируется перед подачей на микросхему. Как это делается см. вот здесь. Есть о объяснение и готовая схема.

Ivan_Kornege
Offline
Зарегистрирован: 23.06.2016

Denis_1704 пишет:

Скачал библиотеку подправил пример(сделал понятным), а проверить осцилогрофа нет, может кто проверит.

и заодно скажет будит ли данная библиотека конфликтовать с RCSwitch.h и Ethernet.h

Библиотека с примером: https://yadi.sk/d/K_hBK_Xii3cMn

Пример:

/*
Пример для мега и Уно.
позволяет менять диапазона частот:
 1 Гц - 2 мГц (2000000 Гц) на 16-битных таймеров 
31 Гц - 2 мГц (2000000 Гц) на  8-битных таймеров 
Стандартная частота ШИМ ардуины 500Гц.
pwmWriteHR() может использоваться пины: на Uno (9 и 10) на Мега (2,3, 5, 6, 7, 8, 11, 12, 44, 45, и 46)
*/
#include <PWM.h>
int led = 5; // пин, светодиод 
unsigned long frequency = 31; // частота  1 - 2000000 (Гц)
int brightness = 125;         // частота ШИМ (0-255)  
//или
//word brightnessHR = 32768;  // частота ШИМ (0-65536) is 32768.
void setup(){
InitTimersSafe();                         //инициализируем все таймеры, кроме 0,
//SetPinFrequencySafe(led, frequency);    //устанавливает частоту для указанного pin
SetPinFrequency(led, frequency);          //устанавливает частоту для указанного pin
}

void loop(){
  pwmWrite(led, brightness);     //0-255   используйте эту функцию вместо analogWrite 
//или
//pwmWriteHR(led, brightnessHR); //0-65536 используйте эту функцию вместо analogWrite     

}

 

Есть осцил до 2ГГц, тебе чЁ весь диаппазон прогнать? Ты бы хоть крутилку типа китайского экодера ky040 приклячил.

nevkon
Offline
Зарегистрирован: 20.01.2015

ЕвгенийП пишет:

А можете вообще отказаться от регулирования двигателя через непосредственно ШИМом. Например, микросхема ТА7291 работает через опорное напряжение (постоянное) и никакого ШИМа.

Микросхема это конечно хорошо, но если у человека задача как была у меня, то этот экземпляр слабоват будет (до 48В 7А). :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

nevkon пишет:

Микросхема это конечно хорошо, но если у человека задача как была у меня, то этот экземпляр слабоват будет (до 48В 7А). :)

Ну, берите другую микросхему. Это был пример того, что бывают драйверы с опорным напряжением - "не ШИМом единым".

sunjob
sunjob аватар
Offline
Зарегистрирован: 18.07.2013

спасибо, я на рассыпухе все сделал... :о)

п.с. вопрос был - как непонимание, почему советуют понижать частоту шима... когда нужно повышать (т.е. я со своим шимом то разобрался...)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, почему, можно и понижать. От задачи зависит. Сделайте 10Гц, например, - для очень многих задач такой точнойсти управления вполне хватит.

sunjob
sunjob аватар
Offline
Зарегистрирован: 18.07.2013

> можно и понижать

> Наверное всех радует писк мотора и все пользуются штатной ШИМ?

разговор был об движке (видимо, что-то подобное турбине фена, или какой подобный коллекторный), в данном случае только повышение, и желательно вообще "без делителя" ...

> падает в разы мощность мотора

на своей турбине я этого не заметил (используется импульсныйо step-down преобразователь, три детали...), работает так же как и при запитке "напрямую"...

nevkon
Offline
Зарегистрирован: 20.01.2015

Значит у вас на двигателе не динамическая нагрузка. Я тут 6мм фрезой дерево как-то резал, так и на полных оборотах (48В) того и гляди шпиндель встанет, а если бы снизил обороты до нормальных для этой фрезы так точно встал бы - рукой легко останавливается.

sunjob
sunjob аватар
Offline
Зарегистрирован: 18.07.2013

> используется импульсныйо step-down преобразователь

Ислам Урус
Offline
Зарегистрирован: 08.07.2016

Здравствуйте, друзья, помогите сделать генератор 80 кГц, без регулирования частоты. Заранее спасибо.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

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

Берите микросхему ICL8038. Схема генератора прямо в даташите. Как считать частоту там написано. Резисторы ставьте подстроечные. Когда сделаете, подберёте частоту поточнее.

Kavalsky
Offline
Зарегистрирован: 25.03.2016

Все работает отлично, как я понял меняется частота ШИМ.

Мне нужно ДВА генератора на одной плате (до 50 Кгц), как я понимаю с этой библой это сделать невозможно, потому что ШИМ один ан Дуине?

Так как с программированем регистров таймера у меня большие сложности, подскажите как собрать двойной генератор?
Или на адекватную ссылку по регистрам наведите...

CatSoup
Offline
Зарегистрирован: 01.05.2017

Утро доброе, разобрался с либой, сделал на дуино генератор управляющих импульсов регулируемой частоты и скважиности (собираюсь измельчать металлы электроэрозионным методом), теперь мне необходимо обеспечить хотя бы программный deadtime между сигналами на входах полумостовых драйверов. Программно вывести два сигнала ШИМ, подрезав скважность второго на величину deadtime для исключения перехлеста сигналов и сквозняка при переключении 2го полумоста на 1й вроде бы не сложно, однако, как сделать фазовый сдвиг так, чтобы он был гарантирован? Да и на основе этого моста, который работает в импульсном режиме честно говоря очень хочется в дальнейшем попробовать мост с фазовым сдвигом. ЗЫ Защита от включения на сквозняк все равно будет в виде пары транзисторов на выходах ирок, которые закрыты в момент протекания тока по другой диагонали.

Baks
Baks аватар
Offline
Зарегистрирован: 11.01.2016

всем доброго дня коллеги.

начал разбираться с шим на ардуино мега.

необходимо менять скорость кулера (он на 5 вольт) питаю от отдельного DC-DC, Управляется транзистором 3705N

собрал плату с защитным диодом, ну и поджарил немного диод(из своей свалки). теперь думаю что не так поставил чтоли)))))))

или может брак какой?

а в общем то вопрос вот в чем....

а ардуино мега знаю что 6 таймеров, мне надо использовать 2 пина так как будут 2 кулера с разной чистотой крутить.

куда лучше посадить чтоб в дальнейшем не мешало ничему и не конфликтовало с другими библиотеками?

и какой таймер за что отвечает? не могу найти инфу.... а когдато попадалась.....

заранее благодарен!

и еще есть ли библиотека для работы с мегой?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Диод-то небось задом наперёд поставили? Хорошо хоть диод не особо мощный, а то какой-нибудь SF81 вполне бы себе выжил, зато из всего остального бы дым выпустил.

Какой таймер за что отвечает (в смысле за какие пины?) смотрите в даташите на мегу. Если склероз не изменяет, то 

Пины 4 и 13: timer0
Пины 11 и 12: timer1
Пины 9 и 10: timer2
Pin 2, 3 и 5: timer 3
Pin 6, 7 и 8: timer 4
Pin 46, 45 и 44: timer 5
 
Таймер 0 занят под millis
 
Библиотек для работы с мегой некуда девать.
Baks
Baks аватар
Offline
Зарегистрирован: 11.01.2016

спасибо за ответ, я имел в виду чтото в роди этого

"Таймер 0 занят под millis"

остальные таймеры под что заняты?

к примеру tone и ватчдог тоже занимают таймеры.

а серилал (их 4 на меге) тоже  наверное занимают?

и какой более безболезненно использовать на 2 пина ?

я думал использовать 44-45 пины попробовал библиотеку PWM, не заработало.

а сто вы имели в виду "Библиотек для работы с мегой некуда девать." ? 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

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

Baks
Baks аватар
Offline
Зарегистрирован: 11.01.2016

ну пока мысли в голове, половина уже в железе собрано, продолжаю собирать...

что будет занято это все сериалы, возможно 1 софтсериал тоже займу.

из библиотек поставлю Wire для ds18b20, dht11 но она вроди не использует таймер, ватчдог, tone (возможно). ну вроди все.

какой библиотекой лучше воспользоваться не меге ?

Baks
Baks аватар
Offline
Зарегистрирован: 11.01.2016

так и не нашел библиотеку для работы с 44-45 пином, решил попробовать на первом таймере 11 пин через библиотеку, все сразу запустилось.

а дальше проверил без нее и оказалось замечательно и без нее работает, не жужит))))) так и оставлю)))))))!!!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, как же так без библиотеки-то? Правильные ардуинщики, если им надо помигать светодиодом, всегда идут на форум с требуют дать им ссылку на подходящую библиотеку! И в этом высокий смысл и высокая философия! :)

Baks
Baks аватар
Offline
Зарегистрирован: 11.01.2016

ЕвгенийП пишет:

Ну, как же так без библиотеки-то? Правильные ардуинщики, если им надо помигать светодиодом, всегда идут на форум с требуют дать им ссылку на подходящую библиотеку! И в этом высокий смысл и высокая философия! :)

если только ради Вас:))))

форум на каком можно просить библиотеку не подскажете? ;)

кстати я так и не понял прикола, почему на 44 пине гул от вентилятора а на 11-12 нет (осцилографа у меня нет)? 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Baks пишет:

форум на каком можно просить библиотеку не подскажете? ;)

Это смотря куда Вы предпочитаете быть посланным. На разных форумах разные традиции :)

Baks пишет:

кстати я так и не понял прикола, почему на 44 пине гул от вентилятора а на 11-12 нет (осцилографа у меня нет)? 

Так обзаведитесь. Тот же DSO-138 при весьма скромной цене смог бы помочь в большистве "ардуино-проектов"

 

CatSoup
Offline
Зарегистрирован: 01.05.2017

Цитата:

форум на каком можно просить библиотеку не подскажете? ;)

кстати я так и не понял прикола, почему на 44 пине гул от вентилятора а на 11-12 нет (осцилографа у меня нет)? 

 

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

danil123901
Offline
Зарегистрирован: 17.06.2017

dimax , У меня вопрос по использовании этой библиотеки(pwm.h) Функция pwmwrite работает только с pwmwrite(pin , x) ,где x=0 и 255 . Как заставить работать со значением например 1000Гц и 136 шимом ?Смотрел в описании библиотеки на 0 и 255 он просто вкл digitalwrite LOW или HIGH  а далее идет вот такая вот абракадабра

TimerData td = timer_to_pwm_data[digitalPinToTimer(pin)];
		if(td.ChannelRegLoc) //null checking
		{
			if(td.Is16Bit)
			{
				sbi(_SFR_MEM8(td.PinConnectRegLoc), td.PinConnectBits);
				_SFR_MEM16(td.ChannelRegLoc) = (tmp * _SFR_MEM16(td.TimerTopRegLoc)) / 255;
			}
			else
			{
				sbi(_SFR_MEM8(td.PinConnectRegLoc), td.PinConnectBits);
				_SFR_MEM8(td.ChannelRegLoc) = (tmp * _SFR_MEM8(td.TimerTopRegLoc)) / 255;
			}
		}	

Я пробовал использовать analogRead вместо pwmWrite , но не уверен что он будет работать на нужной частоте. Напишите свое мнение в комментариях , или другое решение 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

danil123901,

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

 

 

FefeXX
Offline
Зарегистрирован: 29.11.2019

Доброго времени суток!

Использую библиотеку PWM.h

Управляю драйвером шагового двигателя, выдавая на него импульсы:

pwmWrite(pin, freq); 

Всё работает, как надо ))

Однако кроме импульсного сигнала, на драйвер шагового двигателя необходимо подавать ещё пару логических сигналов (0 В, либо 5 В). - направление вращения и разрешение управления. Всё бы ничего, но внутри драйвера сигнальные "плюсы" объединены. Соответственно как быть с PWM-сигналом? Получается от ардуины кидаем общие +5В на драйвер, но тогда ШИМ не будет работать. Что можно придумать?

Спасибо.

 

nevkon
Offline
Зарегистрирован: 20.01.2015

Что за такой хитрый драйвер? Сигналы step/dir всегда идут на разных ножках. И они объединены никак не могут быть.

FefeXX
Offline
Зарегистрирован: 29.11.2019

Почти все драйверы Leadshine такие. Кроме DM2282. PUL это тот же STEP, в данном случае:

sadman41
Offline
Зарегистрирован: 19.10.2016

Если мне склероз не изменяет - достаточно выход МК соединить штатно с драйвером, а сигнал управляющий инвертировать (вместо HI подавать LO и наоборот).