使用一个定时器输出一路PWM,然后使用另一个定时器测量出占空比可频率
1、配置RCC、SYS、USART1、时钟84MHz
2、使用TIM2的CH1通道输出1kHz,占空比为40%的方波

3、使用TIM3的CH1和CH2的输入捕获功能进行检测占空比和测量频率


Counter Setting:
Prescaler(时钟预分频数):84-1 最大捕获频率84MHz/(83+1) = 1MHz
Counter Period(自动重装载值):65535,设置为最大值,若为32位则设置为4294967295
Input Capture Channel1:
Polarity Selection:Rising Edge(上升沿捕获)
Input Capture Channel2:
Polarity Selection:Failing Edge(下降沿捕获)
1、TIM2输出一路PWM
- HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);
-
- __HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_1,40);
2、在TIM3代码处启动TIM3 IC
- HAL_TIM_IC_Start(&htim3,TIM_CHANNEL_1);
- HAL_TIM_IC_Start(&htim3,TIM_CHANNEL_2);

3、编写输入捕获函数
- void TIM3_GetCapture(uint16_t *pucBuf)
- {
- pucBuf[0]=HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1)+1;
- pucBuf[1]=HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_2)+1;
- }
4、在main中定义变量和调用函数
- uint16_t ucCapt[2];
- uint16_t Freq;
- uint16_t Duty;
-
-
- while (1)
- {
- TIM3_GetCapture(ucCapt);
-
- Freq=1000000/ucCapt[0];
- Duty=ucCapt[1]*100/ucCapt[0];
-
- }
5、进行debug,结果正确

1、输入捕获初始化
- HAL_TIM_IC_Start(&htim3,TIM_CHANNEL_1);
- HAL_TIM_IC_Start(&htim3,TIM_CHANNEL_2);
2、输入捕获函数
- void TIM3_GetCapture(uint16_t *pucBuf)
- {
- pucBuf[0]=HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1)+1;
- pucBuf[1]=HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_2)+1;
- }
3、频率与占空比计算公式
- Freq=1000000/ucCapt[0];
- Duty=ucCapt[1]*100/ucCapt[0];