STM32学习笔记(4) 高级定时器-两路互补的PWM输出(带死区和刹车控制)

发布者:Yuexiang888最新更新时间:2022-06-22 来源: eefocus关键字:STM32  高级定时器  PWM输出  死区  刹车控制 手机看文章 扫描二维码
随时随地手机看文章

1.实验目的

使用高级定时器,输出两路互补的PWM输出,需要有带死区和不带死区两种情况


2.实验效果

图1:不带死区的两路互补的PWM输出

图2 :带死区的两路互补的PWM输出


3.理论部分

3.1时钟源

内部时钟(基本定时器,通用定时器时钟源来自PCLK1,但高级定时器的时钟源来自PCLK2(72M))

实践中几乎无需使用:外部时钟模式1、外部时钟模式2


3.2时基单元

组成:


16bit预分频PSC

16bit计数器CNT


8bit重复计数器RCR(高级定时器独有)


16bit自动重装载寄存器ARR


3.3输入捕获

作用:对输入信号的上升沿/下降沿/双边沿进行捕获,测量输入信号的脉宽,和测量PWM的频率,占空比

原理:当捕捉到信号的跳变沿时,将CNT的值所存到捕获寄存器CCR中,然后把两次的值相减,就可以得到脉宽或者频率。

若脉宽时长超过你定时的时长,那么就溢出,此时我们就需要作额外的处理


PWM输入的情况下,只有CH1,CH2可以同时测量周期和占空比,因为只有TI1FP1,TI2FP2可以触发从模式控制器。选谁作从模式控制器的触发测量的就是周期,剩下的一个寄存器就测量占空比。但是单纯测量PWM的一个周期或占空比,可用四路

4.程序流程

4.1GPIO初始化结构体

输出PWM需用复用推挽输出(GPIO_AF_PP)


   1、浮空输入GPIO_IN_FLOATING ——浮空输入,可以做KEY识别,RX1

   2、带上拉输入GPIO_IPU——IO内部上拉电阻输入

   3、带下拉输入GPIO_IPD—— IO内部下拉电阻输入

   4、模拟输入GPIO_AIN ——应用ADC模拟输入,或者低功耗下省电

   5、开漏输出GPIO_OUT_OD ——IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。

   当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为

   低电平或不变。可以读IO输入电平变化,实现C51的IO双向功能

   6、推挽输出GPIO_OUT_PP ——IO输出0-接GND, IO输出1 -接VCC,读输入值是未知的

   7、复用功能的推挽输出GPIO_AF_PP ——片内外设功能(I2C的SCL,SDA)

   8、复用功能的开漏输出GPIO_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS)


4.2时基初始化结构体

typedef struct

{

  uint16_t TIM_Prescaler;         //预分频器

  uint16_t TIM_CounterMode;       //定时器的计数方式

  uint16_t TIM_Period;            //定时器的周期

  uint16_t TIM_ClockDivision;     //时钟分频因子

  uint8_t TIM_RepetitionCounter;  //配置重复计数器,仅高级定时器需要

} TIM_TimeBaseInitTypeDef; 

 定时器的计数方式


向上计数(基本定时器仅有这一种)、向下计数、中心对齐计数


DIR=0,向上计数


DIR=1,向下计数


配置中心对齐需CMS和DIR寄存器配合使用


4.3输出比较结构体

typedef struct

{

  uint16_t TIM_OCMode;        //比较输出模式选择

  uint16_t TIM_OutputState;   //比较输出使能

  uint16_t TIM_OutputNState;  //比较互补输出使能

  uint16_t TIM_Pulse;         //脉冲宽度

  uint16_t TIM_OCPolarity;    //输出极性

  uint16_t TIM_OCNPolarity;  //互补输出极性

  uint16_t TIM_OCIdleState;   //空闲状态下比较输出状态

  uint16_t TIM_OCNIdleState;  //空闲状态下比较互补输出状态

} TIM_OCInitTypeDef;

1.比较输出模式选择,总共有八种,常用的为 PWM1/PWM2。它设定CCMRx 寄存器 OCxM[2:0]位的值。


2.比较输出使能,决定最终的输出比较信号 OCx 是否通过外部引脚输出。它设定 TIMx_CCER 寄存器 CCxE/CCxNE 位的值。


3.TIM_OutputNState:比较互补输出使能,决定 OCx 的互补信号 OCxN 是否通过外部引脚输出。它设定 CCER 寄存器 CCxNE 位的值。


4.比较输出脉冲宽度,实际设定比较寄存器 CCR 的值,决定脉冲宽度。可设置范围为 0 至 65535。设置脉冲即可设置占空比


