一.实验介绍
使用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文章来源:https://www.toymoban.com/news/detail-602986.html
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
五.代码文章来源地址https://www.toymoban.com/news/detail-602986.html
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时钟就是10MHz
SysCtlPWMClockSet( SYSCTL_PWMDIV_4);
//使能GPIOF与PWM1
SysCtlPeripheralEnable( 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位寄存器,不能超过65535
PWMGenPeriodSet( 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)
{
//设置时钟总线是40MHz
SysCtlClockSet( 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输出的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!