更改STM32定时器周期后的输出疑问分析

发布者:chaohuangmeitao最新更新时间:2023-10-09 来源: elecfans关键字:STM32  定时器周期  输出 手机看文章 扫描二维码
随时随地手机看文章

他先将STM32某定时器计数周期设为0xff,单向递增计数模式,OC比较值设为0x7F。 在某时刻将新的计数周期0x7F与比较值0x3F加载到影子寄存器。 当正在进行的一个周期结束后,经示波器测量确实可以看到其下一个周期发生变化,但其周期明显与预设值对应不上! 再次经过一个周期,定时器才会按照预设值稳定输出。


以上是咨询者不算很清晰的描述【其实咨询TIMER问题最好配上时序图】,但可以了解到他要做的事情就是在ARR=0xff,ccr=0x7F的PWM输出状态下,于某时刻赋予ARR和CCR新值以改变输出波形。

c9d8147a-efbd-11ed-90ce-dac502259ad0.png

事情不算复杂,疑点就是为什么需要2个周期延时后才能有基于新配置的稳定输出。 【他这里说的2个周期显然不清楚到底指的前后哪个周期值】


这个问题主要涉及到定时器寄存器的预装功能。 有些时候我们需要保证输出波形完整性、连续性,开启ARR及CCR的预装功能就比较合适,使用CubeMx配置时做些勾选即可。 开启预装后,修改ARR及CCR的值,生效时间点最长可能延后1个旧计数周期。 不过这里要注意,我们修改ARR及CCR的值若不是特别需求,建议在一个计数周期内完成修改,不要一个值在更新事件之前完成赋值,另一个则发生在该更新事件之后。


我也将上面提醒告知咨询者,他反馈问题依然没能解决,准确说是疑惑依然没能解除。 他这里的确只是提出疑惑,并未提出具体需求。 另外,他还将问题的复现过程做了如下补充:

第一步:

1 - 关闭预装载(ARR/CCR)

2 - 设定ARR=CCR=0xFF

3 - 开启输出比较功能(连接到示波器查看波形)

第二步:

1 - 设置示波器触发(延迟一段时间拉高某个IO引脚以触发示波器采集)

2 - 立即清空CNT

3 - 使能预装载

4 - 设定ARR=0X7F,CCR=0X3F

现象:本周期结束后其计数周期确实会相应改变,但改变之后的前两个周期明显与设定值不符,即经过2个周期后才可稳定输出。

复现过程表述得比较清晰了,他也再次明确了疑惑点。 同时还强调说网上很多人碰到类似问题或疑惑。 他在STM32L4系列和STM32H7系列上都遇到了同样问题。 既然这样,现在我们使用STM32L4系列的TIM1来进行验证,参照他的操作步骤来组织代码,看看来龙去脉。

我是这样测试验证的。

在关闭ARR/CCR的预装前提下给二者分别赋值0xff和0x7f,启动CH1的PWM输出并使能该通道的输出比较中断。 在第一个脉冲的比较中断里按照咨询者的做法修改ARR/CCR值。 为了便于观察效果,我也开启了更新中断,通过更新中断记录脉冲个数,输出几个脉冲后就将定时器及输出都关闭掉。 【选择PWM模式1,极性为高有效】

编写代码、编译除错后,运行得到如下结果:【黄色波形结尾的4个脉冲是基于新参数的输出。 绿色波形的上升沿指示修改数据的时间点,这里辅助显示下,重点在黄色波形。 】

c9ef27d2-efbd-11ed-90ce-dac502259ad0.png

上面输出波形应该说跟客户反馈的是一致的。 我们来一起看看。

在第一个脉冲的比较中断处,也是第一个脉冲的正中央【红色箭头所指位置】处做参数修改。 修改步骤按照咨询者提供的来实现。

ca0f79b0-efbd-11ed-90ce-dac502259ad0.png

即按照上面的3小步操作【第1小步是咨询者设置示波器的动作,不用理它】。

这里是开启预装功能后才修改ARR/CCR值,这两个新值目前只能暂居预装寄存器,实际起作用的ARR/CCR值仍是之前的0xff和0x7f。 而且,还在此处对计数器做了清零,即从此刻起PWM输出脉冲重头来。 这样从上图红色箭头到蓝色箭头之间的波形依然是基于ARR=0xff,CCR=0x7f参数运行的。 定时器于蓝色箭头所指位置处发生更新事件,新数据【0x7f,0x3f】生效起作用。

