介绍

  • 芯片:TM4C123H6PM

  • 说明:TM4C123H6PM微控制器包含两个PWM模块(PWM Model,PWM0和PWM1),每个PWM模块中又有四个PWM发生器模块(PWMGenerator0~3)和一个控制模块,每个发生器模块又对应两个PWM输出(PWM Output),每个输出都有其对应的输出引脚,这些引脚许多都有复用,具体使用时需要设置为PWM输出模式。一个发生器模块有两个输出,意味着对同一个发生器模块的两个输出来说,PWM频率(计数器的重装载值)是相同的,但占空比可以是不同的。

  • PWM有两种计数模式Count-Down和Count-Up/Down

  • 各寄存器的偏移地址在用户手册PWM中的Register Map中有表格,其中PWM0的基地址为0x4002.8000,PWM1的基地址为0x4002.9000。

    PWMCTL 控制模块的寄存器,包含更新模式的位和字段等

    PWMSYNC PWM 时基同步

    PWMENABLE PWM输出使能

    PWMnLOAD 存放Load重载值

    PWMnCMPA 发生器寄存器 存放匹配(比较)值A

    PWMnCMPB 存放匹配(比较)值B

    PWMnINTEN PWM的中断和触发使能

PWM脉冲宽度调制程序实例-三色循环呼吸灯

#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_gpio.h"
#include "driverlib/sysctl.h"
#include "driverlib/rom.h"
#include "driverlib/gpio.h"
#include "driverlib/pwm.h"
#include "driverlib/fpu.h"
#include "driverlib/pin_map.h"int main (void)
{uint32_t R = 0;uint32_t B = 0;uint32_t G = 0;//设置系统时钟为50MHzSysCtlClockSet(SYSCTL_SYSDIV_1 |SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);SysCtlPWMClockSet(SYSCTL_PWMDIV_1);// PWM时钟配置:不分频//使能SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM1);//配置PWM功能GPIOPinConfigure(GPIO_PF1_M1PWM5);GPIOPinConfigure(GPIO_PF2_M1PWM6);GPIOPinConfigure(GPIO_PF3_M1PWM7);GPIOPinTypePWM(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);//配置PWM发生器PWMGenConfigure(PWM1_BASE,PWM_GEN_2,PWM_GEN_MODE_UP_DOWN|PWM_GEN_MODE_NO_SYNC);PWMGenConfigure(PWM1_BASE,PWM_GEN_3,PWM_GEN_MODE_UP_DOWN|PWM_GEN_MODE_NO_SYNC);//设置PWM发生器的周期 loadPWMGenPeriodSet(PWM1_BASE, PWM_GEN_2, 640);PWMGenPeriodSet(PWM1_BASE, PWM_GEN_3, 640);//设置输出的脉冲宽度PWMPulseWidthSet(PWM1_BASE, PWM_OUT_5, R);PWMPulseWidthSet(PWM1_BASE, PWM_OUT_6, B);PWMPulseWidthSet(PWM1_BASE, PWM_OUT_7, G);//使能PWM发生器PWMGenEnable(PWM1_BASE, PWM_GEN_2);PWMGenEnable(PWM1_BASE, PWM_GEN_3);//使能输出PWMOutputState(PWM1_BASE, PWM_OUT_5_BIT | PWM_OUT_6_BIT | PWM_OUT_7_BIT, true);while(1){while(R != 600){R++;PWMPulseWidthSet(PWM1_BASE, PWM_OUT_5, R);SysCtlDelay(10000);}while(R != 10){R--;PWMPulseWidthSet(PWM1_BASE, PWM_OUT_5, R);SysCtlDelay(10000);}while(B != 600){B++;PWMPulseWidthSet(PWM1_BASE, PWM_OUT_6, B);SysCtlDelay(10000);}while(B != 10){B--;PWMPulseWidthSet(PWM1_BASE, PWM_OUT_6, B);SysCtlDelay(10000);}while(G != 600){G++;PWMPulseWidthSet(PWM1_BASE, PWM_OUT_7, G);SysCtlDelay(10000);}while(G != 10){G--;PWMPulseWidthSet(PWM1_BASE, PWM_OUT_7, G);SysCtlDelay(10000);}}}

各函数作用

SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM1);

使能GPIO F和PWM模块1,此处的使能需要对照PWM Signales确定自己使用的PWM模块对应的GPIO引脚是F,H或着其他

GPIOPinConfigure(GPIO_PF1_M1PWM5);

GPIO引脚配置,也可以看做是复用功能的“选择”,此处也需查看表格PWM Signal,查看对应的PIN name。因为RGB三色灯对应的PF1,PF2和PF3,所以我们在此处选择GPIO_PF1_M1PWM5,GPIO_PF1_M1PWM6,GPIO_PF1_M1PWM7。

GPIOPinTypePWM(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);

将引脚PF1,2,3硬件指定为PWM,第一个为GPIO F的基地址,第二个为PIN1,2,3的漂移地址。

PWMGenConfigure(PWM1_BASE,PWM_GEN_2,PWM_GEN_MODE_UP_DOWN|PWM_GEN_MODE_NO_SYNC);

配置对应的PWM发生器,第一个为PWM模块1的基地址,第二个为需要使用的PWM发生器,每个PWM模块有四个发生器,每个发生器对应的输出引脚不同,根据PWM Signal的表格,可知PF1是Generator 2,PF2,3是Generator 3,所以此处我们需要将PWM_GEN_2和PWM_GEN_3都进行设置,第三个为计数模式和同步的设置,PWM_GEN_MODE_UP_DOWN是设置为Count up/down mode,居中对齐的上下计数模式,PWM_GEN_MODE_NO_SYNC为不同步no synchronic。

