基础知识
- 定时器是一种特殊的计数器,它对周期已知的脉冲信号进行计数,通过计数次数来算出计数时间。对于已知的脉冲信号(内部时钟信号),可以使用定时器模式,对于未知的脉冲信号(外部脉冲信号),只能使用计数器模式。
- 定时器使用时关注的三个问题:位宽、计数值、处理。
- STM32定时器分类:
基本定时器只能用于定时/计数。一般用作时基。通用定时器在基本定时器的基础上增加了一个外部引脚,可以实现输入捕获与输出比较等功能。传感器数据采集主要用通用定时器的输入捕获功能。高级定时器TIM1与TIM8相比于通用定时器增加了电机控制与数字电源设计相关的功能。 - 输入捕获一般应用在两个方面,一个方面是计算脉冲跳变沿时间的方式测量脉宽与频率,另一方面是用 PWM 输入的方式测量脉宽与频率。
- 测周期是通过相邻两次中断计数值之差来换算的。那么两次进入中断要将计数值保存在两个不同的变量中,必然导致中断里面要有分支。
- 一个外设有几类功能,HAL库就给它定义了几种初始化数据类型来初始化结构体。
- GPIO成为简单外设。定时器之类的属于复杂外设。HAL库对于复杂外设在程序中的描述,有三种基本的设计方法:句柄设计——设计了统一的外设句柄数据类型PPP_ HandleTypeDef。编程模型——设计了轮询、中断、DMA三种编程模型。通用接口函数——设计了四类通用的接口函数。
- 时基单元分为:预分频模块、计数模块、自动重载模块。
测量脉冲宽度或者测量频率流程
- 设置TIM2 CH1为输入捕获功能;
- 设置上升沿捕获;
- 使能TIM2 CH1捕获功能;
- 捕获到上升沿后,存入capture_buf[0],改为捕获下降沿;
- 捕获到下降沿后,存入capture_buf[1],改为捕获上升沿;
- 捕获到上升沿后,存入capture_buf[2],关闭TIM2 CH1捕获功能;
- 计算:capture_buf[2] - capture_buf[0]就是周期,capture_buf[1] - capture_buf[0]就是高电平所占时间。
代码实现
main.c 只写自己添加的代码
#include <stdio.h>
uint32_t capture_Buf[3] = {0};
uint8_t capture_STA = 0;
uint32_t time;
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM2_Init();
MX_USART1_UART_Init();
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
printf("进入主函数\r\n");
while (1)
{
if(TIM2CH1_CAP_STA & 0X80)
{
HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);
high_time = TIM2CH1_CAP_STA & 0X3F;
high_time *= 65536;
high_time += TIM2CH1_CAP_VAL;
printf("一个周期的时间为%d us\r\n",high_time);
TIM2CH1_CAP_STA = 0;
}
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10, GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10, GPIO_PIN_RESET);
HAL_Delay(500);
}
}
|