一.实验介绍

使用PWM控制板载LED绿灯与蓝灯交替呼吸闪烁

二.PWM介绍

TM4C123有两个PWM模块,每个模块有四个发生器和一个控制模块,每个发生器可以产生两路PWM输出,一共可以输出16路PWM信号,每个发生器控制下的的两个PWM信号频率是一样的,但是占空比可以设置成不同的。

有PWM0和PWM1两个PWM模块,每个PWM模块有对应PWM_GEN_0到PWM_GEN_3四个发生器,每个模块有对应PWM_OUT_0到PWM_OUT_7八个通道,这八个通道两个对应一个发生器。

三.原理图与引脚图

可以看到右下角的PWM输出口所对应的引脚,在这里我使用的是Tiva C Series PinMux Utility,它是专门用来查看Tiva系列芯片的引脚的,很好用。

网盘链接:百度网盘 请输入提取码

提取码:6666

四.所需函数

1.SysCtlClockSet(uint32_t ui32Config)

参数及作用:TM4C123系列(一)————GPIO

2.SysCtlPeripheralEnable(uint32_t ui32Peripheral)

参数及作用:TM4C123系列(一)————GPIO

3.GPIODirModeSet(uint32_t ui32Port, uint8_t ui8Pins, uint32_t ui32PinIO)

参数及作用:TM4C123系列(一)————GPIO

4.GPIOPadConfigSet(uint32_t ui32Port, uint8_t ui8Pins,uint32_t ui32Strength, uint32_t ui32PinType)

参数及作用:TM4C123系列(一)————GPIO

5.SysCtlPWMClockSet(uint32_t ui32Config)

参数:uint32_t ui32Config为PWM时钟的分频系数

作用:让总线时钟进行合理分频并作为PWM时钟

6.GPIOPinTypePWM(uint32_t ui32Port, uint8_t ui8Pins)

参数:uint32_t ui32Port为外设基地址,uint8_t ui8Pins为外设引脚

作用:为引脚分配PWM信号

7.GPIOPinConfigure(uint32_t ui32PinConfig)

参数:uint32_t ui32PinConfig为哪个引脚复用为什么功能

作用:使能复用

8.PWMGenConfigure(uint32_t ui32Base, uint32_t ui32Gen,uint32_t ui32Config)

参数:uint32_t ui32Base为PWM模块的基地址,在“hw_memmap.h”中有定义,uint32_t ui32Gen为PWM的发生器从PWM_GEN_0到PWM_GEN_3,uint32_t ui32Config为PWM寄存器的计数方式

作用:配置PWM发生器

9.PWMGenPeriodSet(uint32_t ui32Base, uint32_t ui32Gen,uint32_t ui32Period)

参数:uint32_t ui32Base为PWM模块的基地址,uint32_t ui32Gen为PWM输出通道所在的发生器,uint32_t ui32Period为一个周期内的计数值,相当于STM32中的ARR

作用:设置PWM输出频率

#####注意这里计算频率时,用PWM的时钟来除以ui32Period即为频率。

10.PWMPulseWidthSet(uint32_t ui32Base, uint32_t ui32PWMOut,uint32_t ui32Width)

参数:uint32_t ui32Base为PWM模块的基地址,uint32_t ui32PWMOut为输出通道,uint32_t ui32Width为一个周期内的高电平数,相当于STM32中的CCR,ui32Width可以在0-ui32Period之间调整

作用:设置PWM输出占空比

11.PWMOutputState(uint32_t ui32Base, uint32_t ui32PWMOutBits,bool bEnable)

参数:uint32_t ui32Base为PWM模块的基地址,uint32_t ui32PWMOutBits为输出通道,bool bEnable为true或false

作用:使能输出通道

12.PWMGenEnable(uint32_t ui32Base, uint32_t ui32Gen)

参数:uint32_t ui32Base为PWM模块的基地址, uint32_t ui32Gen为PWM发生器

作用:使能发生器

13.SysCtlDelay(uint32_t ui32Count)

参数及作用:TM4C123系列(一)————GPIO

五.代码

