stm32 高级定时器
原文网址:http://jingyan.eeboard.com/article/73847#/prettyPhoto%5Bpp_gal%5D/6/
http://jingyan.eeboard.com/article/73852
STM32的MCU产品自带定时器资源十分丰富,既有专门用于电机控制的高级定时器(TIMER1/TIMER8),又有仅定时用的基本定时器(TIMER6/TIMER7) 和通用定时器(TIMER2/3/4/5/14/15/16/17) ,还有2个看门狗定时器和一个Systick定时器,真是十分强大哈。
这一篇文章就来讲解一下利用高级定时器TIMER1产生6路互补PWM波形输出。第一部分讲解用到的定时器基本内容和定时器库函数介绍;第二部分,讲解6路互补PWM输出的代码实现。
一、PWM和STM32-072RB定时器及库函数内容介绍
脉宽调制(PWM:(Pulse Width Modulation)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。简易理解,就是对输出脉冲高低电平宽度的调制!STM32-072RB MCU 有12个定时器,其中有高级定时器、通用定时器和基本定时器及系统定时器。在这其中,有一个高级定时器TIMER1可以产生7路PWM(CH1/CH2/CH3/CH4/CH1N/CH2N/CH3N), 通用定时器TIMER2/TIMER3可以分别产生4路PWM (CH1/CH2/CH3/CH4),通用定时器TIMER15能产生3路 PWM(CH1/CH2/CH1N),通用定时器TIMER14/TIMER16/TIMER17各能产生1路PWM(CH1),这样,总共能产生 21路PWM。
高级定时器TIMER1专为电机控制而生,可以产生3对6路互补PWM输出,还带有死区时间设置和刹车功能。要利用STM32的定时器来产生PWM,需要用到定时器相关的寄存器。这些寄存器在下面内容介绍。对于不同的定时器,所在时钟总线是不同的,高级定时器是APB2时钟总线提供时钟,其它通用定时器是APB1时钟总线提供时钟。
STM32的定时器主要参数跟下面三个定时器有关,学习前要先看一下
TIMx_CCMRx 寄存器:选择PWM模式
TIMx_ARR 寄存器: PWM的周期
TIMx_CCRx 寄存器: PWM占空比
下面看一下定时器详细库函数资源介绍:
1、定时器结构体成员变量
产生PWM,要用到三个结构体,分别是
TIM_TimeBaseInitTypeDef基本定时结构体
TIM_OCInitTypeDef输出比较结构体
TIM_BDTRInitTypeDef刹车和死区配置结构体
利用三个库函数来实现将结构体赋值到STM32内部寄存器中
TIM_TimeBaseInit (); TIM_OCInit () TIM_BDTRConfig()
下面分别看一下三个结构体的定义:
这三个结构体具体内容看一下stm32f0xx_tim.h文件。下面看一下几个常用的定时器库函数
TIM_OCxPreloadConfig ();
TIM_ARRPreloadConfig ();
TIM_Cmd();
TIM_CtrlPWMOutputs();
TIM _ITConfig ();
TIM_ARRPreloadConfig ();
TIM_ForcedOC1Config ();
TIM_GetITStatus ()
TIM_ClearITPendingBit()
TIM_CCPreloadControl();
TIM_SelectOCxM();
TIM_CCxCmd();
TIM_CCxNCmd();
TIM_GenerateEvent();
通过这些库函数来配置出PWM波形。下面看一下在STM32-NUCLEO-072开发平台上PWM输出引脚的配置。
2、PWM引脚配置
在STM32F072RBT6上采用了TIMER1高级定时器的3对6路引脚(CH1/CH1N,CH2/CH2N,CH3/CH3N)分别是PA8/PA9/PA10 和/PB13/PB14/PB15
在硬件上是这样:
下面看一下具体的代码实现。
二、Keil-mdk工程文件及代码实现
1、Keil-mdk工程模板中加入PWM.C文件,在includes.h文件中加入PWM.H头文件
2、在PWM.H头文件实现宏定义
3、6路PWM引脚端口初始化PWM_GPIO_Init()代码实现
4、高级定时器初始化Timer1_Init()代码实现
这个就是对定时器三个结构体的配置,这里采用了简单的公式,实现PWM周期和占空比的设置。这里显示是8KHZ,三路占空比30%,40%和50%。
这个就是对端口和三个定时器相关结构体的配置。
5、主函数代码main.c代码实现
在main.c里面加入定时器初始化代码,上电复位后,就可以输出6路PWM波形了。下面的图片是利用示波器的数字通道采集的波形图。
BLDC又称直流永磁电机,或永磁同步电机,采用电机控制器通过电子控制分配方式实现换向!直流无刷电机广泛应用于汽车、工具、工业工控、自动化以及航空 航天等行业!目前BLDC电机应用十分广泛,采用MCU输出6路PWM波形控制三相H桥电路驱动BLDC是一种十分重要的技术应用。在带HALL的BLDC中,常根据HALL值的变化,采用六步换向法来驱动三相H桥。这里面最常用的PWM控制方式就是H-PWM, L-ON的方式,也就是上桥臂MOS管上输出PWM,下桥臂MOS管保持常ON的方式。这一篇文章就来讲解一下H-PWM-L-ON驱动方式下的6路PWM波形输出,如有对BLDC驱动感兴趣,可以基于STM32-NUCLEO-072RB开发平台做一个扩展板,上面加载三相H桥电路和反馈电路进行深入测试。第一部分内容讲解一下带HALL的BLDC换向表分析。第二部分内容讲解一下代码实现。
一、带HALL的BLDC换向表分析
在带HALL的BLDC中,一般是由霍尔传感器测量转子的位置,然后由其输出的3位二进制编码去控制逆变器中6个功率管的导通实现换相。
下图是一个HALL传感器在电机转动一周的情况下输出值:
HALLA/B/C输出的值并不是安装顺序排列,而是安装0x05、0x04、0x06、0x02、0x03、0x01的方式出现。如果采集到的HALL值是反向顺序,则说明电机是反向转动了。
下面是利用示波器采集到的BLDC的HALL值输出:
下面是常用的三相H桥逆变电路:
根据六步换向原则,每步三个绕组中一个绕组流入电流,一个绕组流出电流,一个绕组不导通。确定通电顺序如下:
1.A+C-2.C+B-3.A+B-4.B+A-5. B+C-6.C+A-
每步磁场旋转60°,每6步磁场旋转一周,每步仅一个绕组被换相。
这样,在电机正转情况下,根据HALL值来确定的导通相和驱动管导通情况如下:
要想实现在HALL值出现时的驱动管导通相,6路PWM引脚必须提前一相配置下一个导通相的状态,并将参数存储在定时器的影子寄存器中,通过COM事件的产生,同步更新定时器各个PWM引脚的配置。下面是针对定时器要实现的预配置通道及导通相配置。
在设置参数中,要利用到STM32的COM事件:
COM事件是专门为电机控制用的,它只出现在高级定时器中!“当在一个通道上需要互补输出时,预装载位有OCxM、CCxE和CCxNE。在发生COM换相事件时,这些预装载位被传送到影子寄存器。这样你就可以预先设置好下一步骤配置,并在同一个时刻同时修改所有通道的配置。COM可以通过设置TIMx_EGR寄存器的COM位由软件产生,或在TRGI上升沿由硬件产生。” COM事件的触发有两种方式,一种是软件触发:利用库函数实现;另一种是硬件触发:利用STM32 定时器霍尔接口实现,由霍尔值改变来产生上升沿触发
下面讲解一下具体的软件实现过程。
二、Keil-mdk工程文件及代码实现
1、Keil-mdk工程模板中加入PWM.C文件,在includes.h文件中加入PWM.H头文件
2、在PWM.H头文件增加宏定义 --霍尔传感器引脚PC6/PC7/PC8
3、霍尔传感器接口 HALL_GPIO_Init()函数代码实现
霍尔传感器电路是一种OC门电路,需要增加上拉电阻才能有输出,在配置引脚端口时,可以内部不增加上拉,浮空即可。
霍尔传感器电路结构和霍尔接口电路
4、高级定时器初始化Timer1_Init()代码实现
配置好定时器,初始化是配置在定时模式,不能输出PWM,否则有容易引起MOS管短路的风险。
5、换向函数实现:BLDC_Hall_Convet()
这个是根据HALL值来进行换向,因为没用硬件H桥电路,这里仅是手动转动电机实现换向,所以COM事件通过软件来产生。
其他霍尔值的配置类似。
6、中断复位函数实现:
在COM事件中断中,进行换向判定:
7、主函数代码main.c代码实现
在main.c里面初始化定时器配置后,就要对电机HALL值进行判断,然后设置不同的PWM输出。
打印输出的HALL值:
实际输出的H-PWM-L-ON波形与STM32技术参考手册波形是一致的
stm32 高级定时器相关推荐
- stm32高级定时器 基础知识
stm32高级定时器 高级定时器时基单元: 包含一个16位自动重装载寄存器 ARR 一个16位的计数器CNT,可向上/下计数 一个16位可编程预分频器PSC,预分频器时钟源有多种可选,有内部的时钟.外 ...
- STM32———高级定时器的死区时间计算方法
STM32---高级定时器的死区时间计算方法 1.定时器的时钟分频因子和预分频系数的区别: 1.1 时钟分频因子(Clock division),决定定时器的工作时钟频率. tDTS=fDTS ; t ...
- STM32 高级定时器周期、频率、占空比、对外输出电压详解
STM32 高级定时器 最近在研究电机,对TIM定时器研究了一些,将一些存在疑惑的问题,通过试验和示波器分析,得到以下结论,供大家学习参考 1.介绍输出电压高低判断 输出比较时:OC1对外输出电压为示 ...
- stm32 高级定时器产生PWM
用stm32的高级定时器TIM1和TIM8产生PWM,需要注意: 1.都有TIM1,但只有flash容量大于256K的大容量单片机才有TIM8 2.高级定时器相对于通用定时器,多了TIM_CtrlPW ...
- 基于STM32高级定时器的全桥移相PWM发波方案
关注.星标公众号,不错过精彩内容 来源:STM32单片机 用于移相控制的全桥PWM变换器是中大功率DC-DC变换电路中最常用的电路之一,由于其可以实现开关管的软开关特性,在数字电源的设计中被广泛采用, ...
- STM32高级定时器TIM1生成互补PWM
硬件:stm32f103zet6 开发工具:Keil uVision V5.26.2.0 下载调试工具:J-Link 最近在研究三相无刷电机FOC控制,肯定要对互补PWM了解透彻.记录一下学习过程. ...
- STM32高级定时器TIM1中断的细节配置
在学习stm32的过程中,了解到定时器是非常核心且实用的一个模块,而定时器的中断更是应用的十分广泛,在学习了中断的一些知识后对普通定时器的中断进行了编写,发现都可以成功.将其移植到高级定时器当中,然而 ...
- 2.[STM32]高级定时器(TIM1TIM8)
STM32F103有两个高级定时器,分别是TIM1和TIM8:高级控制定时器(TIM1和TIM8)由一个16位的自动装载计数器组成,它由一个可编程的预分频器驱动. 适用场合: 测量输入信号的脉冲宽度( ...
- STM32高级定时器TIM1TIM8中断设置提醒
最近要用STM32F103RCT6的TIM8做输入捕获,网上不好找到可以直接搬运的代码,然后就移植TIM2的输入捕获做,然后一直遇到匪夷所思的问题! 出现的问题就是,在主函数进入while循环前配置好 ...
最新文章
- 增加或修改的存储过程
- 谷歌补丁Android官网,谷歌已发布 19年12月 Android 安全补丁
- springcloud- FeginClient 调用统一拦截添加请求头 RequestInterceptor ,被调用服务获取请求头...
- 英语语料库与英文写作
- mysql 数据入库去重_MySQL中去重 distinct 的用法 ,数据库去重distinct
- 求助!mac版cc2017安装错误
- 信息传递与交换是不是计算机网络的功能,计算机网络的主要功能是信息交换和____...
- 从事音视频开发,需要学习哪些知识点?
- 让SVG 自己动起来!SMIL animation动画详解
- Hey AI,请写一首披头士风格的歌给我
- Android创建Excel表格
- 激光SLAM理论与实践(一)--激光SLAM简要介绍
- SNN学习笔记-静息电位和平衡电位的理解
- cloudreve win10 解析域名_利用Cloudreve搭建自有网盘系统
- Ubuntu 18.04安装Adams 2021
- android 截屏函数_android截屏功能实现代码
- Orange Business Services 携手俄罗斯劢龙时装集团打造虚拟试衣间 助其改善全球化生产制造模式...
- 摄影测量学-学习笔记整理
- 【推荐】平安乡村乡镇视频监控云平台社会治安综合管治理系统解决方案合集(共43份,302M)
- 常用加密算法及Java实现