PWM(Pulse Width Modulation)意为脉冲宽度调制,简称脉宽调制 。在工控行业,PWM信号可以用来调节电机转速、调节变频器以及BLDC电机驱动等;在LED照明行业,可以通过PWM来控制LED的亮暗变化;还可以通过PWM信号来控制无源蜂鸣器发出简单的声音等。

WB32也可输出PWM,需配置WB32上的定时器。

在WB32中有4个定时器,其中TIM1为高级定时器,TIMx(2-4)为通用定时器,这四个定时器均挂载在APB1总线上,每个定时器都可以同时输出4路PWM。

本章需要使用固件库TIM例程中的 TIM_PWM_Output 工程,以配置TIM1为例讲解如何配置TIM使之产生四路占空比不同的PWM,请大家打开固件库例程对应学习;理解此例程后,亦可配置通用定时器TIMx输出PWM。

9.1 TIM输出PWM配置

本例程中使用TIM1来输出4路PWM,通过查询WB32f10x数据表,可知TIM1通道1到通道4(TIM_CH1-TIM_CH4)依次为PA8、PA9、PA10、PA11。

9.1.1 开启对应端口和功能时钟

void RCC_Configuration(void)
{/*  使能TIM1 GPIOA AFIO 时钟 */RCC_APB1PeriphClockCmd(RCC_APB1Periph_BMX1 | RCC_APB1Periph_TIM1 | RCC_APB1Periph_GPIOA | RCC_APB1Periph_AFIO , ENABLE);
}

9.1.2 初始化端口引脚

void GPIO_Configuration(void)
{GPIO_Init(GPIOA, GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11, GPIO_MODE_AF | GPIO_AF1);
}

注意:
1)将对应引脚作为TIM功能使用时,需要使用引脚复用模式,且需或上GPIO_AF1。(上一章,UART引脚复用模式与上GPIO_AF7)

2)void GPIO_Configuration(void)与void RCC_Configuration(void)属于用户自己编写的函数,在使用时需要将其函数名称放在主函数前进行声明,否则在主函数中调用时可能会报错。

9.1.3 定时器基本结构体配置

  /* 初始化定时器参数 */TIM_TimeBaseStructure.TIM_Period = 0xFFFF;                     //配置定时器周期为0xFFFF,即65535,可设置范围为0x00000~oxFFFFF。//自动重装载寄存器(ARR)的值累计TIM_Period个频率后产生一个更新或中断。TIM_TimeBaseStructure.TIM_Prescaler = 0;                       //配置预分频器为0,可设置范围为0x0000~0xFFFF。             //驱动CNT计数器的时钟CK_CNT = CK_INT /(TIM_Prescaler+1)//例:本例程中 CK_CNT = 72M/(0+1) = 72MTIM_TimeBaseStructure.TIM_ClockDivision = 0;                   //配置时钟分频因子为0,可选择1、2、4分频。配置死区时用到,故此处设置为0。TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;    //配置定时器计数模式为向上计数TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;               //配置重复计数器为0TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);                //初始化定时器基本结构体

格外注意,在这一部分配置当中,部分成员配置关乎输出PWM的两个重要特征:周期和频率。

1)周期T = arr* (1/CK_CNT)
根据公式。本例程中PWM周期 T = 65535*(1/72M)= 910.208us

2)频率f = CK_INT/[(arr+1)(psc+1)]
根据公式。本例程中PWM频率 f = 72M / [(65535+1)
(0+1) ] = 1098.6Hz 约等于1.1KHz

注意:
1)在上述两个公式当中,arr 等于定时器基本结构体中成员TIM_Period的值。psc等于定时器基本结构体中成员TIM_Prescaler的值。

2)CK_INT和CK_CNT的关系大家可以在代码注释中找到,其中CK_INT为系统内部时钟,默认为72M。
想要深入了解CK_INT和CK_CNT的关系可以在WB32参考手册中第十六章高级控制定时器中的高级控制定时器框图中找到。

3)上述算得的PWM周期与频率可使用示波器验证,后续实验可依自己的需求,按照上述公式进行配置。