5.比较输出极性,可选 OCx 为高电平有效或低电平有效。它决定着定时器通道有效电平。它设定 CCER 寄存器的 CCxP 位的值。可设置占空比由高电平决定


6.比较互补输出极性,可选 OCxN 为高电平有效或低电平有效。它设定 TIMx_CCER 寄存器的 CCxNP 位的值。


7.空闲状态时通道输出电平设置,可选输出 1 或输出 0,即在空闲状态(BDTR_MOE 位为 0)时,经过死区时间后定时器通道输出高电平或低电平。它设定CR2 寄存器的 OISx 位的值。


8.空闲状态时互补通道输出电平设置,可选输出 1 或输出 0,即在空闲状态(BDTR_MOE 位为 0)时,经过死区时间后定时器互补通道输出高电平或低电平,设定值必须与 TIM_OCIdleState 相反。它设定是 CR2 寄存器的 OISxN 位的值。


4.4刹车和死区结构体的初始化

static void AdvancedTIM_BDTR_Init()

{

  TIM_BDTRInitTypeDef TIM_BDTRInitStructure;

  

  TIM_BDTRInitStructure.TIM_OSSIState=TIM_OSSIState_Enable;//空闲模式下的关闭状态选择

  TIM_BDTRInitStructure.TIM_OSSRState=TIM_OSSRState_Enable;//运行模式下的关闭状态选择

  TIM_BDTRInitStructure.TIM_LOCKLevel=TIM_LOCKLevel_1;//锁存配置

 

  TIM_BDTRInitStructure.TIM_DeadTime=11;//死区时间

  TIM_BDTRInitStructure.TIM_Break=TIM_Break_Enable;//断路输入使能控制

 

  TIM_BDTRInitStructure.TIM_BreakPolarity=TIM_BreakPolarity_High;//断路输入极性

  TIM_BDTRInitStructure.TIM_AutomaticOutput=TIM_AutomaticOutput_Enable;//自动输出极性

  TIM_BDTRConfig(Advanced_TIM,&TIM_BDTRInitStructure);

}


死区时间的计算可以看看博客,讲解的也是非常详细的,对此不再赘述


这个结构体,你只需关心 TIM_BDTRInitStructure.TIM_DeadTime=11 即可

关键字:STM32  高级定时器  PWM输出  死区  刹车控制 引用地址:STM32学习笔记(4) 高级定时器-两路互补的PWM输出(带死区和刹车控制)

上一篇:STM32学习笔记(5) 串口通讯-接收与发送
下一篇:STM32学习笔记(3) TIM基本定时器

推荐阅读最新更新时间:2024-11-13 10:40

