文档库

最新最全的文档下载
当前位置:文档库 > 微机原理EV实验报告

微机原理EV实验报告

微机原理EV实验报告

实验报告

微机原理EV实验报告

课程名称: 微机原理及其应用 指导老师: 徐习东 成绩: 实验名称: EV 实验 实验类型: 同组学生姓名:

目录

1 实验内容与要求 ..................................................................(2) 2 实验原理 (2)

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

2.2 PWM 控制LED 的渐变闪烁 (2)

3 程序设计与分析 (2)

3.1主程序设计流程图............................................................... (2) 3.2 程序段设计与分析 (2)

4 实验思考 (15)

专业: 电气工程及其自动化 姓名: 学号:

日期: 2014.12.11 地点:

微机原理EV实验报告

一、实验内容与要求

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

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

二、实验原理

1、脉冲宽度调制(PWM)

固定幅值、周期,通过改变占空比使得波形能量与要求的波形基本相等。脉宽调制可以直接从DSP输出。

2、PWM控制LED的渐变闪烁

事件管理器(EV)的比较单元又称为全比较/PWM单元,功能主要用来产生PWM波形,每一个比较单元可以产生一对(两路)互补的PWM波,每一路PWM 波可以控制一个LED的亮灭状态。

通过动态改变PWM波的占空比来调节LED在一个周期内的点亮时间,由于PWM波频率很高,超出人眼分辨率,在人眼里就是连续的灯光,按照渐变占空比的变化,就可以表现为LED亮度的不断变化。

三、程序设计与分析

1、主程序设计流程图

系统初始化

关闭中断初始化CPU_int 初始化I/O 初始化EV

初始化PIE 赋比较初值低功耗模式等待中断

2、程序段设计与分析

程序段○1

void Init_Sys(void); /*初始化系统*/

void Init_IOF(void); /*初始化IO*/

微机原理EV实验报告

void Init_timer0(void); /*初始化CPUTIMER*/

void Init_CPUint(void); /*初始化CPU_int*/

void Init_PIEint(void); /*初始化PIE_int*/

void Init_EV(void); /*初始化EV*/

//interrupt void CPU_timer0_isr(void);

interrupt void eva_T1PINT_isr(void);

interrupt void eva_CMP1INT_isr(void);

interrupt void eva_CMP2INT_isr(void);

interrupt void eva_CMP3INT_isr(void);

int prdnum;

int led1_cmp;

int led2_cmp;

int led3_cmp;

该程序段对系统初始化函数、GPIO初始化函数、CPUint初始化函数、PIE 初始化函数、EV初始化函数以及T1周期中断子程序和三个比较中断子程序进行了声明。

该程序段还对相关全局变量进行了定义。

程序段○2

int led_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)。

程序段○3

void Init_Sys(void) /*初始化系统*/

