OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4199|回复: 1

M0+MAC+TCP/IP 以太网单芯片方案 W7500EVB用户手册连载(8)--实战篇

[复制链接]

28

主题

86

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2018-2-23
在线时间
37 小时
发表于 2018-3-6 18:04:11 | 显示全部楼层 |阅读模式
W7500(W7500P)芯片简介:
W7500 芯片为工业级以太网单芯片解决方案, 集成 ARM Cortex-M0,128KB Flash 及全硬件TCP/IP 核(和W5500、W5100内核一致),特别适用于物联网领域。 使用 W7500EVB, 让您轻松完成原型开发。

全硬件TCP/IP核的最大优点是他在执行联网操作时不需要占用MCU的运行资源,大大增加了MCU的工作效率。

这一章,将向大家介绍如何使用 W7500 PWM 输出。在本章中,将使用 W7500PWM 通道5,把PC5设置成PWM的通道5,产生 PWM 来控制 RGB LED 的亮度。

想了解更多关于WIZnet W7500更多信息,或者有技术问题请联系我们:gustin@wisioe.com
深圳炜世科技—WIZnet官方代理商,全程技术支持,价格绝对优势!
电话:0755-86568556
邮箱:support@wisioe.com
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

28

主题

86

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2018-2-23
在线时间
37 小时
 楼主| 发表于 2018-3-6 18:06:28 | 显示全部楼层
本帖最后由 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所示:
1.JPG
图9.1.1 W7500 PWM开始/停止寄存器
重复模式
PWM定时器有两个模式:周期模式和单次触发模式。
在周期模式中,PWM的定时器到达了边界寄存器设定值时就会重新开始计数,如图9.1.3所示,可以看出这里设置的边界寄存器的值为12:
2.JPG
图9.1.3 周期模式
在单次触发模式中,当PWM的定时器到达边界寄存器设定值时,定时器重置为初始值并停止-计数,如图9.1.4所示:
3.JPG
图9.1.4 单次触发模式
预分频寄存器描述
PWM 有 6 位预分频器计数器,可以通过预分频器寄存器来控制它,如图9.1.5所示:
   4.JPG
图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所示:
5.JPG
图9.1.6.1 PWM定时器达到匹配寄存器时
6.JPG
图9.1.6.2 PWM定时器达到边界寄存器时
设置PWM时可以根据下面的配置流程图进行配置,如图9.1.7所示:
7.JPG
图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所示:
8.JPG
图9.4.1 PWM输出试验结果


回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 22:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表