9.1.4 定时器输出比较结构体配置

  /* PWM1 模式设置: 通道1 */TIM_OCInitStructure.TIM_OCMode      = TIM_OCMode_PWM1;           //比较输出模式选择为PWM1TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;    //比较输出使能TIM_OCInitStructure.TIM_Pulse       = CCR1_Val;                  //脉冲宽度设置为CCR1_Val。此处决定着PWM的占空比。TIM_OCInitStructure.TIM_OCPolarity  = TIM_OCPolarity_High;       //配置比较输出极性为高电平有效。它决定着定时器通道的有效电平。TIM_OC1Init(TIM1, &TIM_OCInitStructure);                         //TIM通道1输出比较结构体初始化TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);                //TIM通道1输出比较预加载设置/* PWM1 模式设置: 通道2 */TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;    //比较输出使能TIM_OCInitStructure.TIM_Pulse       = CCR2_Val;                  //脉冲宽度设置为CCR2_Val。TIM_OC2Init(TIM1, &TIM_OCInitStructure);                         //TIM通道2输出比较结构体初始化TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);                //TIM通道2输出比较预加载设置

准确的说,想要输出PWM,就必须使用到TIM的输出比较功能(Output Compare),在配置输出比较结构体中的成员时,还涉及到PWM第三个重要参数:占空比。

占空比 = CCRx_Val / arr
例:本例中,
TIM1_CH1的占空比 = CCR1_Val / arr = 0x7FFF / 0xFFFF = 32767 / 65535 = 0.4999 约为50%
TIM1_CH2的占空比 = CCR2_Val / arr = 0x3FFF / 0xFFFF = 16383 / 65535 = 0.2499 约为25%

注意:
1)CCRx_Val中,x可取(1、2、3、4),此部分通过宏定义取值,可以在main.c中第13行处找到。

2)本处仅展示TIM通道1与TIM通道2的配置代码,可以注意到,相较于配置TIM通道1输出PWM的代码,在配置TIM通道2输出PWM的代码时少了比较输出模式和比较输出极性的配置。

这是因为在结构体配置中,某些代码配置后其他代码也可共享此配置;但是建议新手在使用结构体时不要简化,还是按照配置配置TIM通道1一样配置其他通道。

3)结合定时器基础结构体配置,重点理解占空比的计算方法。自己测算出TIM通道3与TIM通道4的占空比,并通过示波器验证。

9.1.5 使能输出PWM配置

  TIM_ARRPreloadConfig(TIM1, ENABLE);     //使能TIM1预加载ARRTIM_Cmd(TIM1, ENABLE);                  //使能TIM1计数器TIM_CtrlPWMOutputs(TIM1, ENABLE);       //主输出使能。当使用的是定时器功能时不需要此句。

9.2 实验现象

观察主函数部分,除去TIM配置函数。仅有: while (1) { }

将程序编译后烧录到开发板上,将示波器探头夹夹住开发板GND,此时我们可直接使用示波器来检测对应通道:

首先看TIM1通道1,用示波器探头的探针勾住PA8后,可看到PWM波形和信息如下:

再看TIM1通道2,用示波器探头的探针勾住PA9后,可看到PWM波形和信息如下:

注意:
1)请观察图片中TIM1通道1与TIM1通道2的波形信息是否对应例程代码的设置。
2)如果预算值与结果有误差,那么问题出在哪里?
2)请简单了解并学会使用示波器,示波器是我们在使用WB32进行电子设计时必不可少的工具。

