既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
④记录此时的TIMx_CN(计数器)T的值
⑤前后两次TIMx_CNT(计数器)的值之差就是高电平的脉宽。同时根据TIM的计数频率,我们就能知道高电平脉宽的准确时间。
简单说:
当你设置的捕获开始的时候,cpu会将计数寄存器的值复制到捕获比较寄存器中并开始计数,当再次捕捉到电平变化时,这是计数寄存器中的值减去刚才复制的值就是这段电平的持续时间,你可以设置上升沿捕获、下降沿捕获、或者上升沿下降沿都捕获,
输入捕获的工作流程(对应CubeMx的四个选项)
设置输入捕获滤波器
STM32在很多功能中都提供了滤波器,滤波器的功能简单来说就是多次检测视为一次有效,达到滤波效果,
数字滤波器由一个事件计数器组成,假设我们是检测高电平,滤波N次,那么记录到N个事件后计数器会产生一个输出的跳变。也就是说连续N次采样检测,如果都是高电平,则说明这是一个有效的电平信号,这样便可以过滤掉那些因为某些而干扰产生的一些信号
输入捕获滤波器IC1F[3:0],这个用于设置采样频率和数字滤波器长度。其中:fCK_INT是定时器的输入频率,fDTS是根据TIMx_CR1的CKD[1:0]的设置来确定的。
设置输入捕获极性
设置具体为那种捕获事件
可以设置上升沿捕获、下降沿捕获、或者上升沿下降沿都捕获
设置输入捕获映射关系
STM32为了更好的优化使用,TIMx_CH1通道1捕捉到的信号可以传输到IC1,TIMx_CH1捕捉到的信号也可以连接到IC2,TIMx_CH2捕捉到的信号也可以连接到IC2,也可以连接到IC2
设置输入捕获分频器
设置每N个事件触发一次捕获****,可以设置为1/2/4/8次检测到电平变化才触发捕获
溢出时间计算:
t1时刻检测到高电平,发生中断,在中断里将计数值置0,开始记溢出次数N,
其中每计数0xFFFF次溢出一次,直到t2时刻跳变回低电平,
获取最后一次溢出时到t2时刻的计数值TIM5CH1_CAPTURE_VAL
则 高电平时间 = 溢出次数*65535+TIM5CH1_CAPTURE_VAL us ;根据定时器初始化时的频率即可计算出溢出总次数所占用的时间,即为高电平时间。
如果计数器值为 32 bit 那么最大为0xFFFFFFFF
高电平时间:
输入捕获的工作框图
工程创建
设置RCC
设置高速外部时钟HSE 选择外部时钟源
2设置时钟
我的是 外部晶振为8MHz
- 1选择外部时钟HSE 8MHz
- 2PLL锁相环倍频72倍
- 3系统时钟来源选择为PLL
- 4设置APB1分频器为 /2
- 5 这时候定时器的时钟频率为72Mhz
32的时钟树框图 如果不懂的话请看《【STM32】系统时钟RCC详解(超详细,超全面)》
3定时器配置
这里我们选择TIM5的通道1
- 预分频系数为71 计数时钟频率就是 72MHz/(71+1) = 1MHz 此时1us计数一次
- 自动加载值设置为32bit最大值 0xFFFFFFFF
- 上升沿捕获
- 不分频
- 滤波值为8
同时在NVIC一栏使能TIM5的中断
对应引脚设置下拉电阻,保证没有信号输入的时候电平稳定
4项目文件设置
- 1 设置项目名称
- 2 设置存储路径
- 3 选择所用IDE
5创建工程文件
然后点击GENERATE CODE创建工程
配置下载工具
新建的工程所有配置都是默认的 我们需要自行选择下载模式,勾选上下载后复位运行
例程实现:
定义变量:
/* USER CODE BEGIN 0 */
uint32_t capture_Buf[3] = {0}; //存放计数值
uint8_t capture_Cnt = 0; //状态标志位
uint32_t high_time; //高电平时间
/* USER CODE END 0 */
在 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 */
在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:
![img](https://img-blog.csdnimg.cn/img_convert/b467969e197b8de10d302bd24cff1dd5.png)
![img](https://img-blog.csdnimg.cn/img_convert/cdb2dcc4daf747b332e6373cf787b761.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**
G9X-1715708548778)]
[外链图片转存中...(img-Y6W7LFti-1715708548778)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**