华北电力大学科技学院ARM课内实验三Word文档下载推荐.docx
《华北电力大学科技学院ARM课内实验三Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《华北电力大学科技学院ARM课内实验三Word文档下载推荐.docx(10页珍藏版)》请在冰豆网上搜索。
2016年5月10日
实验三:
脉冲宽度调制器PWM
(1)捕获功能
一:
实验现象
1.本次实验是使用LPC178/177x系列Cortex-M3中的PWM输出功能的捕获模块来输出3路双边沿PWM。
其中第一路是周期为100us,占空比为87.5%的方波,第二路是周期为100us,占空比为50%的方波,第三路是周期为100us,占空比为25%的方波。
2.实验现象图片展示:
测试时用示波器捕获P3.25(PWM-2,通道2输出)、3.27(PWM-1输,通道4输出)、3.29(PWM-1,通道6输出)引脚上的波形如下图所示:
二:
实验代码分析
#include"
../LPC177x_8x/LPC177x_8x.h"
../LPC177x_8x/type.h"
#defineLED(1ul<
<
31)
#defineLED_INIT()LPC_GPIO3->
DIR|=LED,LED_OFF()//LED初始化
#defineLED_OFF()LPC_GPIO3->
SET|=LED//LED灭
#defineLED_ON()LPC_GPIO3->
CLR|=LED//LED亮
volatileuint32_tGuiCapFlag=0;
//定时器捕获中断标志
voidmyDelay(uint32_tulTime)
{
uint32_ti;
while(ulTime--){
for(i=0;
i<
19192;
i++);
}
}
voidpwmDb1Init(void)//初始化双边沿PWM输出
uint32_tiTmp;
LPC_IOCON->
P3_25&
=~0x07;
//11111000相当于清零最后三位
P3_25|=2;
//0010-010P158,P3.25作PWM1[2]输出
P3_27&
P3_27|=2;
//与上同,P3.27作PWM1[4]输出
P3_29&
P3_29|=2;
//与上同,P3.29作PWM1[6]输出
iTmp=PeripheralClock/10000;
//FPCLK_FREQ分频,PWM计数频率
LPC_PWM1->
PR=0x00;
//不分频
MCR=0x02;
//PWMMR0与PWMTC匹配时复位PWMTC
PCR=(1<
2)|//PWM2双边沿控制
(1<
4)|//PWM4双边沿控制
6)|//PWM6双边沿控制
10)|//使能PWM2输出
12)|//使能PWM4输出
14);
//使能PWM6输出
MR0=iTmp;
//T=1/10000=0.1ms=100us,PWM速率控制/计数初值,设置双边沿脉冲的脉宽和位置
MR1=0;
//设置初始值为低电平,然后立即变上升沿,PWM2的置位位置
MR2=(iTmp/8)*7;
//占空比=7/8*100us的时间后下降沿,PWM2的复位位置
MR3=(iTmp/8)*2;
//PWM4的置位位置
MR4=(iTmp/8)*6;
//MR3与MR4两路占空比=4/8*100us的时间后下降沿,PWM4的复位位置
MR5=(iTmp/8)*3;
//PWM6的置位位置
MR6=(iTmp/8)*5;
//MR3与MR4两路占空比=2/8*100us的时间后下降沿,PWM6的复位位置
LER=0x7F;
//01111111,锁存所有PWM匹配值
TCR=0x02;
//复位PWMTC
TCR=0x09;
//使能PWM
intmain(void)
SystemInit();
//系统初始化,切勿删除
pwmDb1Init();
//初始化I/O口,设置P3.25
//P3.27、P3.29为双边沿输出
while
(1);
三:
通过修改某些语句从而使得波形的周期和占空比发生变化
通过改变voidpwmDb1Init(void)子函数中的MR1/MR2(或者MR3/MR4、MR5/MR6)的设置,可以使得波形的周期和占空比发生变化,这里不再举例。
(2)PWM中断
本次实验是使用LPC178/177x系列Cortex-M3中的PWM输出功能的定时中断功能,通过PWM的定时器定时0.5s产生一个中断,使得LED灯每0.5s闪烁一次。
DIR|=LED,LED_OFF()//LED初始化
voidpwm1TimerInit(void)//PWM初始化子函数
//00000010,复位PWM1定时器
TC=0;
//计数器设置为0
PR=0;
//时钟不分频
MCR=0x03;
//00000011,设置PWMMR0匹配后复位PWMTC,并产生中断标志
MR0=PeripheralClock/2;
//=1/2=0.5s,0.5秒定时
voidPWM1_IRQHandler(void)//PWM中断服务函数
IR=0x01;
//清PWM中断标志
LED_ON();
myDelay(100);
LED_OFF();
LED_INIT();
pwm1TimerInit();
//初始化PWM定时器
NVIC_EnableIRQ(PWM1_IRQn);
//设置PWM中断优先级并使能
NVIC_SetPriority(PWM1_IRQn,5);
TCR=0x01;
//启动定时器
通过修改某些语句从而使得LED的闪烁发生变化
通过改变voidpwm1TimerInit(void)子函数中的
LPC_PWM1->
语句,可以改变定时时间。
实验四:
电机控制PWM(MCPWM)
1.本次实验是使用LPC178/177x系列Cortex-M3中的MCPWM输出,通过观察P1.19、1.22、1.25、1.26、1.28、1.29上的管脚来观察PWM波形。
2.实验现象图片展示
由于示波器双通道的针孔在实验板上很难固定住,从而使得观察更加不容易,所以下面就只展示接P1.28和P1.29管脚上的波形。
如下图所示:
1.主函数代码:
../MCPWM/mcpwm.h"
//初始化目标板,切勿删除
mcPwmInit();
//MC_PWM初始化
while
(1){
2.MCPWM代码:
mcpwm.h"
mcpwmcfg.h"
voidMCPWM_IRQHandler(void)//电机PWM中断处理子函数
uint32_tregVal;
regVal=LPC_MCPWM->
INTF;
//读MCPWM中断状态寄存器
if(regVal&
(1<
15))//ABORT中断
{
LPC_MCPWM->
INTF_CLR=regVal;
//清除ABORT中断标志
MCPWMInt_flag=1;
voidmcPwmInit(void)//电机PWM初始化
P1_19&
//选择P1.19作通道0A输出
P1_19|=4;
//0100-100P156选择MC_OA输出
P1_22&
//选择P1.22作通道0B输出
P1_22|=4;
P1_25&
//选择P1.25作通道1A输出
P1_25|=4;
P1_26&
//选择P1.26作通道1B输出
P1_26|=4;
P1_28&
//选择P1.28作通道2A输出
P1_28|=4;
P1_29&
//选择P1.29作通道2B输出
P1_29|=4;
P1_21&
//选择P1.21作MCPWMABORT输入
P1_21|=4;
LPC_SC->
PCONP|=1<
17;
//打开MCPWM电源控制
CON_CLR=0xFFFFFFFF;
//即MCCON所有的位都给0,清零电机PWM控制寄存器
TC0=0;
//PWM定时器清零
TC1=0;
TC2=0;
//设置各通道周期和占空比
LIM0=Channel0_Freq;
MAT0=Channel0_Wide;
LIM1=Channel1_Freq;
MAT1=Channel1_Wide;
LIM2=Channel2_Freq;
MAT2=Channel2_Wide;
INTEN_SET=1<
15;
//使能ABORT中断
NVIC_EnableIRQ(MCPWM_IRQn);
//PWM中断优先级并使能
NVIC_SetPriority(MCPWM_IRQn,4);
//启动PWM0、PWM1、PWM2定时器
CON_SET|=(1<
0)|(1<
8)|(1<
16);