微机原理EV实验报告Word格式.docx
《微机原理EV实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《微机原理EV实验报告Word格式.docx(21页珍藏版)》请在冰豆网上搜索。
1、脉冲宽度调制(PWM)
固定幅值、周期,通过改变占空比使得波形能量与要求的波形基本相等。
脉宽调制可以直接从DSP输出。
2、PWM控制LED的渐变闪烁
事件管理器(EV)的比较单元又称为全比较/PWM单元,功能主要用来产生PWM波形,每一个比较单元可以产生一对(两路)互补的PWM波,每一路PWM波可以控制一个LED的亮灭状态。
通过动态改变PWM波的占空比来调节LED在一个周期内的点亮时间,由于PWM波频率很高,超出人眼分辨率,在人眼里就是连续的灯光,按照渐变占空比的变化,就可以表现为LED亮度的不断变化。
三、程序设计与分析
1、主程序设计流程图
2、程序段设计与分析
程序段
voidInit_Sys(void);
/*初始化系统*/
voidInit_IOF(void);
/*初始化IO*/
voidInit_timer0(void);
/*初始化CPUTIMER*/
voidInit_CPUint(void);
/*初始化CPU_int*/
voidInit_PIEint(void);
/*初始化PIE_int*/
voidInit_EV(void);
/*初始化EV*/
//interruptvoidCPU_timer0_isr(void);
interruptvoideva_T1PINT_isr(void);
interruptvoideva_CMP1INT_isr(void);
interruptvoideva_CMP2INT_isr(void);
interruptvoideva_CMP3INT_isr(void);
intprdnum;
intled1_cmp;
intled2_cmp;
intled3_cmp;
该程序段对系统初始化函数、GPIO初始化函数、CPUint初始化函数、PIE初始化函数、EV初始化函数以及T1周期中断子程序和三个比较中断子程序进行了声明。
该程序段还对相关全局变量进行了定义。
intled_tab[100]={
587,585,583,580,576,571,565,558,549,540,
530,518,506,493,479,465,449,434,417,400,
383,365,347,329,311,293,274,256,238,220,
202,185,168,151,136,120,106,92,79,67,
55,45,36,27,20,14,9,9,9,9,
9,9,9,9,9,14,20,27,36,45,
55,67,79,92,106,120,136,151,168,185,
202,220,238,256,274,292,311,329,347,365,
383,400,417,434,449,465,479,493,506,518,
530,540,549,558,565,571,576,580,583,585
};
该程序段给出了一个比较值表,其中的数据是给比较单元的比较寄存器CMPRx进行动态赋值的数据。
最大值应略小于T1周期值T1PR(586)。
voidInit_Sys(void)/*初始化系统*/
{
PLLCR=0xA;
PCLKCR=0xffff;
HISPCP=0x1;
//default
LOSPCP=0x2;
//default
WDCR=0x68;
//disablewd
LPMCR0=0x0;
//Lowpower--Idle
}
voidInit_Sys(void)函数用于初始化系统。
设置锁相环寄存器PLLCR=0xA,外部晶振为OSCCLK=30MHz,因此系统时钟
。
设置外设时钟控制寄存器PCLKCR=0xffff,使能片内各种相关外设时钟。
设置高速外设时钟预定标寄存器HISPCP=0x1,则高速外设时钟为
设置低速外设时钟预定标寄存器LOSPCP=0x2,则低速外设时钟为
设置看门狗控制寄存器WDCR=0x68,关闭看门狗。
设置低功耗模式控制寄存器LPMCR0=0x0,选择IDLE模式。
voidInit_IOF(void)/*初始化IO*/
inti;
GPFMUX=0x00ff;
//f8~f13
GPFDIR=0x3f00;
GPFDAT=0x0700;
GPEMUX=0xfff8;
GPEDIR=0x0007;
GPBMUX=0x00ff;
GPBDIR=0xFF00;
GPEDAT=0xFFFA;
GPBDAT=0xe300;
for(i=0;
i<
100;
i++){}
GPEDAT=0xFFFF;
GPEDAT=0xFFFB;
GPBDAT=0xe300;
for(i=0;
GPEDAT=0xFFFF;
GPAMUX=0x1;
//PWM1active
GPADIR=0x3F;
//GPIOA_3~5
GPADAT=0x00;
voidInit_IOF(void)函数用于初始化GPIO口。
软件设置和操作流程说明如下:
设置模式寄存器GPFMUX的高八位为0,使GPIOF8~13引脚配置为通用数字I/O模式;
设置方向寄存器GPFDIR的8~13位为1,使GPIOF相关引脚配置为输出;
设置数据寄存器GPFDAT的10~13位为0,8~10位为1,即点亮绿灯前三位,灭掉后三位,绿灯亮灭状态为000111(0为亮,1为灭);
设置模式寄存器GPEMUX的低三位为0,使GPIOE2~0引脚配置为通用数字I/O模式;
设置方向寄存器GPEDIR的低三位为1,使GPIOE2~0相关引脚配置为输出;
设置模式寄存器GPBMUX的8~15位为0,使GPIOB8~15引脚配置为通用数字I/O模式;
设置方向寄存器GPBDIR的8~15位为1,使GPIOB8~15引脚配置为输出;
设置数据寄存器GPEDAT的GPIOE2~0位为010,即选通红灯高八位;
设置数据寄存器GPBDAT=0xe300;
即红灯亮灭状态为1110001100000000;
延时后锁存;
设置数据寄存器GPEDAT=0xFFFB,即GPEDAT的GPIOE2~0位为011,选通红灯低八位;
即红灯亮灭状态为1110001111100011;
设置模式寄存器GPAMUX=0x1,即设置GPIOA为PWM1口;
设置方向寄存器GPADIR=0x3F(0000000000111111),即设置0~5位为PWM1~PWM6输出;
voidInit_CPUint(void)/*初始化CPU_int*/
IFR=0x0;
IER=0x3;
voidInit_CPUint(void)函数用于初始化CPUint;
设置CPU中断标志寄存器IFR=0x0,清除中断标志;
设置CPU中断使能寄存器IER=0x3,使能第3位对应的中断服务;
voidInit_PIEint(void)/*初始化PIE_int*/
PIEIFR1=0;
PIEIER2=0xf;
PIEIFR2=0;
PIEACK=0;
PIECTRL=1;
CMP1INTVector=&
eva_CMP1INT_isr;
CMP2INTVector=&
eva_CMP2INT_isr;
CMP3INTVector=&
eva_CMP3INT_isr;
T1PINTVector=&
eva_T1PINT_isr;
voidInit_PIEint(void)函数用于初始化PIEint;
设置PIE中断标志寄存器PIEIFR1=0,清除PIE控制器中第一组对应中断标志;
设置PIE中断使能寄存器PIEIER2=0xf,使能INTx.1~INTx.5;
设置PIE中断标志寄存器PIEIFR2=0,清除PIE控制器中第二组对应中断标志;
设置PIE中断应答寄存器PIEACK=0,PIE向CPU申请中断;
设置PIE控制寄存器PIECTRL=1,使能PIE中断;
以上语段用于关联相应中断服务子程序地址与对应的中断向量表,即将中断服务子程序的地址赋给中断向量表。
voidInit_EV(void)/*初始化EV*/
EXTCONA=1;
GPTCONA=0x0010;
T1CON=0x17ca;
T1PR=586;
COMCONA=0x82e0;
ACTRA=0x1;
DBTCONA=00;
CMPR1=led1_cmp;
CMPR2=led2_cmp;
CMPR3=led3_cmp;
EVAIMRA=0x8e;
EVAIFRA=0;
voidInit_EV(void)函数用于初始化事件管理器;
设置控制寄存器EXTCONA=1,采用独立比较输出模式;
设置通用定时器全局控制寄存器GPTCONA=0x0010,即T1CMPOE=1,定时器1比较输出使能(T1PWM_T1CMP);
设置定时器1控制寄存器T1CON=0x17ca,则TMODE1~TMODE0=10,计数模式为连续增模式;
输入时钟预定标因子TPS1~TPS0为111,输入时钟=高速外设时钟/64;
TENABLE=1,使能定时器操作;
TCLKS1~TCLKS0=00,时钟源选择内部时钟;
TCLD1~TCLD0=10,定时器比较寄存器重载条件为立即重载;
设置定时器周期寄存器T1PR=586,定时器1周期值为586;
设置比较控制寄存器COMCONA=0x82e0,比较器使能,比较寄存器重载条件为当计数器T1CNT=0时(即下溢中断时)重载,全比较器1、2、3输出使能;
设置比较行为控制寄存器ACTRA=0x1,比较输出引脚1低有效;
CMPR1=led1_cmp;
上述语段用于比较寄存器CMPR1~3值的动态变化,实现占空比的改变;
设置EVAIMRA=0x8e,使能定时器1的周期中断和比较中断以及全比较器1~3的比较中断。
设置EVA中断标志寄存器EVAIFRA=0,清除中断标志。
interruptvoideva_T1PINT_isr()
GPFDAT=0x0700;
//0000011100000000
GPADAT=0x00;
//00000000
GPEDAT=0xFFFA;
GPBDAT=0xe300;
for(i=0;
GPBDAT=0x8e00;
prdnum++;
if(prdnum>
=20)
{prdnum=0;
led1_cmp++;
if(led1_cmp>
=100)led1_cmp=0;
led2_cmp++;
if(led2_cmp>
=100)led2_cmp=0;
led3_cmp++;
if(led3_cmp>
=100)
led3_cmp=0;
CMPR1=led_tab[led1_cmp];
CMPR2=led_tab[led2_cmp];
CMPR3=led_tab[led3_cmp];
}
EVAIFRA=0x80;
PIEACK=2;
interruptvoideva_T1PINT_isr()函数为定时器1周期中断服务子程序;
当发生定时器1周期中断时进行以下操作:
GPFDAT=0x0700;
设置模式寄存器GPFDAT=0x0700,即绿灯亮灭状态为000111;
设置数据寄存器GPADAT=0x00,允许PWM输出;
设置数据寄存器GPEDAT=0xFFFA,选通红灯高八位LEDA;
设置数据寄存器GPBDAT=0xe300,即红灯亮灭状态为1110001100000000;
延时后38译码器锁存;
设置数据寄存器GPEDAT=0xFFFB,选通红灯高八位LEDB;
设置数据寄存器GPBDAT=0x8e00,即红灯亮灭状态为1110001110001110;
延时后38译码器锁存;
当经过一个周期(20ms)时,改变全比较定时器的比较寄存器CMPR1~3的值,改变输出PWM的占空比;
设置EV中断标志寄存器EVAIFRA=0x80,TI周期中断(T1PINT)标志位
置位,相应中断提出响应请求;
设置PIE中断应答寄存器PIEACK=2,对第2组中断请求进行应答使能。
interruptvoideva_CMP1INT_isr()
if(led_tab[led1_cmp]!
=0)
{
GPFTOGGLE=0x0900;
//0000100100000000
GPATOGGLE=0x04;
//0000000000000100
GPBTOGGLE=0x2400;
GPEDAT=0xFFFF;
GPBTOGGLE=0x9200;
GPEDAT=0xFFFB;
//GPBTOGGLE=0x2400;
for(i=0;
GPEDAT=0xFFFF;
EVAIFRA=2;
PIEACK=2;
interruptvoideva_CMP1INT_isr()函数为定时器A全比较器比较中断1服务子程序;
若led_tab[led1_cmp]!
=0(实际恒为1),进行以下操作:
设置取反寄存器GPFTOGGLE=0x0900,即使绿灯亮灭状态由000111变为001110;
设置取反寄存器GPATOGGLE=0x04,即允许PWM3输出;
设置数据寄存器GPEDAT=0xFFFA,选通红灯高八位LEDA;
设置取反寄存器GPBTOGGLE=0x2400,即使红灯亮灭状态由1110001110001110变为1100011110001110;
延时后锁存;
设置数据寄存器GPEDAT=0xFFFB,选通红灯低八位LEDB;
设置取反寄存器GPBTOGGLE=0x2400,即使红灯亮灭状态由1100011110001110变为1100011110101010;
设置取反寄存器GPBTOGGLE=0x9200,即使红灯亮灭状态由1100011110101010变为1100011100111000;
设置EV中断标志寄存器EVAIFRA=2,比较中断(CMP1INT)标志位置位,
相应中断提出响应请求;
interruptvoideva_CMP2INT_isr()
if(led_tab[led2_cmp]!
GPFTOGGLE=0x1200;
//0001001000000000
GPBTOGGLE=0x4900;
//GPBTOGGLE=0x4900;
EVAIFRA=4;
interruptvoideva_CMP2INT_isr()函数为定时器A全比较器比较中断2服务子程序;
若led_tab[led2_cmp]!
GPFTOGGLE=0x1200;
设置取反寄存器GPFTOGGLE=0x1200,即使绿灯亮灭状态由001110变为011100;
设置取反寄存器GPBTOGGLE=0x4900,即使红灯亮灭状态由1100011100111000变为1000111000111000;
设置取反寄存器GPBTOGGLE=0x4900,即使红灯亮灭状态由1000111000111000变为1000111001110001;
设置取反寄存器GPBTOGGLE=0x2400,即使红灯亮灭状态由1000111001110001变为1000111001010101;
设置EV中断标志寄存器EVAIFRA=4,比较中断(CMP2INT)标志位置位,
interruptvoideva_CMP3INT_isr()
if(led_tab[led3_cmp]!
GPFTOGGLE=0x2400;
//0010010000000000
GPATOGGLE=0x10;
//0000000000010000
GPEDAT=0xFFFB;
//GPBTOGGLE=0x9200;
for(i=0;
EVAIFRA=8;
interruptvoideva_CMP3INT_isr()函数为定时器A全比较器比较中断3服务子程序;
若led_tab[led3_cmp]!
GPFTOGGLE=0x2400;
设置取反寄存器GPFTOGGLE=0x2400,即使绿灯亮灭状态由011100变为111000;
设置取反寄存器GPATOGGLE=0x10,即允许PWM5输出;
设置数据寄存器GPEDAT=0xFFFA,选通红灯高八位LED