Appearance
定时器
基本定时器
基本定时器的计数模式和时钟分频因子是没有用的, 也没有重复计数器
生成PWM
配置
PWM模式只需要设置前面三个
实际的使用
测量脉冲长度
捕获脉冲
高级定时器输出指定数量的PWM
输出比较
带死区的PWM输出
比较极性就是有效电平, 空闲状态下的电平就是刹车以后得电平
关闭状态就是定时器不工作时候的输出信号设置
锁寄存器也不使用
自动恢复会在下一个时钟更新事件以后恢复输出
捕获PWM
c
HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);
开启的时候只打开了通道一的中断
c
uint32_t ccrl_val1a=0, ccrl_val1b=0, frq1 = 0, ccrl_val2a=0, ccrl_val2b=0, frq2 = 0;
float duty1 = 0, duty2 = 0;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim){
if(htim->Instance==TIM2)
{
ccrl_val1a = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);//获取捕获到的值
ccrl_val1b = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
__HAL_TIM_SetCounter(htim, 0);
frq1 = (80000000/80)/ccrl_val1a;//计算周期
duty1 = (ccrl_val1b*1.0/ccrl_val1a)*100;//计算占空比
HAL_TIM_IC_Start(htim, TIM_CHANNEL_1);//重新使能通道
HAL_TIM_IC_Start(htim, TIM_CHANNEL_2);
}
if(htim->Instance==TIM3)
{
ccrl_val2a = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
ccrl_val2b = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
__HAL_TIM_SetCounter(htim, 0);
frq2 = (80000000/80)/ccrl_val2a;
duty2 = (ccrl_val2b*1.0/ccrl_val2a)*100;
HAL_TIM_IC_Start(htim, TIM_CHANNEL_1);
HAL_TIM_IC_Start(htim, TIM_CHANNEL_2);
}
}