查看: 6363|回复: 0

STM32 NUCLEO中级教程2: 利用高级定时器产生6路互补PWM波形输出

[复制链接]
  • TA的每日心情
    开心
    2018-9-18 06:28
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2014-12-10 16:54:06 | 显示全部楼层 |阅读模式
    分享到:
    STM32的MCU产品自带定时器资源十分丰富,既有专门用于电机控制的高级定时器(TIMER1/TIMER8),又有仅定时用的基本定时器(TIMER6/TIMER7) 和通用定时器(TIMER2/3/4/5/14/15/16/17) ,还有2个看门狗定时器和一个Systick定时器,真是十分强大哈。
    这一篇文章就来讲解一下利用高级定时器TIMER1产生6路互补PWM波形输出。第一部分讲解用到的定时器基本内容和定时器库函数介绍;第二部分,讲解6路互补PWM输出的代码实现。
    一、PWM和STM32-072RB定时器及库函数内容介绍
    脉宽调制(PWMPulse 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波形了。下面的图片是利用示波器的数字通道采集的波形图。




    代码地址链接
    https://www.eeboard.com/bbs/thread-39696-1-1.html
    摩尔吧视频地址链接
    https://www.moore8.com/courses/306
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-18 14:40 , Processed in 0.138204 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.