led.c
//不懂的可以看下我之前的文章
#include "led.h"
#include "gpio.h"
#include "sysctl.h"
#include "hw_memmap.h"
void LED_Config(void)
{SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOF);GPIODirModeSet( GPIO_PORTF_BASE,  GPIO_PIN_2|GPIO_PIN_3,GPIO_DIR_MODE_OUT);GPIOPadConfigSet( GPIO_PORTF_BASE,  GPIO_PIN_2|GPIO_PIN_3,GPIO_STRENGTH_2MA,  GPIO_PIN_TYPE_STD);
}
led.h
#ifndef __LED_H
#define __LED_H
void LED_Config(void);
#endif
led_control.c
#include "led_control.h"
#include "gpio.h"
#include "sysctl.h"
#include "pin_map.h"
#include "hw_memmap.h"
#include "pwm.h"
//一定注意在主函数中调用的时候要把这个文件的头文件包含,不然keil不会报错,但是程序不能运行
void PWM_Config(void)
{//因为设置了时钟总线是40MHz,所以在这里分一下频设置为4分频,那么PWM时钟就是10MHzSysCtlPWMClockSet( SYSCTL_PWMDIV_4);//使能GPIOF与PWM1SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOF);SysCtlPeripheralEnable( SYSCTL_PERIPH_PWM1);//为GPIOF_PIN_2与GPIOF_PIN_3分配PWM信号GPIOPinTypePWM( GPIO_PORTF_BASE,  GPIO_PIN_2);GPIOPinTypePWM( GPIO_PORTF_BASE,  GPIO_PIN_3);//对GPIOF_PIN_2与GPIOF_PIN_3使能引脚复用GPIOPinConfigure( GPIO_PF2_M1PWM6);GPIOPinConfigure( GPIO_PF3_M1PWM7);//设置PWM1模块的第四个发生器为向下计数与不同步计数PWMGenConfigure( PWM1_BASE,  PWM_GEN_3,PWM_GEN_MODE_DOWN|PWM_GEN_MODE_NO_SYNC);//设置PWM1模块的第四个发生器每个计数周期为2000个数,而PWM时钟为10MHz,那么PWM输出频率就是10^7/2000为5KHz,但是这个数为16位寄存器,不能超过65535PWMGenPeriodSet( PWM1_BASE,  PWM_GEN_3,2000);//设置PWM1模块的第六个通道的占空比为10%,这个函数的第三个参数为周期内的高电平数,所以可以通过PWMGenPeriodGet得出一个周期内的计数总数再乘0.1然后减1就行PWMPulseWidthSet( PWM1_BASE,  PWM_OUT_6,PWMGenPeriodGet(PWM1_BASE, PWM_GEN_3)*0.1 - 1);//同理,只不过是设置第七个通道PWMPulseWidthSet( PWM1_BASE,  PWM_OUT_7,PWMGenPeriodGet(PWM1_BASE, PWM_GEN_3)*0.1 - 1);//使能第六个通道PWMOutputState( PWM1_BASE,  PWM_OUT_6_BIT,true);PWMOutputState( PWM1_BASE,  PWM_OUT_7_BIT,true);//使能第三个发生器PWMGenEnable( PWM1_BASE,  PWM_GEN_3);
}
//自定义函数用来设置占空比
void PWM_duty(uint32_t ui32Base,uint32_t ui32PWMOut,uint32_t ui32PWMOutBits,uint32_t ui32Gen,float duty)
{PWMPulseWidthSet( ui32Base,  ui32PWMOut,PWMGenPeriodGet(ui32Base, ui32Gen)*duty - 1);PWMOutputState( ui32Base,  ui32PWMOutBits,true);PWMGenEnable( ui32Base,  ui32Gen);
}
led_control.h
#ifndef __LED_CONTROL_H
#define __LED_CONTROL_H
#include <stdint.h>
void PWM_Config(void);
void PWM_duty(uint32_t ui32Base,uint32_t ui32PWMOut,uint32_t ui32PWMOutBits,uint32_t ui32Gen,float duty);
#endif
main.c
#include "tm4c123gh6pm.h"
#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_sysctl.h"
#include "inc/hw_gpio.h"
#include "inc/hw_memmap.h"
#include "driverlib/gpio.h"
#include "driverlib/sysctl.h"
#include "pwm.h"
#include "pin_map.h"
#include "led_control.h"
//自定义延时函数,不懂得可以去看我前面的文章
#define Delay_ms(count);              SysCtlDelay(SysCtlClockGet()*count/3000);float d=0.01;
float duty=0.1;
_Bool flag=0;
void main(void)
{//设置时钟总线是40MHzSysCtlClockSet( SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);LED_Config();PWM_Config();while(1){duty+=d;//控制一个颜色的灯先亮后灭之后再换另一个颜色先亮后灭,依次往复if(duty>0.9){d=-0.01;}else if(duty<0.1){d=0.01;flag=!flag;}if(flag==0){PWM_duty( PWM1_BASE, PWM_OUT_6, PWM_OUT_6_BIT, PWM_GEN_3, duty);}else{PWM_duty( PWM1_BASE, PWM_OUT_7, PWM_OUT_7_BIT, PWM_GEN_3, duty);}Delay_ms(10);}
}

