简述:使用TIM2捕获pwm
IDE: KEILv5.27
Firmware Package:STM32Cube FW_H7 V1.8.0
芯片:STM32H750VBT6
开启tim2输入捕获
配置PSC为200-1,这里主要是方便计算,计时器加一正好是1微妙。我配置的H750的主频为400M,APB1时钟为200M,并且我是用来测量50Hz的矩形波。所以PSC为200-1已经足够。ARR就取最大值即可。
通道一和二都配置成捕获上升沿。
管脚配置成上拉或者下拉。在无信号输入的时候,保持稳定的电平。
- HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
- HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);
- //开启tim2两通道的输入捕获
复制代码- void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
- {//hal库输入捕获回调函数、
- if(htim->Instance == TIM2)
- {//判断是否为TIM2
- if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)//判断是否为TIM2的通道一
- TIM2_CaptureChannel1_Callback();
- if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
- TIM2_CaptureChannel2_Callback();
- }
- if(htim->Instance == TIM4)
- {
- if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
- TIM4_CaptureChannel1_Callback();
- if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
- TIM4_CaptureChannel2_Callback();
- }
- }
- void TIM2_CaptureChannel1_Callback(void)
- {
- switch(tim2_ch1.capture_edge)
- {
- case RASING:
- __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);
- tim2_ch1.capture_edge = FALLING;
-
- tim2_ch1.capture_period = __HAL_TIM_GetCounter(&htim2);
- __HAL_TIM_SET_COUNTER(&htim2,0);
- break;
- case FALLING:
- __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);
- tim2_ch1.capture_edge = RASING;
- tim2_ch1.capture_half_period = __HAL_TIM_GetCounter(&htim2);
- }
- }
复制代码- #define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \
- do{ \
- TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \
- TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \
- }while(0)
复制代码
这一句话__HAL_TIM_SET_CAPTUREPOLARITY中就包含了清除原来通道的极性和设置型通道的极性。所以直接使用即可。
- __HAL_TIM_GetCounter(&htim2)
- __HAL_TIM_GetCompare(&htim2,TIM_CHANNEL_1)
复制代码 这两句话 第一句是用来获得计数器的值,一个是用来获得CCR1的值。CCR1是通道一的捕获/比较寄存器。CCR1包含了由上一次输入捕获事件传输的计数器值。所以在此中断里两句话的作用差不多。如果不在中断内调用,获得CCR1的值即可。由于我要在TIM4的中断中取获得TIM2的计数值,所以都使用了__HAL_TIM_GetCounter。
实验结果:50HZ方波捕获到的周期为20000us基本不变。
|