显然从修改时刻算起到数据生效 刚好延时1个旧周期,结合到这里,恰好是新周期的2倍。 修改数据后整整花了2个周期的时间才生效就是这么来的。

如果在上面操作步骤的基础上拿掉对计数器清零操作,其它不变,输出结果又不一样了。 见下面截图:

ca26c1d8-efbd-11ed-90ce-dac502259ad0.png

同样,红色箭头所指位置为修改数据的时刻。 由于此时没有对计数器清零,计数器按部就班计数,PWM输出按预定配置输出,继续运行半个旧周期后计数器溢出产生更新事件于蓝色箭头所指位置。 蓝色箭头所指位置以后PWM输出按新参数运行。 不难看出,这次新数据的生效从修改时刻算起仅延时半个旧周期,相当于后续的1个新周期。

这里强调下,我这里测试时选择的刚好是旧周期的中间点,所以延时生效为半个旧周期。 具体应用时的延时跟我们修改参数所选的时间点有关,一般来讲,它最长不会超过1个旧周期,最短极限为0。

当然,如果说我们不关心修改数据前后波形的完整性,直接关闭预装功能也行,或者手动产生更新事件也可以。 总之,我们根据实际应用需求来定。

聊到这里,关于咨询者的疑惑基本解释得差不多了。

或许眼尖的人看到上面第一种操作输出的PWM波形里面有个非常细窄的尖脉冲,它是怎么回事呢? 示波器问题? 非也! 【见下图椭圆形框住的细长线】

ca4dfc26-efbd-11ed-90ce-dac502259ad0.png

此处尖脉冲产生的原因是------

当发生比较中断时我们才去做修改参数动作,在做计数器清零操作前,计数器的值已经大于设置的CCR值【0x7f】,按照当前PWM输出模式及极性选择,输出则变为低电平了。 但是,在中断里我们很快又将计数器值做了个清零,此时计数器值又小于CCR值【0x7f】了。 同样,按照当前PWM配置,输出又变回高电平,最终就产生了这么个一下一上的尖脉冲。 【注:这里涉及PWM输出原理,需要的自行补课。 】


关键字:STM32  定时器周期  输出 引用地址:更改STM32定时器周期后的输出疑问分析

上一篇:以STM32为主控的温度单反馈控制系统全面解析
下一篇:STM32CubeMX输出可调频率与占空比的PWM

推荐阅读最新更新时间:2024-11-08 10:24