TM4C123系列(三)————PWM输出相关推荐

  1. STM32F0库函数初始化系列:PWM输出

    void TIM1_Configuration(void) {TIM_TimeBaseInitTypeDef TIM_Time1BaseStructure;TIM_OCInitTypeDef TIM_ ...

  2. 掌上实验室V8系列教程(四)定时器PWM输出

    1 项目功能 三色RGB LED 通过PWM 调色 2 电路原理 我们可以通过3路PWM波分别调整RGB三个二极管的亮度,即调整RGB的比例,合成不同的颜色. PWM,英文名Pulse Width M ...

  3. 单片机PWM输出控制直流电机(89c51系列、stc12c5a60s2系列)

    目录 [pwm是如何控制电机转速] [89C51系列单片机产生pwm波] [STC12C5A60S2系列单片机输出PWM] [pwm是如何控制电机转速] 在本科学习中,学生所做的小车多数为使用lm29 ...

  4. TM4C123系列(四)————UART串口通信

    一.实验简介 使用TM4C123的串口通信功能实现单片机与PC端通信. 二.UART介绍 TM4C123有八个串口,其中UART0已经与USB集成,UART0建议只用来和PC端通信,不要与外界通信. ...

  5. DSP芯片F2803x系列之PWM模块及高精度PWM使用

    DSP芯片F2803x之ePWM模块 文章目录 1 ePWM模块概述 2 ePWM模块构成 3 ePWM各子模块 3.1 TB模块 3.2 CC模块 3.3 AQ模块 3.4 DB模块 3.5 PC模 ...

  6. 匿名飞控修改pwm输出脉宽和频率

    项目中要用到飞控板去控制一个单独的pwm电子开关,但是这个电子开关只有在输入特定脉冲频率和脉宽的作用下会执行开关作用.因为也是一直做上层算法,缺少底层开发经验,网上也没有现成的技术文档告诉我怎么改,只 ...

  7. 后端如何发出请求_gRPC系列(三) 如何借助HTTP2实现传输

    本系列分为四大部分: gRPC系列(一) 什么是RPC? gRPC系列(二) 如何用Protobuf组织内容 gRPC系列(三) 如何借助HTTP2实现传输 gRPC系列(四) 框架如何赋能分布式系统 ...

  8. 深入剖析Redis系列(三) - Redis集群模式搭建与原理详解

    前言 在 Redis 3.0 之前,使用 哨兵(sentinel)机制来监控各个节点之间的状态.Redis Cluster 是 Redis 的 分布式解决方案,在 3.0 版本正式推出,有效地解决了 ...

  9. 机器学习入门系列三(关键词:逻辑回归,正则化)

    机器学习入门系列三(关键词:逻辑回归,正则化) 目录(?)[+] 一逻辑回归 逻辑回归 假设表示 决策边界 代价函数 其他优化方法 多元分类 二正则化 一.逻辑回归 1.逻辑回归 什么是逻辑回归问题, ...

最新文章

  1. python数值运算m op n 100+10_python 100例(10)
  2. python小数输出01_python:格式化输出(上)
  3. php5.2.10安装_安装 | 起步 | Laravel 5.2 中文文档
  4. Golang 一些基本功能使用记录
  5. Sublime Text shift+ctrl妙用、Sublime Text快捷组合键大全
  6. 材料科学中的数据挖掘:晶体图神经网络解读与代码解析
  7. Azkaban任务调度(使用带有依赖的任务调度)【mapreduce数据清洗,数据入hive库,kylin预编译、数据分析】
  8. 关于ubuntu自定义service服务时找不到/usr/lib/systemd/system目录的问题
  9. Openssl更新步骤
  10. 名片识别信息分类python_python文字识别
  11. css 圆点样式 优惠券样子
  12. jqgrid学习(二)
  13. HashTable源码
  14. Elf二进制文件解析
  15. hist 和imhist的区别
  16. YOLOV3算法详解
  17. Xposed 模块 Nnnen助手(Soul 抖音 皮皮虾Hook)
  18. 从GitHub火到了CSDN,共计1658页的《Java岗面试核心MCA版》
  19. 你很聪明,思维也很敏捷,小有才华,为什么依然一事无成?
  20. 第 11 场双周赛-5089. 安排会议日程(双指针)

热门文章

  1. 《STM32学习笔记》4——核心功能电路与编程(下)
  2. 贝壳网webpack案例
  3. Android 实现指南针效果
  4. 推荐几款性价比高的优盘
  5. android—性能优化2—内存优化
  6. 深度学习GPU选购指南:哪款显卡配得上我的炼丹炉?
  7. 把中文目录名称修改成英文首字母大写或中文拼音目录
  8. DbVisualizer 8.0.11 出现乱码问题
  9. Layui官网地址官网仓库
  10. 把C盘的用户Users文件移动到D盘最简单的方法【转】