Изменение частоты с библиотекой PWM.h

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

У меня вопрос по использовании этой библиотеки(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 , но не уверен что он будет работать на нужной частоте. Напишите свое мнение в комментариях , или другое решение 

ImaSoft
ImaSoft аватар
Offline
Зарегистрирован: 22.09.2015

pwmWriteHR

Волшебник
Offline
Зарегистрирован: 22.12.2016

Частоту менять в примере написано как

//SetPinFrequencySafe(led, frequency);    //устанавливает частоту для указанного pin
SetPinFrequency(led, frequency);          //устанавливает частоту для указанного pin

 

ImaSoft
ImaSoft аватар
Offline
Зарегистрирован: 22.09.2015

Начнем с того что библеотека PWM от Sam Knight расчитана для контролеров:

a) ATmega48/88/168/328,

b) ATmega640/1280/1281/2560/2561
 
есть еще вариант для ATmega32U4
 
Привожу пример инициализации частоты:
 InitTimersSafe(); //initialize all timers except for 0, to save time keeping functions
 SetPinFrequency(pin, 500//Гц); //setting the frequency to 500 Hz

но не на все ноги можно выводить PWM: для ATmega328: это Цитата

/*
* Хотел отметить что есть возможность задания разных частот на разных таймерах и их пар ТАЙМЕР-2(OC2B=3;OC2A=11не_используется),ТАЙМЕР-1(OC1A=9; OC1B=10),ТАЙМЕР-0(OC0B=5; OC0A=6 Менять нельзя)
* Например нам нужно на таймере-1 иметь частоту PWM=500Гц вывод 10(Управление_нагрузкой), а на таймере-2 частоту PWM=16000Гц вывод 3(Управление_вентилятором)
* В Arduino по умолчанию используется таймер-0 5-6выводы частота 976Гц(Менять_ее_нельзя), все остальные по 497Гц
*/
Меняя частоты на pin 9 или 10(Таймер-1) вы меняете на обоих пинах, так же  на 3 и 11(Таймер-0) только вот 11 не используется из за апаратных особенностей, 5 и 6 менять нельзя только использовать штатным analogWrite(pin,xx);
 
Для 32U4 распиновка другая, немного Цитата:
 
*Хотел отметить что есть возможность задания разных частот на разных таймерах и их пар ТАЙМЕР-0(OC0B=3;OC0A=11не_используется),ТАЙМЕР-1(OC1A=9; OC1B=10),ТАЙМЕР-3(OC3A=5) ТАЙМЕР-4(OC4D=6не_используется)
 *Например нам нужно на таймере-1 иметь частоту PWM=500Гц вывод 10(Управление_нагрузкой), а на таймере-3 частоту PWM=16000Гц вывод 5(Управление_вентилятором)
 *В Arduino по умолчанию используется таймер-0 3вывод частота 976Гц(Менять_ее_нельзя), все остальные по 490Гц, использовать альторнативную библиотеку можно с пинами 5-9-10 6не_рабочий
*/

 

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

danil123901 пишет:

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

danil123901, чтор именно Вы подразумеваете под словами "136 шимом"?

Если то, что отношение положительной части периода к полному периоду будет 136/255, то, боюсь, это возможно лишь для нескольких фиксированных частот. Частота 1000 Гц в этот список не входит.

Чтобы "значением ШИМ" можно было управлять в диапазоне от 0 до 255, таймер должен ситать до конца (т.е. до 255), а частоту можно задавать лишь прескалером. Если же Вы хотите получить некоторую заданную частоту, то это потребует вполне определенных установок как прескалера, так и таймера. В частности, он будет считать уже не до 255, а до некоторого меньшего числа. Например, до 125. В этом случае счет НИКОГДА не достигнет желаемых Вами 136.

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