{

PLLCR=0xA;

微机原理EV实验报告

PCLKCR=0xffff; HISPCP=0x1; //default LOSPCP=0x2; //default WDCR=0x68; //disable w d

LPMCR0=0x0; //Low power --Idle }

void Init_Sys(void)函数用于初始化系统。

设置锁相环寄存器PLLCR=0xA ,外部晶振为OSCCLK=30MHz ,因此系统

时钟3010

15022

OSCCLK PLLCR SYSCLKOUT MHz MHz ??=

==。 设置外设时钟控制寄存器PCLKCR=0xffff ,使能片内各种相关外设时钟。 设置高速外设时钟预定标寄存器HISPCP=0x1,则高速外设时钟为

150

75221

SYSCLKOUT HSPCLK MHz MHz HISPCP ===??。

设置低速外设时钟预定标寄存器LOSPCP=0x2,则低速外设时钟为

150

37.5222

SYSCLKOUT LSPCLK MHz MHz LOSPCP ===??。

设置看门狗控制寄存器WDCR=0x68,关闭看门狗。

设置低功耗模式控制寄存器LPMCR0=0x0,选择IDLE 模式。

程序段○

4 void Init_IOF(void) /*初始化IO*/

{

int i;

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;

微机原理EV实验报告

GPBDAT=0xe300;

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

GPEDAT=0xFFFF;

GPAMUX=0x1; //PWM1 active

GPADIR=0x3F; //GPIOA_3~5

GPADAT=0x00;

}

void Init_IOF(void)函数用于初始化GPIO口。

软件设置和操作流程说明如下:

设置模式寄存器GPFMUX的高八位为0,使GPIOF8~13引脚配置为通用数字I/O模式;

设置方向寄存器GPFDIR的8~13位为1,使GPIOF相关引脚配置为输出;

设置数据寄存器GPFDAT的10~13位为0,8~10位为1,即点亮绿灯前三位,灭掉后三位,绿灯亮灭状态为00 0111(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;即红灯亮灭状态为1110 0011 0000 0000;

延时后锁存;

设置数据寄存器GPEDAT=0xFFFB,即GPEDAT的GPIOE2~0位为011,选通红灯低八位;

设置数据寄存器GPBDAT=0xe300;即红灯亮灭状态为1110 0011 1110 0011;

延时后锁存;

设置模式寄存器GPAMUX=0x1,即设置GPIOA为PWM1口;

设置方向寄存器GPADIR=0x3F(0000 0000 0011 1111),即设置0~5位为PWM1~PWM6输出;

程序段○5

void Init_CPUint(void) /*初始化CPU_int*/

{

IFR=0x0;

IER=0x3;

}

微机原理EV实验报告

void Init_CPUint(void)函数用于初始化CPUint;

设置CPU中断标志寄存器IFR=0x0,清除中断标志;

设置CPU中断使能寄存器IER=0x3,使能第3位对应的中断服务;

程序段○6

void Init_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;

}

void Init_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;

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

程序段○7

void Init_EV(void) /*初始化EV*/

{

EXTCONA=1;

GPTCONA=0x0010;

T1CON =0x17ca;

微机原理EV实验报告

T1PR =586;

COMCONA=0x82e0;

ACTRA =0x1;

DBTCONA= 00;

CMPR1=led1_cmp;

CMPR2=led2_cmp;

CMPR3=led3_cmp;

EV AIMRA=0x8e;

EV AIFRA=0;

}

void Init_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值的动态变化,实现占空比的改变;

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

设置EV A中断标志寄存器EV AIFRA=0,清除中断标志。

程序段○8

interrupt void eva_T1PINT_isr()

{

int i;

GPFDAT= 0x0700; //0000 0111 0000 0000

GPADAT=0x00; //0000 0000

GPEDAT=0xFFFA;

微机原理EV实验报告

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];

}

EV AIFRA=0x80;

PIEACK= 2;

}

interrupt void eva_T1PINT_isr()函数为定时器1周期中断服务子程序;当发生定时器1周期中断时进行以下操作:

GPFDAT= 0x0700; //0000 0111 0000 0000

GPADAT=0x00; //0000 0000

GPEDAT=0xFFFA;

GPBDAT=0xe300;

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

GPEDAT=0xFFFF;

GPEDAT=0xFFFB;

GPBDAT=0x8e00;

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

微机原理EV实验报告

GPEDAT=0xFFFF;

设置模式寄存器GPFDAT= 0x0700,即绿灯亮灭状态为00 0111;

设置数据寄存器GPADAT=0x00,允许PWM输出;

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

设置数据寄存器GPBDAT=0xe300,即红灯亮灭状态为1110 0011 0000 0000;

延时后38译码器锁存;

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

设置数据寄存器GPBDAT=0x8e00,即红灯亮灭状态为1110 0011 1000 1110;

延时后38译码器锁存;

当经过一个周期(20ms)时,改变全比较定时器的比较寄存器CMPR1~3的值,改变输出PWM的占空比;

设置EV中断标志寄存器EV AIFRA=0x80,TI周期中断(T1PINT)标志位置位,相应中断提出响应请求;

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

程序段○9

interrupt void eva_CMP1INT_isr()

{

int i;

if(led_tab[led1_cmp]!=0)

{

GPFTOGGLE=0x0900; //0000 1001 0000 0000

GPATOGGLE=0x04; //0000 0000 0000 0100

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;

}

EV AIFRA= 2;

PIEACK = 2;

}

微机原理EV实验报告

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

若led_tab[led1_cmp]!=0(实际恒为1),进行以下操作:

GPFTOGGLE=0x0900; //0000 1001 0000 0000

GPATOGGLE=0x04; //0000 0000 0000 0100

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,即使绿灯亮灭状态由00 0111变为00 1110;

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

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

设置取反寄存器GPBTOGGLE=0x2400,即使红灯亮灭状态由1110 0011 1000 1110变为1100 0111 1000 1110;

延时后锁存;

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

设置取反寄存器GPBTOGGLE=0x2400,即使红灯亮灭状态由1100 0111 1000 1110变为1100 0111 1010 1010;

设置取反寄存器GPBTOGGLE=0x9200,即使红灯亮灭状态由1100 0111 1010 1010变为1100 0111 0011 1000;

延时后锁存;