PWMGenPeriodSet(PWM1_BASE, PWM_GEN_2, 640);

设置PWM发生器的周期,第一个为PWM模块1的基地址,第二个为对应的发生器,第三个为一个周期包含的时钟脉冲数,也可以看做计数器的重载值。

PWMPulseWidthSet(PWM1_BASE, PWM_OUT_5, R);

设置脉冲宽度,不可大于发生器周期长度,第一个为PWM模块1的基地址,第二个为对应的输出引脚,根据PWM Signal的表格,PF1 motion contol module1 PWM5,所以是PWM_OUT_5,根据此可的PF2,PF3对应PWM6和7,第三个为脉冲宽度值。

PWMGenEnable(PWM1_BASE, PWM_GEN_2);

使能PWM发生器

PWMOutputState(PWM1_BASE, PWM_OUT_5_BIT | PWM_OUT_6_BIT | PWM_OUT_7_BIT, true);

使能PWM的输出位,设置为真。

while中的内容就是使三色灯循环呼吸的程序设计了,实现方式有很多,只要改变脉冲宽度就可以。

论坛资料

PWM初始化流程

以PWM1通道为例,由引脚图可知PWM1对应着PF1引脚。

1.使能PWM和GPIOF时钟

2.设置PF1,复用PF1

GPIOPinConfigure(GPIO_PF1_M0PWM1);

GPIOPinTypePWM(GPIO_PORTF_BASE, GPIO_PIN_1);

注意复用IO的库函数写法,其他复用函数请查看库函数手册

3.PWMGEN设置

PWMGenConfigure(PWM0_BASE,PWM_GEN_0,PWM_GEN_MODE_UP_DOWN|PWM_GEN_MODE_NO_SYNC);

4.设置PWM周期占空比

PWMGenPeriodSet(PWM0_BASE, PWM_GEN_0,64000);

PWMPulseWidthSet(PWM0_BASE,PWM_OUT_0,PWMGenPeriodGet(PWM0_BASE, PWM_GEN_0)/ 4)

;//产生占空比为25%的PWM,等同于PWMPulseWidthSet(PWM0_BASE,PWM_OUT_0,16000)注意PWMGenPeriodGet函数用法。

注意:每个PWMGenraator产生的两路PWM频率相同,但占空比可以不同。

关于PWM频率的设置,因为PWM内部的负责计数寄存器只有16位,所以保存在里面的数字不能大于65535。这就限制了PWM的频率不能低于时钟频率/65535。若想产生更低的频率,则必须对PWM进行预分频,预分频函数为PWMClockSet,在使能PWM时钟后紧接着调用该函数。例如,系统主时钟为120MHz,设置分频系数为2

PWMClockSet(PWM0_BASE,PWM_SYSCLK_DIV_2)

然后设置

PWMGenPeriodSet(PWM0_BASE, PWM_GEN_0,64000);

PWMPulseWidthSet(PWM0_BASE,PWM_OUT_0,32000);

则该PWM周期为:120M / 2/64000 = 937.5Hz

占空比为 32000 / 64000 = 50%。

5.使能PWMGEN

6.设置PWM输出状态

PWMGenEnable(PWM_BASE,PWM_GEN_0);

PWMOutputState(PWM_BASE,(| PWM_OUT_1_BIT),true);

TM4C123GXL_PWM相关推荐

最新文章

  1. 基于Spring可扩展Schema提供自定义配置支持(spring配置文件中 配置标签支持)
  2. MF0 AI+IoT K210 人脸识别模块 应用笔记-(1)
  3. 在CentOS上搭建PHP服务器环境
  4. ios网络学习------8 xml格式数据的请求处理 用代码块封装
  5. ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)
  6. bzoj2152 聪聪可可
  7. wordpress个人博客小程序带流量主+教程
  8. mac下 home-brew安装及php,nginx环境安装及配置
  9. UVA - 247 Calling Circles(Floyd求传递闭包)
  10. python字符串替换
  11. Git 基础命令与事件详解(基础版)
  12. VS版权信息插件——初试VS插件开发小记
  13. 严题集6.65//Leetcode105 已知二叉树前序序列和中序序列分别存放在两个一位数组中,建立该二叉树的二叉链表
  14. 网络营销的15大形式
  15. TFN DG15M 高抗干扰电缆故障测试仪评测
  16. 使用iMovie和Keynote制作App Preview
  17. 2021安徽省安全员B证 多选题考试题库及答案
  18. (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  19. 键盘按键响应时间越快越好吗_【涨姿势】按键无冲、响应延时、键盘调速……你会看机械键盘参数指标吗?...
  20. OSChina 周一乱弹 —— 论备份容灾的重要性

热门文章

  1. excel文件导入hive乱码_hive 从Excel中导入数据
  2. html图片右上角删除按钮,图片右上角删除
  3. 网络发现已关闭网络计算机和设备不可见
  4. GameMaker如何导入JSON文件
  5. kodi安卓4.0版及中文插件安装方法
  6. Quartus II IP生成报错
  7. Saas的概念及相关应用
  8. 中国市场杂志社中国市场编辑部2022年第32期目录
  9. oracle中execute是什么意思,oracle中EXECUTEIMMEDIATE是什么意思?如何使用,请用自己......
  10. 安卓读取U盘容量信息,支持低版本API