本帖最后由 WSGustin 于 2018-3-6 18:15 编辑
第九章 PWM输出试验这一章,将向大家介绍如何使用 W7500 的PWM 输出。在本章中,将使用 W7500的PWM 通道5,把PC5设置成PWM的通道5,产生 PWM 来控制 RGB LED 的亮度。
本章分为如下几个部分:
9.1 PWM 简介
9.2 硬件设计
9.3 软件设计
9.4 下载验证
9.1 PWM简介脉冲宽度调制(PWM),是英文“Pulse Width Modulation” 的缩写,他是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。 W7500的 PWM 有8个通道,每个通道有一个定时器,每个定时器都是独立运行的。 PWM 有开始/停止寄存器。它控制PWM定时器的开始/停止。一旦设置了此位,定时器开始运行。如果将此位复位,定时器就立即停止。当 PWM 的定时器被停止或暂停时,才可以更新PWM的寄存器,如图9.1.1所示: 图9.1.1 W7500 PWM开始/停止寄存器 重复模式 PWM定时器有两个模式:周期模式和单次触发模式。 在周期模式中,PWM的定时器到达了边界寄存器设定值时就会重新开始计数,如图9.1.3所示,可以看出这里设置的边界寄存器的值为12: 图9.1.3 周期模式 在单次触发模式中,当PWM的定时器到达边界寄存器设定值时,定时器重置为初始值并停止-计数,如图9.1.4所示: 图9.1.4 单次触发模式 预分频寄存器描述 PWM 有 6 位预分频器计数器,可以通过预分频器寄存器来控制它,如图9.1.5所示: 图9.1.5 W7500 PWM预分频寄存器 PWM模式生成的占空比,由边界寄存器设定值和匹配寄存器设定值决定。当定时器开始计数时, PWM 输出就为 1。当定时器达到匹配寄存器值时,PWM 输出变为 0。如果定时器处于周期模式时,定时器达到边界寄存器设定值的时候 PWM 输出会再次变成 1。在单次触发模式中, PWM 输出没有变为 1,而是保持为 0。并且定时器停止了。PWM 模式可以在 PWM 输出及外部输入使能寄存器中进行独立选择。外部输入引脚与 PWM 输出引脚是相同的,所以在 PWM 模式下外部输入是禁用的,如图9.1.6.1和图9.1.6.2所示: 图9.1.6.1 PWM定时器达到匹配寄存器时 图9.1.6.2 PWM定时器达到边界寄存器时 设置PWM时可以根据下面的配置流程图进行配置,如图9.1.7所示: 图9.1.7 PWM配置流程图 这里用PWM的定时器模式来输出。可以调用W7500固件函数库的PWM_TimerModeInit函数来进行初始化: [mw_shl_code=applescript,true]void PWM_TimerModeInit(PWM_CHn_TypeDef* PWM_CHn, PWM_TimerModeInitTypeDef* PWM_TimerModeInitStruct);[/mw_shl_code]这种初始化格式大家学到这里应该也熟悉了,所以直接来看看结构体 TIM_OCInitTypeDef的定义: [mw_shl_code=applescript,true]typedef struct{ uint32_t PWM_CHn_PR;
uint32_t PWM_CHn_MR;
uint32_t PWM_CHn_LR;
uint32_t PWM_CHn_UDMR;
uint32_t PWM_CHn_PDMR;
}PWM_TimerModeInitTypeDef;[/mw_shl_code]这里讲解一下与PWM相关的几个成员变量: 参数PWM_CHn_PR设置预分频寄存器。
参数PWM_CHn_MR设置匹配寄存器。
参数PWM_CHn_LR设置边界寄存器。
参数PWM_CHn_UDMR设置上下模式寄存器,将PWM的计数值设置为递增还是递减。
参数PWM_CHn_PDMR设置周期模式寄存器,当 TC 达到 LR 值时, TC 返回 0 并随后继续定期计数还是TC 返回 0 并随后停止计数。 针对 PWM通道5 初始化范例代码格式: [mw_shl_code=applescript,true]PWM_TimerModeInitStruct.PWM_CHn_PR = 50;
PWM_TimerModeInitStruct.PWM_CHn_MR = 0;
PWM_TimerModeInitStruct.PWM_CHn_LR = 1000;
PWM_TimerModeInitStruct.PWM_CHn_UDMR = PWM_CHn_UDMR_UpCount;
PWM_TimerModeInitStruct.PWM_CHn_PDMR = PWM_CHn_PDMR_Periodic;
PWM_TimerModeInit(PWM_CH5, &PWM_TimerModeInitStruct);
[/mw_shl_code] 完成以上设置之后,需要使能PWM的输出模式。可以调用PWM_CHn_SetPEEER函数。 [mw_shl_code=applescript,true]void PWM_CHn_SetPEEER(PWM_CHn_TypeDef* PWM_CHn, uint32_t PEEER);[/mw_shl_code]
这个函数的第二个传参是用来选择PWM的输出模式的,有三种模式:PWM_CHn_PEEER_Disable(PWM 输出禁止及外部输入禁止);PWM_CHn_PEEER_ExtEnable(PWM 输出禁止及外部输入禁止);PWM_CHn_PEEER_PWMEnable(PWM 输出使能及外部输入禁止),这里使用PWM的输出使能及外部输入禁止模式。 [mw_shl_code=applescript,true]PWM_CHn_SetPEEER(PWM_CH5, PWM_CHn_PEEER_PWMEnable);[/mw_shl_code]
如果要修改PWM输出的占空比就必须停止或暂停PWM的定时器才可更新。 可以调用PWM_CHn_Stop函数来停止PWM的定时器。 [mw_shl_code=applescript,true]void PWM_CHn_Stop(PWM_CHn_TypeDef* PWM_CHn);[/mw_shl_code]
然后调用PWM_CHn_SetMR函数来对PWM的装载值进行设置 [mw_shl_code=applescript,true]void PWM_CHn_SetMR(PWM_CHn_TypeDef* PWM_CHn, uint32_t MR);[/mw_shl_code]前面也有讲过PWM的定时器有开始/停止寄存器,设置完了之后需要开启定时器才能让PWM的定时器跑起来。可以调用PWM_CHn_Start函数来开启定时器。 [mw_shl_code=applescript,true]void PWM_CHn_Start(PWM_CHn_TypeDef* PWM_CHn);[/mw_shl_code]
9.2 硬件设计本实验用到的硬件资源有: 1) RGBLED灯 2) PWM 9.3 软件设计在W7500EVB PWM output中可以看到工程中的 user 下面比以前多了pwm.c 文件和头文件pwm.h。 同时还引入了相关的固件库函数文件 W7500x_pwm.c 和头文件W7500x_pwm.h。 下面来看看我们的pwm.c 里的代码。 [mw_shl_code=applescript,true]void PWM_Init(void)
{
PWM_TimerModeInitTypeDef PWM_TimerModeInitStruct;
PWM_TimerModeInitStruct.PWM_CHn_PR = 50;
PWM_TimerModeInitStruct.PWM_CHn_LR = 1000;
PWM_TimerModeInitStruct.PWM_CHn_UDMR = PWM_CHn_UDMR_UpCount;
PWM_TimerModeInitStruct.PWM_CHn_PDMR = PWM_CHn_PDMR_Periodic;
PWM_TimerModeInit(PWM_CH5, &PWM_TimerModeInitStruct);
PWM_CHn_SetPEEER(PWM_CH5, PWM_CHn_PEEER_PWMEnable);
}
void PWM_Run(uint32_t data)
{
PWM_CHn_Stop(PWM_CH5);
PWM_CHn_SetMR(PWM_CH5, data);
PWM_CHn_Start(PWM_CH5);
}[/mw_shl_code]
9.4 下载验证在完成软件设计之后,将编译好的文件下载到W7500EVB 开发板上,观看其运行结果是否与我们编写的一致。如果没有错误,将看 RGB LED 在由暗变到亮,又从亮变到暗,如图9.4.1所示: 图9.4.1 PWM输出试验结果
|