实验8 脉冲宽度调制(PWM)模块 北京化工大学 2019090034

实验8 脉冲宽度调制(PWM)模块 北京化工大学 2019090034 韩政霄

1 小结实验内容(1),写出程序的设计流程。

main
配置时钟源
配置UART
在串口中输出字符
配置PWM-使能PB6-发生器0-占空比0.25
死循环
串口打印Normal
第一次延时5s
第一次转置PWM
串口打印Inverted
第二次延时5s
第二次转置PWM

2 完成实验内容2,编写程序并演示运行,观察LED亮度和占空比的关系

2.1 设计思路及流程图

main
配置时钟
配置UART
配置PWM-使能PF1-发生器2
死循环
设置PWM占空比
串口打印PWM占空比
更新PWM占空比

2.2 源程序:

#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"
#include "inc/tm4c123gh6pm.h"
#include "inc/hw_gpio.h"
#include "driverlib/timer.h"
#include "driverlib/interrupt.h"
#include "driverlib/pwm.h"
#include "string.h"

void PWMInit(void)
{
	SysCtlPWMClockSet(SYSCTL_PWMDIV_1);	//配置PWM时钟(设置USEPWMDIV分频器)																							
	SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM1);//使能时钟
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
	GPIOPinTypePWM(GPIO_PORTF_BASE,GPIO_PIN_1);//使能引脚复用PWM功能
	GPIOPinConfigure(GPIO_PF1_M1PWM5);//PWM信号分配
	PWMGenConfigure(PWM1_BASE,PWM_GEN_2,PWM_GEN_MODE_UP_DOWN|PWM_GEN_MODE_NO_SYNC);//配置PWM发生器模块1->发生器2->上下计数,不同步
	PWMGenPeriodSet(PWM1_BASE,PWM_GEN_2,64000);//配置PWM周期
	PWMPulseWidthSet(PWM1_BASE,PWM_OUT_5,PWMGenPeriodGet(PWM1_BASE, PWM_GEN_2)*0.01);//配置PWM占空比
	PWMOutputState(PWM1_BASE,PWM_OUT_5_BIT,true);//使能模块1输出
	PWMGenEnable(PWM1_BASE,PWM_GEN_2);//使能PWM发生器
}

void InitConsole(void)
{
   SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
   GPIOPinConfigure(GPIO_PA0_U0RX);
   GPIOPinConfigure(GPIO_PA1_U0TX);
   SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
   GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);
   SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
   UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);
   GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
   UARTStdioConfig(0, 115200, 16000000);
}

int main()
{
	SysCtlClockSet(SYSCTL_SYSDIV_1|SYSCTL_USE_OSC|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);
	InitConsole();
	PWMInit();
	float duty_cycle=0.1;
	int duty_cycle_output = 1;
	float d=0.1;
	int d_output = 1;
	while(1)
	{
		if(duty_cycle>=0.9 || duty_cycle<=0.1)
		{
			d=-d;
			d_output=-d_output;
		}
		PWMPulseWidthSet(PWM1_BASE, PWM_OUT_5, PWMGenPeriodGet(PWM1_BASE, PWM_GEN_2)*duty_cycle);//配置占空比
		PWMOutputState(PWM1_BASE, PWM_OUT_5_BIT, true);
		PWMGenEnable(PWM1_BASE, PWM_GEN_2); //使能发生器模块
		duty_cycle+=d;
		duty_cycle_output+=d_output;
		SysCtlDelay(200*(SysCtlClockGet()/3000)); //200ms
		UARTprintf("duty_cycle: 0.%d\n",duty_cycle_output);
	}
}

2.3 观察LED亮度和占空比的关系

占空比为0,LED灭。占空比为100%,LED最亮。

3 实验小结

本次实验主要是将示例中的PWM配置与串口通信结合了起来,实现了改变PWM占空比的同时通过串口打印的效果。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值