写在前面——
本文将介绍嵌入式竞赛实训平台(CT117E-M4)开发板上利用输入捕获测频率。
目录
一、硬件平台
嵌入式竞赛实训平台(CT117E-M4)是北京国信长天科技有限公司设计、生产的一款“蓝桥杯全国软件与信息技术专业人才大赛–嵌入式设计与开发科目”专用竞赛平台,平台以STM32G431RBT6为主控芯片,预留扩展板接口,可为用户提供丰富的实验场景。
CT117E-M4产片图片
二、软件平台
KEIL5,STM32CubeMX
三、频率发生器原理图
从上图我们可以看到频率发生器分别连接了PA15与PB4,通过在CubeMX中点击引脚可查看到,可以得知这两个引脚可用作以下定时器的输入捕获:
PA15 --> TIM2_CH1(AF1)
PB4 --> TIM3_CH1(AF2)
四、配置过程
1.这里我们选择TIM2的通道1
- 预分频系数为79 计数时钟频率就是 80MHz/(79+1) = 1MHz 此时1us计数一次
- 自动加载值设置为32bit最大值 0xFFFFFFFF
- 上升沿捕获
- 不分频
- 滤波值为8
- 同时在NVIC一栏使能TIM2的中断
五、编写程序
1.定义变量
/* USER CODE BEGIN 0 */
uint32_t capture_Buf[3] = {0}; //存放计数值
uint8_t capture_Cnt = 0; //状态标志位
uint32_t high_time; //高电平时间
/* USER CODE END 0 */
2.在 while(1)中的用户代码区 3,写入TIM2 CH1通道的输入捕获控制和数据处理
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
switch (capture_Cnt){
case 0:
capture_Cnt++;
__HAL_TIM_SET_CAPTUREPOLARITY(&htim5, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
HAL_TIM_IC_Start_IT(&htim5, TIM_CHANNEL_1); //启动输入捕获 或者: __HAL_TIM_ENABLE(&htim5);
break;
case 3:
high_time = capture_Buf[1]- capture_Buf[0]; //高电平时间
HAL_UART_Transmit(&huart1, (uint8_t *)high_time, 1, 0xffff); //发送高电平时间
HAL_Delay(1000); //延时1S
capture_Cnt = 0; //清空标志位
break;
}
}
/* USER CODE END 3 */
3.在main函数下方添加中断回调函数
/* USER CODE BEGIN 4 */
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if(TIM5 == htim->Instance)
{
switch(capture_Cnt){
case 1:
capture_Buf[0] = HAL_TIM_ReadCapturedValue(&htim5,TIM_CHANNEL_1);//获取当前的捕获值.
__HAL_TIM_SET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING); //设置为下降沿捕获
capture_Cnt++;
break;
case 2:
capture_Buf[1] = HAL_TIM_ReadCapturedValue(&htim5,TIM_CHANNEL_1);//获取当前的捕获值.
HAL_TIM_IC_Stop_IT(&htim5,TIM_CHANNEL_1); //停止捕获 或者: __HAL_TIM_DISABLE(&htim5);
capture_Cnt++;
}
}
}
/* USER CODE END 4 */
基本操作步骤:
- 设置TIM5 CH1为输入捕获功能;
- 设置上升沿捕获;
- 使能TIM2 CH1捕获功能;
- 捕获到上升沿后,定时器当前计数值存入capture_buf[0],改为捕获下降沿;
- 捕获到下降沿后,定时器当前计数值存入存入capture_buf[1],关闭TIM2 CH1捕获功能capture_Cnt=3;
- 高电平时间: capture_buf[1] - capture_buf[0] 发送到上位机 重新启动输入捕获
六、总结
输入捕获就到这里了~如果此文章对你有帮助,欢迎点赞
关注
收藏
转发