2024.1.30随堂笔记 方波输出和捕获,IO口中断和串口

Copyright (c) 2024 by Jsir2022, All Rights Reserved.

捕获的通路和原理

波形经过滤波和上升下降沿捕获,经过设置CNT捕获对波形中的上升沿
Pasted image 20240130141741.png

如果不对CNT清零,计数波形如下
Pasted image 20240130141825.png

若对CNT清零,并分频得到ts=1us,CCR1中保存的计数值就是delta t
Pasted image 20240130142221.png

单通道捕获

因为APB1和APB2总线都是150Mhz,就不用理会定时器究竟挂载在哪个总线上。
Pasted image 20240130142715.png

一般要改的是分配器PSC,设置为(150-1)就得到ts的一微秒,引脚PA15
Pasted image 20240130142953.png
而它的极性选择可以默认上升沿
Pasted image 20240130142933.png
记得打开中断,服务函数在hal_time.h找
Pasted image 20240130143357.png
找Input Capture的,带IT的start函数开启捕获
Pasted image 20240130143505.png

HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);

然后找它的回调函数,要懂英文。
Pasted image 20240130143937.png
想要读取值还需要这个函数
Pasted image 20240130144501.png

捕获频率的代码实现
Pasted image 20240130145632.png

双通道捕获

CH1直接捕获,CH2间接捕获。
Pasted image 20240130150313.png
注意通道一是上升沿,另一个是下降沿
Pasted image 20240130150326.png
CCR1测出周期,CCR2测出脉冲宽度,也就是占空比。单通道也可以做,先上升沿然后触发中断赶紧调成下降沿。
Pasted image 20240130150708.png
代码
Pasted image 20240130151330.png

哎呀上一张图的代码出错了,因为在一个周期内进入了两次中断(CH1和CH2的),导致得出的频率是两倍。于是做出修正,仅当是TIM3的CH1(完整周期)进来的才取数。
Pasted image 20240130152514.png
然后占空比计算不对,是因为两整数相除得整数,需要强制转换。

s_fDuty = ((float)_CCR2_Value / _CCR1_Value) * 100;

定时器既要输入又要输出

如图情况不推荐,就算CCR是独立的,但一个定时器共用CNT,你的捕获就得记录备份值而不是CNT清零(否则PWM输出会受影响)。
因此比赛过程中尽量分开定时器做功能,节约时间。
Pasted image 20240130153322.png

PWM输出的原理和应用

ARR(计数寄存器)控制周期,CRR(比较寄存器)控制脉宽。PSC控制计数频率,TIM2先前已设置为1us加一
Pasted image 20240130153538.png

启用PWM输出的函数
Pasted image 20240130154032.png
初始化ARR和CCR寄存器,ARR=250-1次相当于周期250us,CCR=25-1us相当于占空比10%。
Pasted image 20240130154432.png

第十四届省赛

要求频率均匀变化且占空比不变,需要计算变化率,然后改变ARR,为了占空比不变CCR要重新计算。
Pasted image 20240130155920.png

占空比变化只需更改CCR。

而前面的双通道测量可能要更改。

IO口EXIT中断(可能不常考)

原理是单片机IO口对波形上升沿或下降沿触发中断,相当于不用定时器计数。但如果想测出频率需要定时器定时一秒然后提取你定义的计数值。原理如图
Pasted image 20240130162416.png

设置好引脚为EXIT功能后,使能中断。
Pasted image 20240130160559.png

回调函数在hal_gpio.h
Pasted image 20240130160815.png
计数的变量自己定义然后++,注意是位与上GPIO_PIN
Pasted image 20240130161219.png

串口不定长接收字符串(先前没考,24年很可能考)

配置异步串口USART,网上有,去看板子原理图确认是与电脑通信的引脚就好。

找到使能串口接收中断函数,相当于上面模块的START
Pasted image 20240130163323.png
找接收数据回调函数
Pasted image 20240130163504.png
接收数据到Buffer,还实现了不定长功能。每进一次中断增加一个字节,然后重置RX_Time(超时时间)。不定长原理是超时后确认为发送完毕。(怎么感觉和按键有点像,都是等待波形结束)
Pasted image 20240130164325.png
然后用strcmp比较
Pasted image 20240130164825.png