设置EV中断标志寄存器EV AIFRA=2,比较中断(CMP1INT)标志位置位,相应中断提出响应请求;

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

程序段○10

interrupt void eva_CMP2INT_isr()

{

int i;

if(led_tab[led2_cmp]!=0)

微机原理EV实验报告

{

GPFTOGGLE=0x1200; //0001 0010 0000 0000

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;

}

EV AIFRA= 4;

PIEACK = 2;

}

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

若led_tab[led2_cmp]!=0(实际恒为1),进行以下操作:

GPFTOGGLE=0x1200; //0001 0010 0000 0000

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,即使绿灯亮灭状态由00 1110变为01 1100;

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

设置取反寄存器GPBTOGGLE=0x4900,即使红灯亮灭状态由1100 0111 0011

微机原理EV实验报告

1000变为1000 1110 0011 1000;

延时后锁存;

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

设置取反寄存器GPBTOGGLE=0x4900,即使红灯亮灭状态由1000 1110 0011 1000变为1000 1110 0111 0001;

设置取反寄存器GPBTOGGLE=0x2400,即使红灯亮灭状态由1000 1110 0111 0001变为1000 1110 0101 0101;

延时后锁存;

设置EV中断标志寄存器EV AIFRA=4,比较中断(CMP2INT)标志位置位,相应中断提出响应请求;

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

程序段○11

interrupt void eva_CMP3INT_isr()

{

int i;

if(led_tab[led3_cmp]!=0)

{

GPFTOGGLE=0x2400; //0010 0100 0000 0000

GPATOGGLE=0x10; //0000 0000 0001 0000

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;

}

EV AIFRA= 8;

PIEACK = 2;

}

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

微机原理EV实验报告

若led_tab[led3_cmp]!=0(实际恒为1),进行以下操作:

GPFTOGGLE=0x2400; //0010 0100 0000 0000

GPATOGGLE=0x10; //0000 0000 0001 0000

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,即使绿灯亮灭状态由01 1100变为11 1000;

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

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

设置取反寄存器GPBTOGGLE=0x9200,即使红灯亮灭状态由1000 1110 0101 0101变为0001 1100 0101 0101;

延时后锁存;

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

设置取反寄存器GPBTOGGLE=0x9200,即使红灯亮灭状态由0001 1100 0101 0101变为0001 1100 1101 0111;

设置取反寄存器GPBTOGGLE=0x4900,即使红灯亮灭状态由0001 1100 1101 0111变为0001 1100 1001 1110;

延时后锁存;

设置EV中断标志寄存器EV AIFRA=8,比较中断(CMP3INT)标志位置位,相应中断提出响应请求;

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

程序段○12

void Init_timer0(void) /*初始化CPUTIMER*/

{

TIMER0TPR=150; //f8~f13

TIMER0TPRH=0;

TIMER0PRD=(long)(1000*25);

TIMER0TCR=0xf000;

微机原理EV实验报告

}

void Init_timer0(void)函数用于初始化CPUTIMER;

设置周期为25ms.

程序段○13

interrupt void CPU_timer0_isr()

{

PIEACK=1;

}

interrupt void CPU_timer0_isr()函数为CPU定时器中断服务子程序;

设置PIE中断应答寄存器PIEACK=1,使能PIE中断应答。

程序段○14

void main(void)

{

int i;

DINT;

EALLOW;

Init_Sys(); /*初始化系统*/

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

Init_IOF(); /*初始化IO*/

Init_CPUint(); /*初始化CPU_int*/

Init_PIEint(); /*初始化CPU_int*/

Init_EV(); /*初始化EV*/

EDIS;

EINT;

prdnum=0;

led1_cmp=0;

led2_cmp=17;

led3_cmp=33;

for(;;)

{asm(" IDLE");

asm(" IDLE");

}

}

void main(void)为函数主程序;

关中断,对相关函数进行初始化后打开中断,并对比较寄存器进行赋初值,

微机原理EV实验报告

等待中断到来;

低功耗模式选择IDLE模式。

四、实验思考

这次实验是事件管理器控制LED渐变闪烁实验,硬件上涉及了红灯和绿灯LED,程序设计用到了CPU定时器、PIE中断、事件管理器的周期中断与比较中断等知识,通过这次实验的练习,我了解了事件管理器输出PWM波形和用PWM波控制LED亮灭以及动态调整PWM占空比对控制对象的影响(本实验体现在LED亮度变化上)等方面的知识和相关资源的软件设置方法,进一步理解了CPU定时器、PIE中断以及EV中断的工作流程。