利用电流检测放大器AD8210和差动放大器AD8274实现高电压、高精度电流检测和输出电平转换
电流监控功能在电源管理、电磁阀控制和电机控制等许多应用中非常关键。在负载的高端监控电流,就可以实现精确的电流检测和诊断保护,防止对地(GND)短路。 AD8210 等集成器件可提供高电压接口,并能够在分流电阻上进行双向电流监控,从而简化高端电流监控。它具有高共模抑制(CMR)特性和出色的温度性能,可在应用中实现最佳精度。该器件放大经分流电阻流至负载的电流,并提供以地为参考、与负载电流成比例的输出电压。 在采用双电源的应用中,AD8210的输出可以驱动 AD8274等精密、低失真差动放大器,如图1所示。AD8274可提供额外增益,并以所需的输出共模电压为中心实现AD8210输出电平转换,这有利于与使用双电源的其它电路
[电源管理]
利用电流检测放大器AD8210和差动放大器AD8274实现高电压、高精度电流检测和<font color='red'>输出</font>电平转换
STM32入门开发--LED模块实现跑马灯
1、案例描述 利用STM32F103ZE开发板实现控制LED灯实现跑马灯现象。 正在不断学习嵌入式开发中,博客还会持续更新,敬请关注! 2、开发环境 keil 5.14 + Windows 10 + FlyMcu 参考资料:STM32参考手册 3、实现原理 A.根据硬件接口图: 由接口图发现,开发板上面的两个LED分别接在PB5,和PE5接口处。即我们可以操作GPIO口的寄存器从而操作GPIO端口的控制器。 B、初始化(使能)PB,PE端口,查找手册发现端口PB,PE分别由APB2ENR端口的第三位和第六位控制。我们就将该位置1,其他位不变(|=操作) APB2ENR:外设时钟使能寄存器
[单片机]
<font color='red'>STM32</font>入门开发--LED模块实现跑马灯
STM32 RCC配置
固件库 V3.5 IAR /* ---------------------函数实体--------------------------------*/ /******************************************************************************* * 函数名称: RCC_Configuration * 函数功能: 设置系统各部分时钟 * 参数变量: NONE * 全局变量: NONE * 调用函数: * 修改时间: * 版 本: V1.0 * 状 态:调试完成 *************************************************
[单片机]
TI 推出单通道16 位缓冲电压输出DAC
2007 年 12 月 11 日,北京讯 日前,德州仪器宣布推出一款单通道 16 位缓冲电压输出数模转换器 (DAC),该器件具备1 LSB 最大线性度 (INL)、低噪声 (24 nV/rtHz ) 以及快速建立时间 (5.0 uS) 等。DAC8881 具备 5mW 超低功耗,从而为工业过程控制、自动测试设备、数据采集系统以及通信应用提供了一种极具吸引力的可选方案。 DAC8881 能够在 +2.7V 至 +5.5V 的单电源电压范围内工作,并提供单极输出。输出电压建立在选定基准电压的基础之上,电压范围为 1.25V 至 5.5V,因此可用于多种应用。由于采用了可用于偏移的外部运算放大器,该器件还能提供具有二进制互补编码的双极
[新品]
STM32设置为I2C从机
硬件平台:STM32F401 编辑器 : keil 5.18 操作系统:win7 一、I2C协议 在传输数据的时候,SDA线必须在时钟的高电平周期保持稳定,SDA的高或低电平状态只有在SCL 线的时钟信号是低电平时才能改变 。 起始和停止条件   SCL 线是高电平时,SDA 线从高电平向低电平切换,这个情况表示起始条件;   SCL 线是高电平时,SDA 线由低电平向高电平切换,这个情况表示停止条件。 寻址方式(7/10位地址方式)   第一个字节的头7 位组成了从机地址,最低位(LSB)是第8 位,它决定了传输的 普通的和带重复开始条件的7位地址格式方向。第一个字节的最低位是“0”,表示主机会写信息到
[单片机]
STM32 IIC难点易错点
先来点题外话~网上说STM32F103的IIC有瑕疵!就当是有些短板吧,个人觉得,用起来肯定没问题,只是不好用。因为ST公司考虑到专利问题,所以没按飞利浦的标准来。导致STM32的IIC使用起来非常繁杂。下面就讲讲用STM32 IO口模拟IIC的注意问题: IIC总线时序: 进入正题→_→博主就因为没理解好应答,吃了亏。讲一讲IIC的几个重要状态: 1、空闲状态:当IIC总线空闲时,SDA和SCL两条线均为高电平,由于连接到总线上的器件必须是漏级和集电极开路(至于威为什么请读者自己搜索),只要有一个器件任意时刻输出低电平,都将使总线上的信号变低,即各器件的SDA和SCL是线与的关系。由于各器件输出端是漏级开路,故必须通
[单片机]
<font color='red'>STM32</font> IIC难点易错点
STM32入门学习笔记之MPU6050传感器解析实验1
19.1 MPU6050简介 19.1.1 芯片概述 MPU6050是InvenSense公司推出的一款6轴运动处理芯片,内置3轴陀螺仪及3轴速度传感器,内置两组I2C接口,其中一组用于通信,另一组则用于连接外部磁力传感器,采用自带的数字运动处理器DMP(Digital Motion Processor),通过主I2C接口,直接读取完整的9轴融合演算数据。MPU6050检测轴及其检测方向如下图所示。 19.1.2 引脚介绍 MPU6050采用QFN-24封装,端口描述如下表所示。 引脚编号 引脚名称 功能 1 CLKIN 外部参考时钟输入,如果不使用直接接地 2 NC 空引脚 3 NC 空引脚 4 NC 空
[单片机]
<font color='red'>STM32</font>入门学习笔记之MPU6050传感器解析实验1
STM32——高级定时器、通用定时器、基本定时器的区别
TIM1和TIM8定时器的功能包括【增强型】: ● 16位向上、向下、向上/下自动装载 计数器 ● 16位可编程(可以实时修改) 预分频器 ,计数器时钟频率的分频系数为1~65535之间的任意数值 ● 多达4个独立通道: ─ 输入捕获 ─ 输出比较 ─ PWM生成(边缘或中间对齐模式) ─ 单脉冲模式输出 ● 死区时间可编程的互补输出 ● 使用外部信号控制定时器和定时器互联的同步电路 ● 允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器 ● 刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态 ● 如下事件发生时产生中断/DMA: ─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) ─
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved