调节频率: 定时器重载值 = 定时器分频后的频率 / 最终输出的频率
调节占空比:
/*
功能:
改变指定定时器指定通道的pwm的频率和占空比
参数:
htim:定时器句柄
chanel: 通道
duty_cycle:占空比 0.0~1.0
frequency :PWN频率
*/
void change_duty_cycle_frequency(TIM_HandleTypeDef *htim,uint32_t chanel,float duty_cycle,uint32_t frequency)
{
uint32_t arr = 10000/ frequency -1 ; // 定时器重载值 = 定时器分频后的频率 / 最终输出的频率
printf("param %d %.3f\r\n",arr,duty_cycle);
__HAL_TIM_SET_AUTORELOAD(htim,arr);
__HAL_TIM_SET_COMPARE(htim,chanel,arr*duty_cycle);
//__HAL_TIM_URS_ENABLE(htim);
}
频率测量计算方法 : 检测频率= 定时器分频后的频率 / 定时器的一个周期的计数值
/*
检测PWM的频率和占空比
第一个上升沿复位计数器
第二个上升沿通道1是检测周期
第一个下降沿通道2检测占空比
*/
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if(htim != &htim2) return;
if(htim->Channel ==HAL_TIM_ACTIVE_CHANNEL_1 )
{
printf("f = %d %d %.2f %.2f\r\n",one,two,one*1.0/two,84*1000*1000*1.0/two );
two = __HAL_TIM_GET_COMPARE(htim,TIM_CHANNEL_1);
}
else if(htim->Channel ==HAL_TIM_ACTIVE_CHANNEL_2 )
{
one = __HAL_TIM_GET_COMPARE(htim,TIM_CHANNEL_2);
}
}
有刷电机控制转动圈数,必须要有编码器的存在
直流有刷电机的位置控制(控制转动几圈)是通过编码反应电机转动的角度。 如电机旋转一圈编码器输出60000个脉冲,用户要求电机旋转2圈,就是设置PID目标值12000=6000*2, PID 传入的实际值也就是编码器的脉冲数