微机原理EV实验报告.docx

上传人:b****8 文档编号:9386111 上传时间:2023-02-04 格式:DOCX 页数:21 大小:71.68KB
下载 相关 举报
微机原理EV实验报告.docx_第1页
第1页 / 共21页
微机原理EV实验报告.docx_第2页
第2页 / 共21页
微机原理EV实验报告.docx_第3页
第3页 / 共21页
微机原理EV实验报告.docx_第4页
第4页 / 共21页
微机原理EV实验报告.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

微机原理EV实验报告.docx

《微机原理EV实验报告.docx》由会员分享,可在线阅读,更多相关《微机原理EV实验报告.docx(21页珍藏版)》请在冰豆网上搜索。

微机原理EV实验报告.docx

微机原理EV实验报告

 

专业:

电气工程及其自动化

姓名:

学号:

日期:

2014.12.11

地点:

实验报告

课程名称:

微机原理及其应用指导老师:

徐习东成绩:

实验名称:

EV实验实验类型:

同组学生姓名:

 

1实验内容与要求…………………………………………………………

(2)

2实验原理…………………………………………………………………

(2)

2.1脉冲宽度调制(PWM)……………………………………………………

(2)

2.2PWM控制LED的渐变闪烁……………………………………………

(2)

3程序设计与分析…………………………………………………………

(2)

3.1主程序设计流程图………………………………………………………

(2)

3.2程序段设计与分析………………………………………………………

(2)

4实验思考………………………………………………………………(15)

 

一、实验内容与要求

1、利用事件管理器实现TMS320F2812实验目标板上的绿灯与红灯的渐变闪烁;

2、通过实验,掌握TMS320F2812事件管理器的使用方法。

二、实验原理

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;//f8~f13

GPEDIR=0x0007;

GPBMUX=0x00ff;//f8~f13

GPBDIR=0xFF00;

GPEDAT=0xFFFA;

GPBDAT=0xe300;

for(i=0;i<100;i++){}

GPEDAT=0xFFFF;

GPEDAT=0xFFFB;

GPBDAT=0xe300;

for(i=0;i<100;i++){}

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,选通红灯低八位;

设置数据寄存器GPBDAT=0xe300;即红灯亮灭状态为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中断;

CMP1INTVector=&eva_CMP1INT_isr;

CMP2INTVector=&eva_CMP2INT_isr;

CMP3INTVector=&eva_CMP3INT_isr;

T1PINTVector=&eva_T1PINT_isr;

以上语段用于关联相应中断服务子程序地址与对应的中断向量表,即将中断服务子程序的地址赋给中断向量表。

程序段

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;

CMPR2=led2_cmp;

CMPR3=led3_cmp;

上述语段用于比较寄存器CMPR1~3值的动态变化,实现占空比的改变;

设置EVAIMRA=0x8e,使能定时器1的周期中断和比较中断以及全比较器1~3的比较中断。

设置EVA中断标志寄存器EVAIFRA=0,清除中断标志。

程序段

interruptvoideva_T1PINT_isr()

{

inti;

GPFDAT=0x0700;//0000011100000000

GPADAT=0x00;//00000000

GPEDAT=0xFFFA;

GPBDAT=0xe300;

for(i=0;i<100;i++){}

GPEDAT=0xFFFF;

GPEDAT=0xFFFB;

GPBDAT=0x8e00;

for(i=0;i<100;i++){}

GPEDAT=0xFFFF;

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;//0000011100000000

GPADAT=0x00;//00000000

GPEDAT=0xFFFA;

GPBDAT=0xe300;

for(i=0;i<100;i++){}

GPEDAT=0xFFFF;

GPEDAT=0xFFFB;

GPBDAT=0x8e00;

for(i=0;i<100;i++){}

GPEDAT=0xFFFF;

设置模式寄存器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()

{

inti;

if(led_tab[led1_cmp]!

=0)

{

GPFTOGGLE=0x0900;//0000100100000000

GPATOGGLE=0x04;//0000000000000100

GPBTOGGLE=0x2400;

GPEDAT=0xFFFA;

for(i=0;i<100;i++){}

GPEDAT=0xFFFF;

GPBTOGGLE=0x2400;

GPBTOGGLE=0x9200;

GPEDAT=0xFFFB;

//GPBTOGGLE=0x2400;

for(i=0;i<100;i++){}

GPEDAT=0xFFFF;

}

EVAIFRA=2;

PIEACK=2;

}

interruptvoideva_CMP1INT_isr()函数为定时器A全比较器比较中断1服务子程序;

若led_tab[led1_cmp]!

=0(实际恒为1),进行以下操作:

GPFTOGGLE=0x0900;//0000100100000000

GPATOGGLE=0x04;//0000000000000100

GPBTOGGLE=0x2400;

GPEDAT=0xFFFA;

for(i=0;i<100;i++){}

GPEDAT=0xFFFF;

GPBTOGGLE=0x2400;

GPBTOGGLE=0x9200;

GPEDAT=0xFFFB;

//GPBTOGGLE=0x2400;

for(i=0;i<100;i++){}

GPEDAT=0xFFFF;

设置取反寄存器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)标志位置位,