STM32 BootLoader跳转APP跑飞 可能是因为找不到某些中断函数入口
在做嵌入式产品时,有时为方便更新设备程序(如远程更新或者只更新模块程序等原因),就要用到bootloader对设备进行必要的初始化,引导下载APP等。 STM官网下载的bootloader程序中并没有用到定时器等,很可能遇不到下面的问题。但是小猿猴如我等,会迫不及待的对其进行“魔改”,再经过二手三手,再加上运气不好,下面的问题就很容易暴露出来了: 现象: bootloader 下载并跳转某些 app 程序时,app运行正常; 对于某些app来说,却根本跑不起来; app本身运行没有问题; bootlaoder+app运行,J-Link在线仿真时,发现报硬件错误; 原因之一: bootloader 中开启了某些中断(并编写了中断
[单片机]
一种基于STM32的心电采集仪设计方案
如今,心血管类疾病已经成为威胁人类身体健康的重要疾病之一,而清晰有效的心电图为诊断这类疾病提供了依据,心电采集电路是心电采集仪的关键部分,心电信号属于微弱信号,其频率范围在0.03~100 Hz之间,幅度在0~5 mV之间,同时心电信号还掺杂有大量的干扰信号,因此,设计良好的滤波电路和选择合适的控制器是得到有效心电信号的关键。基于此,本文设计了以STM32为控制核心,AD620和OP07为模拟前端的心电采集仪,本设计简单实用,噪声干扰得到了有效抑制。   1 总体设计方案   心电采集包括模拟采集和数字处理两部分,本设计通过AgCl电极和三导联线心电采集线采集人体心电信号,通过前置放大电路,带通滤波电路,50 Hz双T陷波后
[单片机]
一种基于<font color='red'>STM32</font>的心电采集仪设计方案
STM32基于固件库学习笔记(11)RTC实时时钟
实时时钟(RTC) 小容量产品是指闪存存储器容量在16K至32K字节之间的STM32F101xx、STM32F102xx和STM32F103xx微控制器。 中容量产品是指闪存存储器容量在64K至128K字节之间的STM32F101xx、STM32F102xx和STM32F103xx微控制器。 大容量产品是指闪存存储器容量在256K至512K字节之间的STM32F101xx和STM32F103xx微控制器。 互联型产品是指STM32F105xx和STM32F107xx微控制器。 主要特性 ● 可编程的预分频系数:分频系数最高为20 。 ● 32位的可编程计数器,可用于较长时间段的测量。 ● 2个分离的时钟:用于APB1接口的PC
[单片机]
stm32boot0boot1的启动方式
STM32 三种启动模式对应的存储介质君是芯片内置的,它们是: 1.用户闪存 =芯片内置的Flash 2.SRAM=芯片内置的RAM区,就是内存了。 3.系统存储器=芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段bootloader,就是同事的ISP升级程序,这个 区域的内容在芯片出现后没偶人能够修改或拆除,即它是一个ROM; 在每个STM32 的芯片上都有两个管脚BOOT0和BOOT1,这两个管脚在芯片复位时电平状态决定了芯片复位后从哪个区域开始执行程序, BOOT1=X BOOT0=0 从用户闪存(flash)启动,这时正常模式 较多情况下使用这种模式 BOOT1=1 BOOT0=1 从内置SRAM(内存
[单片机]
stm32常见错误分析
1.warning: #550-D: variable d was set but never used 描述:变量'd'定义但从未使用,或者是,虽然这个变量你使用了,但编译器认为变量d所在的语句没有意义,编译器把它优化了. 解决:仔细衡量所定义的变量d是否有用,若是认定变量d所在语句有意义,那么尝试用volatile关键字修饰变量d,若是真的没有用,那么删除掉以释放可能的内存. 2.warning: #1-D: last line of file ends without a newline 描述:文件最后一行不是新的一行.编译器要求程序文件的最后一行必须是空行,想了半天没想通为什么要这样. 解决:可以不理会.若
[单片机]
STM32 (3) GPIO口功能讲解 GPIO 口输入输出 寄存器配置
讲解GPIO操作原理,使用各种型号的STM32 打开官方的《STM32中文参考手册》8.1 8.2小节 GPIO功能描述 我们今天重点要分析的是下图 上图是100脚的STM32单片机 1. GPIO是包含引脚的 2. 如何找GPIO功能: 看数据手册 在第3章 我们要看GPIO口的功能就看这里 在这个表里面我们就能够查找到每一个GPIO口的功能 接下来我们要重点 这里分成7个部分 1.引脚进来有两个保护二极管 作用:IO口电流输入高于3.3v时,上流 (保护芯片)但是 如果输入电压大于VDD很多的话 单片机还是会烧坏 举个例子: IO口直接接电机的时候 电机启动的时候会有反相电动势 会有过冲
[单片机]
<font color='red'>STM32</font> (3) GPIO口功能讲解 GPIO 口输入<font color='red'>输出</font> 寄存器配置
STM32原子哥的故事
提到广州星翼电子,STM32圈中的人可能会觉得陌生,但是提到正点原子和《原子教你玩stm32》,所有接触过STM32或者Arm MCU的爱好者几乎都知道。近日广州星翼电子技术总监原子哥作为意法半导体战略合作伙伴,和意法半导体中国区微控制器事业部市场及应用总监曹锦东共同接受了媒体采访。 正点原子的故事就此展开。 正点原子的介绍 原子哥本名刘军,是正点原子(广州星翼电子)的技术总监。 从公司简介中我们可以看到,广州市星翼电子是一家从事嵌入式开发平台、IOT物联网、四轴飞行器、仪器仪表和企业服务等软硬件研发、销售一体化的国家高新技术企业。公司成立于2012年,是国内知名度极高的嵌入式开发平台供应商,产品远销东南亚欧美各国,国内数百家
[单片机]
<font color='red'>STM32</font>原子哥的故事
判断STM32 GPIO输入口的输入状态(高电平或低电平)
在学习STM32中的过程中,经常会遇到“高电平有效”,“低电平有效”等字眼,初看时很多时候就会从字面上理解,认为高电平有效的意思就是有效电平是高电平,低电平有效的意思就是有效电平是低电平的意思。而实际上,这样的理解是有误的。下面咱们以STM32的定时器中输出比较通道为例: 这幅图实际上就是一个pwm波产生的过程,对定时器不了解的可以去查阅相关手册,现在我们先看图中标号1的输出模式控制器,这里模式是指pwm模式,他的意思就是可以通过配置寄存器TIMx_CCMR1的OC1M两位,来选择pwm的模式,但是关于模式选择,手册中有这样一句话:在向下计数时,一旦TIMx_CNT TIMx_CCR1时通道1为无效电平(OC1REF=0),
[单片机]
判断<font color='red'>STM32</font> GPIO输入口的输入状态(高电平或低电平)
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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