实验目的:选定一个引脚(PA1)PWM产生,然后用输入捕获查看上升沿和下降沿之间的计数值,然后根据分频数计算占空比,再串口输出测量到的频率和占空比。
配置视频:补充----测量占空比的MX配置_哔哩哔哩_bilibili
这两个和时钟配置不必说。
以上是输入捕获配置(注意内部时钟,直接和间接模式,打开中断,一个上升沿,一个下降沿触发中断)
上图是配置的PWM(不需要开中断)
上图是串口配置(别忘了开中断)
最后生成代码之后,再在main.c文件中定义函数:
int t=0,t1=0,f=0;
float Kong=0;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)//一定注意是输入捕获的中断回调函数(之前用错,看了50分钟才发现!)
{
if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_2)//如果是CH2(检测上升沿的位置)
{
t1=HAL_TIM_ReadCapturedValue ( &htim2,TIM_CHANNEL_2 );//闭环之后,先获得一个周期的计数值
__HAL_TIM_SetCounter(&htim2 ,0);//再把计数值归零
}
else
t=HAL_TIM_ReadCapturedValue ( &htim2,TIM_CHANNEL_1 );//检测到下降沿然后记录计数值
HAL_TIM_IC_Start_IT (&htim2 ,TIM_CHANNEL_1);//这两行重新打开中断
HAL_TIM_IC_Start_IT (&htim2 ,TIM_CHANNEL_2);
}
主函数程序:
int main(void)
{
char s[20];
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM2_Init();
MX_TIM3_Init();
MX_USART1_UART_Init();
HAL_TIM_PWM_Start (&htim3 ,TIM_CHANNEL_2);//开启PWM
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_2, 100);//配置占空比
HAL_TIM_IC_Start_IT (&htim2, TIM_CHANNEL_2);//首先开启中断
HAL_TIM_IC_Start_IT (&htim2, TIM_CHANNEL_1);
while (1)
{
f=1000000/t1;//因为计数器是79分频的
Kong=((float )t/(float )t1)*100;
sprintf(s,"频率:%d\r\n占空比:%.2f\r\n",f,Kong);
HAL_UART_Transmit (&huart1 ,(unsigned char*)s,strlen (s),50);//串口打印
HAL_Delay (500);
}
}