相应中断提出响应请求;

设置PIE中断应答寄存器PIEACK=2,对第2组中断请求进行应答使能。

程序段

interruptvoideva_CMP2INT_isr()

{

inti;

if(led_tab[led2_cmp]!

=0)

{

GPFTOGGLE=0x1200;//0001001000000000

GPBTOGGLE=0x4900;

GPEDAT=0xFFFA;

for(i=0;i<100;i++){}

GPEDAT=0xFFFF;

GPBTOGGLE=0x4900;

GPBTOGGLE=0x2400;

GPEDAT=0xFFFB;

//GPBTOGGLE=0x4900;

for(i=0;i<100;i++){}

GPEDAT=0xFFFF;

}

EVAIFRA=4;

PIEACK=2;

}

interruptvoideva_CMP2INT_isr()函数为定时器A全比较器比较中断2服务子程序;

若led_tab[led2_cmp]!

=0(实际恒为1),进行以下操作:

GPFTOGGLE=0x1200;//0001001000000000

GPBTOGGLE=0x4900;

GPEDAT=0xFFFA;

for(i=0;i<100;i++){}

GPEDAT=0xFFFF;

GPBTOGGLE=0x4900;

GPBTOGGLE=0x2400;

GPEDAT=0xFFFB;

//GPBTOGGLE=0x4900;

for(i=0;i<100;i++){}

GPEDAT=0xFFFF;

设置取反寄存器GPFTOGGLE=0x1200,即使绿灯亮灭状态由001110变为011100;

设置数据寄存器GPEDAT=0xFFFA,选通红灯高八位LEDA;

设置取反寄存器GPBTOGGLE=0x4900,即使红灯亮灭状态由1100011100111000变为1000111000111000;

延时后锁存;

设置数据寄存器GPEDAT=0xFFFB,选通红灯低八位LEDB;

设置取反寄存器GPBTOGGLE=0x4900,即使红灯亮灭状态由1000111000111000变为1000111001110001;

设置取反寄存器GPBTOGGLE=0x2400,即使红灯亮灭状态由1000111001110001变为1000111001010101;

延时后锁存;

设置EV中断标志寄存器EVAIFRA=4,比较中断(CMP2INT)标志位置位,

相应中断提出响应请求;

设置PIE中断应答寄存器PIEACK=2,对第2组中断请求进行应答使能。

程序段

interruptvoideva_CMP3INT_isr()

{

inti;

if(led_tab[led3_cmp]!

=0)

{

GPFTOGGLE=0x2400;//0010010000000000

GPATOGGLE=0x10;//0000000000010000

GPBTOGGLE=0x9200;

GPEDAT=0xFFFA;

for(i=0;i<100;i++){}

GPEDAT=0xFFFF;

GPBTOGGLE=0x9200;

GPBTOGGLE=0x4900;

GPEDAT=0xFFFB;

//GPBTOGGLE=0x9200;

for(i=0;i<100;i++){}

GPEDAT=0xFFFF;

}

EVAIFRA=8;

PIEACK=2;

}

interruptvoideva_CMP3INT_isr()函数为定时器A全比较器比较中断3服务子程序;

若led_tab[led3_cmp]!

=0(实际恒为1),进行以下操作:

GPFTOGGLE=0x2400;//0010010000000000

GPATOGGLE=0x10;//0000000000010000

GPBTOGGLE=0x9200;

GPEDAT=0xFFFA;

for(i=0;i<100;i++){}

GPEDAT=0xFFFF;

GPBTOGGLE=0x9200;

GPBTOGGLE=0x4900;

GPEDAT=0xFFFB;

//GPBTOGGLE=0x9200;

for(i=0;i<100;i++){}

GPEDAT=0xFFFF;

设置取反寄存器GPFTOGGLE=0x2400,即使绿灯亮灭状态由011100变为111000;

设置取反寄存器GPATOGGLE=0x10,即允许PWM5输出;

设置数据寄存器GPEDAT=0xFFFA,选通红灯高八位LED

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1