调试STM32的定时器好几天了,也算是对STM32的定时器有了点清楚的认识了。我需要测量4路信号的频率然后通过DMA将信号的频率传输到存储器区域,手册说的很明白每个定时器有4个独立通道。然后我就想能不能将这4路信号都连接到一个定时器的4个通道上去。理论上应该是行的通的。刚开始俺使用的是TIM2的1 2 3通道,TIM4的2通道来进行频率的测量。由于没有频率发生器,所以我用tim3作为信号源,用TIM2,TIM4来进行测量就ok了。
请看一开始的程序,以TIM2的1,3通道为例子:
TIM_ICInitStructure.TIM_ICMode = TIM_ICMode_ICAP; //配置为输入捕获模式
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; //选择通道1
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //输入上升沿捕获
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; // 通道方向选择
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //每次检测到捕获输入就触发一次捕获
TIM_ICInitStructure.TIM_ICFilter = 0x0; //
TIM_ICInit(TIM2, &TIM_ICInitStructure);
TIM_ICInitStructure.TIM_ICMode = TIM_ICMode_ICAP; //配置为输入捕获模式
TIM_ICInitStructure.TIM_Channel = TIM_Channel_3; //选择通道3
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //输入上升沿捕获
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //每次检测到捕获输入就触发一次捕获
TIM_ICInitStructure.TIM_ICFilter = 0x0; //
TIM_ICInit(TIM2, &TIM_ICInitStructure);
这个是输入捕获配置
还需要做的工作就是(参考stm32参考手册的TIM的结构框图):
/* Select the TIM2 Input Trigger: TI2FP2 【输入触发源选择】*/
TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1); //参考TIM结构图选择滤波后的TI1输入作为触发源,触发下面程序的复位
/* Select the slave Mode: Reset Mode */
TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset); //复位模式-选中的触发输入(TRGI)的上升沿初始化计数器,并且产生一个更新线号
/* Enable the Master/Slave Mode */
TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);
//主从模式选择
这样我们就可以很轻松的就得到了 连接在TIM2的通道1上的信号的频率,但是3通道的频率的值永远都是跳动的不准,测试了半天也没有找到根本原因,请看TIM的结构框图的一部分
红色箭头所指,这才找到原因,触发的信号源只有这四种,而通道3上的计数器的值不可能在接受到信号的上升沿时候,有复位这个动作,找到原因了。这就是3通道上的数据不停跳动的原因,要想的到信号的频率也是有办法的,可以取连续两次捕捉的值之差,这个值就是信号的周期,自己根据实际情况去算频率吧。
有以上可以得到:
stm32的TIM的四个通道可以同时配置成输入捕捉模式,但是计算CH3,CH4信号的频率步骤有点繁琐(取前后捕捉的差值),但是他的CH1,和CH2可以轻松得到:
通道1
/* Select the TIM2 Input Trigger: TI2FP2 【输入触发源选择】*/
TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1); //参考TIM结构图选择滤波后的TI1输入作为触发源,触发下面程序的复位
/* Select the slave Mode: Reset Mode */
TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset); //复位模式-选中的触发输入(TRGI)的上升沿初始化计数器,并且产生一个更新线号
TIMx->CRR1的值即为信号的周期
通道2:
TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2); //参考TIM结构图选择滤波后的TI1输入作为触发源,触发下面程序的复位
/* Select the slave Mode: Reset Mode */
TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset); //复位模式-选中的触发输入(TRGI)的上升沿初始化计数器,并且产生一个更新线号
TIMx->CRR2的值即为信号的周期
笔记记得不是太好,还希望对调试这部分的朋友有所帮助!
上一篇:小熊stm32学习总结:stm32f407 GPIO_PinAFConfig 函数
下一篇:关于stm32硬件I2C BUSY锁死的一点说法
推荐阅读最新更新时间:2024-11-16 23:35
设计资源 培训 开发板 精华推荐
- 使用 Diodes Incorporated 的 ZXCP330 的参考设计
- LT1021BCN8-10 具有升压输出电流且无电流限制的电压基准的典型应用
- 使用 Richtek Technology Corporation 的 RT8813A 的参考设计
- DC2070A,使用 LTC5577、300MHz 至 6GHz 高信号电平有源下变频混频器的演示板
- STM32开发版(已验证)
- 【实物已验证】ESP8266及ESP32自动下载调试器_小巧可爱型
- LTC6990HS6#TRMPBF 温度到频率转换器的典型应用。从 -20 oC (fOUT - 20kHz) 到 75 oC (fOUT - 25kHz) 的线性度为 3%
- 用于以太网路由器的 12V DC 到 DC 单路输出电源
- LTC6262HMS SAR ADC 驱动器、运算放大器的典型应用
- LT3020IDD-1.8 100mA、低电压、极低压差线性稳压器的典型应用电路
- 有奖问答 | 富士通铁电随机存储器 FRAM 知多少
- 有奖直播预报名|与英飞凌一同探寻网络摄像机的黑科技
- 有奖直播:英飞凌针对电动工具的高功率、高效率以及高可靠性解决方案
- ST有奖直播 | 75V降压控制器和隔离降压方案
- 直播已结束【基于迈来芯第二代位置传感器优化设计的新一代产品】
- 报名Keysight感恩月,天天抽示波器、直流电源、万用表……
- 有奖直播报名中|基于英飞凌AIROC™ CYW20829低功耗蓝牙芯片的无线组网解决方案
- TE Connectivity 助力下一代测试测量
- CadenceLIVE China 2022中国线上用户大会 报名中!
- 泰克专家邀你了解大数据时代全新解决方案,参与翻盖有礼!