TM4C123系列(三)————PWM输出

2023-05-16

一.实验介绍

使用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时钟就是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);
	}
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TM4C123系列(三)————PWM输出 的相关文章

  • stm32中pwm频率和占空比设置

    对于72M频率来说 xff0c 计算pwm频率是 xff1a 频率 xff1a Fpwm 61 72M arr 43 1 psc 43 1 单位 xff1a Hz 占空比 xff1a duty circle 61 TIM3 gt CCR1
  • pwm控制电机原理

    首先我们要明白电机的原理 电机 简单来说就是 实现电能与机械能相互转换的电工设备 那么我们经常使用的直流电机原理就是 xff1a 电生磁 xff1a 通电导线会产生磁场 也就是电磁感应 旋转磁场带动转子转动 电动机是由定子和转子组成 xff
  • PWM调速的原理

    PWM调速实质上是调节占空比 xff0c 我们都是根据占空比的大小来衡量速度 xff0c 但是为什么我们调节占空比就可以实现对速度的调节呢 xff1f 这就需要我们了解调速的本质 xff0c 我们用PWM调节速度问什么能够实现 xff1f
  • Linux驱动开发(十七)---树莓派PWM驱动

    前文回顾 Linux驱动开发 xff08 一 xff09 环境搭建与hello world Linux驱动开发 xff08 二 xff09 驱动与设备的分离设计 Linux驱动开发 xff08 三 xff09 设备树 Linux驱动开发 x
  • STM32通过PWM控制ESC30C电调

    最近在搞一个水下推进器 xff0c 这东西的控制其实跟四旋翼的螺旋桨控制差不多 但我也是第一次用STM32板子来控制电调驱动桨叶旋转 xff0c 因此踩了很多坑 网上找了很多资料 xff0c 但是很多都写的不是很清楚 xff0c 这边稍微记
  • 使用CCS移植FreeRTOS至TM4C123系列

    使用新建好的工程 xff0c 见上一篇博文 xff1a 使用CCS给TM4C123系列MCU新建工程 第一步 xff1a 在自己的工程下新建一个FreeRTOS文件夹 xff0c 在这个文件夹下新建两个文件夹 xff1a src和port
  • Simulink 使用C语言发PWM波 (一)

    1 在matlab中安装C语言模块mingw 2 在simulink中引用S Function模块 和S Function Examples模块 3 使用S Function Examples模块创建C文件 双击S Function Exa
  • 【STM32Cube HAL】输入捕获(六)——PWM测量

    对于PWM的捕获 xff0c 我这里一共使用两种方法实现 xff1a 第一种是PWM输入模式 xff0c 采用一个定时器的两个通道 xff08 通道一和通道二 xff09 xff0c 配置从模式为复位模式 xff0c 没有进行溢出处理 xf
  • 通用LED闪烁代码模块(也可实现软件PWM)

    仅提供参考文件 xff1a 1 需要修改gpio引脚 2 需要根据平台实现软件定时器接口 xff0c 启动 xff0c 停止 xff0c 回调 xff0c 三个API 3 根据平台优化相关错误即可 pwm drv c Created on
  • px4的PWM是如何输出的

    如果有io芯片 xff0c 且使用了io作为输出PWM的设备 则fmu将mixer传输给io xff0c io进行混控计算并输出PWM xff0c 将pwm结果传递回fmu xff0c 此时无app订阅acuator outpus xff0
  • 首个单芯片超小封装I2C转PWM解决方案

    ZW10I8X系列 高性能工业级16位高精度I2C转PWM接口SOC芯片 接口标准 符合飞利浦的I2C标准规范 xff0c 目前支持的速度为小于100kbit 建议使用50k 1个使能脚 xff08 ZW10I8xE后缀带E的 xff09
  • PWM输出讲解

    一 PWM基础知识 1 PWM的定义 PWM xff0c 是脉冲宽度调制 缩写 xff0c 它是通过对一系列脉冲的宽度进行调制 xff0c 等效出所需要的波形 xff08 包含形状以及幅值 xff09 xff0c 对模拟信号电平进行数字编码
  • PWM脉宽调制 与PPM、SBUS、DSM2 协议 详细介绍

    原文地址 xff1a http www 5imx com portal php mod 61 view amp aid 61 1351 相信这个问题是每个模友在新入航模坑时都会遇到的问题 xff0c 也仍然在困扰着不少新手 这里简单对比解释
  • TM4C123系列(四)————UART串口通信

    一 实验简介 使用TM4C123的串口通信功能实现单片机与PC端通信 二 UART介绍 TM4C123有八个串口 xff0c 其中UART0已经与USB集成 xff0c UART0建议只用来和PC端通信 xff0c 不要与外界通信 除此之外
  • 用PWM控制舵机(以是stm32为例)

    因为做校创需要用到舵机 xff0c 以前知道大致的理论 xff0c 因此看了一些帖子 xff0c 总结一下被以后查看 什么是PWM波 PWM就是脉冲宽度调制 xff0c 也就是占空比可变的脉冲波形 pwm的占空比 xff0c 就是指高电平保
  • 基于HAL库的stm32f103c8t6的快速开发笔记(简易版)—— 5、STM32的PWM输出(附舵机控制)

    1 概念了解 首先了解到 PWM生成是在通用定时器的基础上配置的 每个通用定时器都有多路通道输出PWM信号 这里以TIM4 定时器4 为例 在图形配置面板找到TIM4的通道一作为PWM输出管脚 其管脚为PB6 打开左侧定时器配置面板 可以看
  • 直流电机控制 pwm 和 pid 算法

    下面的文章是我转载的 所以作者若是看到不允许转载 请给我留言或给我邮件 lushiliangcsdn 163 com 我会立即删除 转载原因 这篇文章把pid 算法解释的很详细 我担心以后这篇文章无故删除 才转载到我这边的 谢谢 转载来源于
  • PMIC驱动之—PMIC硬件相关知识

    PMIC 电源管理集成电路 Power Management IC 在之前项目中 驱动最小系统 对于PMIC这块儿很懵懂 故抽时间查看一些优秀博文及资料 加强对电源管理的理解 本文介绍 PMIC 硬件电路相关的一些知识 在此作一些阶段性的学
  • 什么是死区时间

    死区时间是PWM输出时 为了使H桥或半H桥的上下管不会因为开关的关断延迟问题发生同时导通而设置的一个保护时段 通常也指pwm响应时间 由于IGBT 绝缘栅极型功率管 等功率器件都存在一定的结电容 所以会造成器件导通关断的延迟现象 一般在设计
  • 如果我尝试打开 PWM 引脚,Windows 10 Iot Core 应用程序会崩溃

    我想为我的蜂鸣器打开一个 PWM 引脚 但如果我尝试打电话给pwmController OpenPin 6 方法 应用程序崩溃并显示System Runtime InteropServices SEHException 我已经仔细检查过示例

随机推荐