【WB32库开发】第9章 TIM1高级定时器——输出多路PWM相关推荐

  1. 【WB32库开发】第10章 TIM1高级定时器——PWM互补输出

    在上一章的输出多路PWM的基础上,本章主要讲述如何配置WB32上的高级定时器TIM1完成PWM互补输出. 对PWM互补输出的概括放到10.3节中,请大家先跟随10.1节了解PWM互补输出如何配置,再结 ...

  2. 第十五章 TIM高级定时器(下)

    目录 14.6 使用高级定时器实现精确计时 14.6.1 实验要求 14.6.2 软件设计 14.6.3 下载验证 14.7 TIM高级定时器PWM波互补输出 14.7.1 PWM波是什么 14.7. ...

  3. STM32 TIM1高级定时器RCR重复计数器的理解

    STM32 TIM1高级定时器RCR重复计数器的理解 TIMx_RCR重复计数器寄存器,重复计数器只支持高级定时器TIM1和TIM8,下面看标准外设库的TIM结构体的封装: typedef struc ...

  4. STM32复习笔记(十八) —— 高级定时器(输出比较)

    STM32复习笔记(十八) -- 高级定时器(输出比较) 1.配置步骤 1)选择计数器时钟 (内部,外部,预分频器) 2)将相应的数据写入TIMx_ARR and TIMx_CCRx寄存器中 3)可设 ...

  5. 【WB32库开发】第12章(上)TIM1高级定时器——PWM输入捕获

    本章要学习的PWM输入捕获是定时器又一重要应用,使用PWM输入捕获可以测量输入PWM的频率和占空比. PWM输入只能使用定时器的两个通道:通道1和通道2,且一路PWM输入要占用两个捕获寄存器,一个用于 ...

  6. STM32之TIM1高级定时器

    定时器应用之PWM输出 1.1 TIM1_CH1N 与 TIM1_CH1 的区别 在刚准备使用定时器的时候,我看了下原理图,发现对于定时器1,它的每一个输出通道都是成对的,即TIM1_CH1N与TIM ...

  7. HAL库学习之高级定时器输出PWM

    1.PWM原理(Pulse Width Modulation) TIM1&TIM8高级定时器可以输出7路PWM ARR:自动重装载值:CCRX:比较寄存器的设定值 原理:通过定时器不断技计数, ...

  8. GD32F303高级定时器输出互补PWM-开发笔记

    GD32F303高级定时器timer0输出3组互补PWM 主要特性 ◼ 总通道数:4: ◼ 计数器宽度:16位: ◼ 时钟源可选:内部时钟,内部触发,外部输入,外部触发: ◼ 多种计数模式:向上计数, ...

  9. Unix/Linux下的Curses库开发指南——第一章 Curses库开发简介

    1.1什么是curses curses实际上是一个函数开发包,专门用来进行UNIX下终端环境下的屏幕界面处理以及I/O处理.通过这些函数库,C和C++程序就可以控制终端的视频显示以及输入输出.使用cu ...

最新文章

  1. Scrapy基础(一) ------学习Scrapy之前所要了解的
  2. Database之SQLSever:SQLSever数据库管理(GUI法/SQL语句命令法两种方法实现备份(完整备份、差异备份、日志备份)、还原、删除、修改数据库等案例)之详细攻略
  3. spring boot参数为日期的查询
  4. python单例_python 单例模式
  5. vue操作,显示数据
  6. 输出注册信息javabean
  7. c语言 常量字符串数组,C语言常量以及字符串数组
  8. boa linux arm修改网卡,嵌入式linux架设boa webserver
  9. 作者:张峰(1978-),男,博士,国家海洋信息中心副研究员
  10. Mybatisplus插件
  11. C++ 'dynamic_cast' and Java 'instanceof' 使用对比
  12. IOS开发基础知识--碎片33
  13. 计算机二级公共知识总结,计算机二级公共基础知识考点总结
  14. python中print说法正确的是_python中的print()输出
  15. 图像分类系统之功能实现概要
  16. SQL Server安装教程
  17. 知识竞赛软件已全面取代了传统手工赛场控制方式
  18. 二元线性方程组与二阶行列式
  19. KK集团5年估值200亿,新零售还好做吗?
  20. U盘数据损坏了不要慌,这两种方法可以轻松找回数据

热门文章

  1. 西红柿文案:怎么写西红柿水果的文案,水果西红柿售卖文案
  2. 用TCN取代RNN!李飞飞团队提出口语语音识别新方法
  3. CodeForces 663E - Binary Table
  4. vue中echarts 实现下钻(饼图为例)
  5. win32界面编程(一)
  6. 【华为OD机试真题 JAVA】算法中的常用知识点
  7. 江西化工杂志江西化工杂志社江西化工编辑部2022年第6期目录
  8. win7 万能驱动 win8 万能驱动
  9. 搭配Online:顶尖券商摩根大通成深交所会员,谋求内地业务能力!
  10. 如何选择适合企业的进销存软件