4个输入捕获和输出比较通道,共用4个CCR寄存器
输入捕获和输出比较:
输入捕获 | 输出比较 | |
引脚 | 输入端口 | 输出端口 |
执行 流程 | 接收到输入信号,执行CNT锁存到CCR的动作 | CNT/CCR的大小关系来执行输出动作 |
电路资源分配情况 | 高级、通用定时器基本相同、基本定时器无此功能 |
STM32测频率而言,只能测量数字信号,若想测量正弦波,还需搭建一个信号预处理电路——运放搭建比较器——将正弦波转化为数字信号,输入给STM32;若测量电压非常高,还需考虑隔离问题——利用隔离放大器、电压互感器等元件——隔离高压端和低压端,保证电路的安全。
最终输入给STM32的信号是高电平3.3v,低电平0v的数字信号
频率测量理论知识
测频法实现——对射式红外传感器计次、定时器外部时钟稍加改进
一个通道灵活切换两个引脚、两个通道同时捕获一个引脚——交叉目的
每捕获一次CNT的值,都要把CNT清零一下,以便于下一次的捕获——硬件电路(主从触发)可以在捕获之后自动完成CNT的清零工作。
Q——如何自动清零CNT???
A——从模式完成自动化操作的利器
主从触发模式(老师起名)
- 主模式——将定时器内部信号映射至TRGO引脚
- 从模式——接收其他外设或自身外设的一些信号,用于控制自身定时器的运行,即也就是被别的信号控制
- 触发源选择(从模式的一部分)——选择从模式的触发信号源
2022.10.24
- 预分频器在更新事件重装
- 更新事件生效 ——有缓存器延迟参数的写入事件,等到更新事件结束,再统一改变参数,保证每个周期的完整性
- 预分频器立即重装
- 立即生效——在值改变时,产生切断波形的现象,会出现不完整周期
- instinct——影子寄存器预装载的问题——写入的值是立即生效,还是在更新事件生效
2022.10.27
编写IC.c 文件
- 1.RCC开启时钟,打开GPIO、TIM时钟
- 2.GPIO初始化,把GPIO配置成输入模式,一般选择上拉输入或浮空输入模式
- 3.配置时基单元,让CNT在内部时钟的驱动下自增运行
- 4.配置输入捕获单元——滤波器、极性、直连通道还是交叉通道、分频器这些参数——使用结构体统一配置
- 5.选择从模式的触发源——触发源选择为TI1FP1,这里调用一个库函数,给一个参数即可
- 6.选择触发之后执行的操作——执行RESET操作——这里也是调用一个库函数即可
- 7.以上电路配置好后,调用TIM_Cmd函数,开启定时器
本次代码计划使用TIM3的通道1引脚——PA6(详见引脚定义表)
//-------初始化输入捕获比较单元------------
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInitStructure.TIM_ICFilter = 0XF;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising ;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1 ;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInit(TIM3, &TIM_ICInitStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM_ICInitStructure.TIM_ICFilter = 0XF;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling ;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1 ;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_IndirectTI ;
TIM_ICInit(TIM3, &TIM_ICInitStructure);
ST公司怕我们麻烦:
- //在函数里,会自动把剩下的一个通道初始化成相反的配置
- 例如:通道1 直连 上升沿——on the contrary——通道2 交叉 下降沿
- 局限性——只支持通道1、通道2的配置,不要传入通道3/4
- 上小节分析——高电平计数值存入CCR2里,整个周期的计数值存在CCR1中
- 则占空比 Duty = CCR2 / CCR1
TIM_BaseInitStructure.TIM_Period = 65536 - 1;//周期——ARR自动重装器的值
TIM_BaseInitStructure.TIM_Prescaler = 72 - 1;//PSC预分频器的值
测量频率的上下限问题:
- 测量频率的下限:目前我们给定的标准频率是1MHz,计数器最大记到65535,所以可得所测量的最低频率 = 1M / 65535 = 15Hz,如果信号频率再低,计数器就要溢出了,若想再降低一点最低频率的限制——solution——把预分频PSC再加大一点——致使标准频率就更低,所支持测量的最低频率也就更低。(也是测量频率的下限)
- 测量频率的上限——测量的最大频率——随着待测频率的增大,误差也会逐渐增大,若非要找一个频率上限——标准频率1MHz,超过1MHz,信号频率 > 标准频率,肯定测不了。(无意义——因为信号频率接近1MHz时,误差已经非常大了)
- 最大频率要看你对误差的要求,正负1误差——1 / 计数值
- 例如计100个数,误差一个,相对误差即就是百分之一。计1000个数,误差一个,相对误差即就是千分之一。
- 若要求误差为千分之一,频率上限为——1M /1000 = 1KHz
- 若要求误差为百分之一,频率上限为——1M /100 = 10KHz
若想提高频率上限——solution——把预分频器值PSC给降低一点,提高标准频率,即上限就会提高。若还要提高频率,则考虑测频法,测频法适合高频,测周法适用于低频。
误差分析——除前面提到的正负1误差外,还有晶振误差(例如STM32的晶振不是那么准,在计数几万次之后,误差积累起来也会造成一些影响。)
数值抖动——滤波处理