STM32频率和占空比(可调)
/设置频率*****/
/*
//公式
T= (arr+1) (PSC+1)/Tck
f=Tck/(psc+1)(arr+1)
//举例
主频为72000000,设置频率为 1000Hz
*psc=0;
(arr+1) = (Tck/(*psc+1)) / f;
(arr+1) = (72000000/(0+1)) / 1000;
(arr+1) = 72000000 / 1000;
(arr+1) = 72000;
*psc=1;
(arr+1) = (Tck/(*psc+1)) / f;
(arr+1) = (72000000/(1+1)) / 1000;
(arr+1) = 36000000 / 1000;
(arr+1) = 36000;
*arr = 35999;
*psc = 1;
*/
/*
//验证
主频为72000000,设置频率为:1000Hz == 周期为:1ms == 0.001s
*psc = 1;
//公式
T= (arr+1) *(PSC+1)/Tck
0.001 = (arr+1) *(1+1)/72000000
0.001 = (arr+1) 2/72000000
0.00172000000= (arr+1) *2
72000 = (arr+1) *2
72000/2 = arr+1
36000 = arr+1
arr = 35999
*/
void Calculate_TimerArg(uint32_t workFreq,uint32_t f,uint16_t *arr,uint16_t psc)
{
double d_arr=0;
psc=0;
do
{
d_arr=(workFreq/(psc+1))/f;
if(d_arr>65500)
{
(psc)++;
}
else
{
break;
}
}while(1);
uint16_t t=d_arr-0.5;
arr=t;
}
/设置频率/
/设置占空比*****/
//0.1 - 1 (1000 - 10000) duty变量之前放大了100倍 输出占空比范围为 0 - 100%
TIM_SetCompare1(TIM2,(TIM2->ARR+1)*duty/10000);
/设置占空比*****/