VenomXP писал(а):Neekeetos писал(а):В этом случае ты сможешь напрямую задавать частоту с помощью переменной Freq, а шаг изменения частоты будет фиксированый и равен Ftimer/32000 а генерируемая частота в таком случае будет F=Ftimer*Freq/32000. Советую выбрать частоту таймера и число вместо 32000 чтобы шаг попадал в нужную тебе сетку, тоесть 1 bpm =1/60 Hz ~ 0,016666(6).
То есть в freq будет содержатся число сообщающее количество ударов в минуту, ну или количество bpm, так?
если сделаешь шаг равным 1bpm то во freq будет частота в bpm
VenomXP писал(а):Еще вопрос что за
Ftimer и откуда появилось значение
32000?
Советую выбрать частоту таймера и число вместо 32000 чтобы шаг попадал в нужную тебе сетку, то есть 1 bpm =1/60 Hz ~ 0,016666(6).[
Вот вы этой фразе ниче не понял, может вы какое то слово забыли или знак препинания, что нужно выбрать, вместо чего и причем здесь число 32000?
Число задает порог переполнения переменной count. Частота ее переполнений и есть выходная частота которую ты хочешь получить.
Повторяться не буду, опишу вкратце как все рассчитать. Назовем число 32000 словом ЧИСЛО. Физическую частоту прерываний таймера - ЧАСТОТА_ТАЙМЕРА (тупой пример- если у тебя кварц на 4М и делитель перед таймером на 2, а сам таймер 8 битный и считает до 256 то она будет равна 7812,5Гц ). Частота которую ты хочеш получить на выходе - ЧАСТОТА , переменная freq ее задает из программы. Далее формула из предыдущих постов будет выглядеть так :
ЧАСТОТА = ЧАСТОТА_ТАЙМЕРА*freq/ЧИСЛО
к примеру ты хочешь чтобы freq задавало частоту с точностью до 1bpm, это 0,016666Гц, таймер возьмем тот что в примере выше - у которого прерывания идут с частотой 7812,5Гц, ищем число, такое чтобы был шаг 1bpm:
0,016666Гц = 7812,5Гц * 1( freq=1 те 1bpm)/ЧИСЛО
ЧИСЛО= 7812,5/0,0166666 = 468750 , число как видно не влезает в тип int, у которого до 65535 только /для беззнакового/, меняем делитель таймера, чтобы частота прерываний была еще в 16 раз меньше, тоесть прескалер делается не 2 а 32, тогда ЧАСТОТА_ТАЙМЕРА = 488,28125Гц
ЧИСЛО = 488,28125 / 0,01666666 = 29296,875, округляя - 29297
из за округления отклонение от заданного bpm будет 0,000427% в меньшую сторону.