文档库

最新最全的文档下载
当前位置:文档库 > 实验九、AD采样显示

实验九、AD采样显示

实验八:AD采样实验

一、实验目的

熟悉AD模块的基本原理及应用,能熟练的掌握将数据通过SPI发送到键盘板上显示。

二、实验设备

硬件:PC 机一台、EasyARM2103 开发板一套,键盘显示板1块。

软件:Windows98/XP/2000 系统,ADS 1.2 集成开发环境。

三、实验内容

使用AD功能,采集电压,并将采集到的电压发送到键盘板上进行显示。

四、实验预习要求

仔细阅读教材AD的说明,熟悉SPI工作原理。

五、实验步骤

1. 启动ADS 1.2,使用ARM Executable Image for lpc22xx 工程模板建立一个工程

AdSpi_c。

2. 建立C 源文件AdSpi.c,编写实验程序,然后添加到工程的user 组中。

3. 选用DebugInExram 生成目标,然后编译连接工程。

4. 将EasyARM2200 开发板上的P0.22 用跳线与1.8V电压相连。

5. 选择【Project】->【Debug】,启动AXD 进行JTAG 仿真调试。

6. 全速运行程序,查看AD采集到的电压与1.8V电压是否相等。

7.将AD采集到的电压发送到键盘板上显示。

8.改变采集电压,查看采集到的电压是否是参考电压。

六、实验参考程序

PWM 输出实验的参考程序见程序清单3.12。

程序清单4.13 AD实验

# include "config.h"

# include

# define SLA VE_CS 1 << 7 /* P0.4 口作为SPI 的片选*/

uint8 T0Flag = 0;

uint8 DATA0[8];

const uint8 digitable [11] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

/* 断码0 ,1, 2, 3 , 4 , 5 , 6 , 7 , 8 , 9 , */

const uint8 selectable[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; /* 位码*/

/***************************************************************************** ** 函数名称:DelayNS

** 功能描述:延时函数

** 入口参数:uiDly 值越大,延时时间越长

** 出口参数:无

******************************************************************************/ void DelayNS(uint32 uiDly)

{

uint32 i;

for(; uiDly > 0; uiDly--){

for(i=0; i<50000; i++);

}

}

/***************************************************************************** ** 函数名称:Timer0_InitExt()

** 功能描述:TIMER0 初始化

** 入口参数:无

** 出口参数:无

******************************************************************************/ void Timer0_InitExt(void)

{

T0TC = 0; /* 定时器设置为0 */

T0PR = 0; /* 时钟不分频*/

T0MCR = 0x03; /* 设置T0MR0匹配后复位T0TC,并产生中断标志*/

T0MR0 = Fpclk/400; /* 5毫秒定时*/

T0TCR = 0x01; /* 启动定时器*/

}

/***************************************************************************** ** 函数名称:IRQ_Timer0()

** 功能描述:TIMER0 中断服务程序

** 入口参数:无

** 出口参数:无

******************************************************************************/ void __irq IRQ_Timer0(void)

{ T0Flag = 1; // T0中断标志置位

T0IR = 0x01; // 清除中断标志

VICVectAddr = 0;

}

/****************************************************************************** ** 函数名称:IRQ_Init()

** 功能描述:设置定时器0中断IRQ

** 入口参数:无

** 出口参数:无

******************************************************************************/ void IRQ_Init(void)

{ VICIntSelect = 0x00; // 所有中断通道设置为IRQ中断VICVectCntl0 = 0x20 | 0x04; // 设置定时器0中断通道分配最高优先级

VICVectAddr0 = (uint32)IRQ_Timer0; // 设置中断服务程序地址

VICIntEnable = 1 << 0x04; // 使能定时器0中断

}

/****************************************************************************** ** 函数名称:CONVBIT0()

** 功能描述:将多位数转换为个位数,以便显示

** 入口参数:uint16 num,uint8 hor

** 出口参数:DATA0[8]

******************************************************************************/ void CONVBIT0(uint16 num,uint8 hor)

{ DA TA0[hor] = num/1000;

DA TA0[hor-1] = num%1000/100;

DA TA0[hor-2] = num%100/10;

DA TA0[hor-3] = num%10/1;

return;

}

/****************************************************************************** ** 函数名称:ADC_Init()

** 函数功能:ADC模块初始化

** 入口参数:无

** 出口参数:无

******************************************************************************/ void ADC_Init(void)

{

AD0CR = (1 << 0) | /* 选择通道0 */ (((Fpclk / 1000000) - 1) << 8) | /* 转换时钟为1MHz */

(0 << 16) | /* BURST = 0,软件控制转换操作*/

(0 << 17) | /* CLKS = 0,使用11clock 转*/

(1 << 21) | /* PDN = 1,正常工作模式*/

(0 << 22) | /* TEST = 0,正常工作模式*/

(1 << 24) | /* 设置直接启动模式*/

(0 << 27 ); /* 设置模式,直接启动模式下无效*/

}

/***************************************************************************** ** 函数名称:MSPIInit

** 功能描述:初始化SPI 接口,设置为主机

** 入口参数:无

** 出口参数:无

******************************************************************************/ void MSPIInit(void)

{ PINSEL0 = (PINSEL0 & ~(0x0000FF00)) | 0x00001500; /* 设置SPI 引脚连接*/ SPI_SPCCR = 0x08; /* 设置SPI 时钟分频*/ SPI_SPCR = (0<<3) | /* CPHA=0,数据在SCK 的第一个跳变沿采样*/ (1<<4) | /* CPOL=1,时钟为低有效*/

(1<<5) | /* 设置为主机*/

(0<<6) | /* LSBF=0,数据传输MSB 在先*/

(0<<7); /* SPI 中断使能*/ }

/***************************************************************************** ** 函数名称:MSPISendData

** 功能描述:SPI 主模式发送数据

** 入口参数:uiData :将要发送的数据

** 出口参数:S0SPDR:返回值为读取的数据无

******************************************************************************/ uint8 MSPISendData(uint8 uiData)

{

SPI_SPDR = uiData;

while ((SPI_SPSR & 0x80) == 0); /* 等待数据发送完毕*/ return(SPI_SPDR);

}

/****************************************************************************** ** 函数名称:main

** 功能描述:利用ADC 对通道0 的电压进行采样,并把值发送到PC 机显示出来

** 入口参数:无

** 出口参数:无

******************************************************************************/ int main(void)

{ uint16 uiVal;

char cStr[20];

uint8 x = 0;

uint16 num = 0;

uint8 k = 0;

PINSEL1 = PINSEL1 & (~(0x03 << 12)); /* 将P0.22 设置为AD 功能*/ PINSEL1 = PINSEL1 | (0x03 << 12);

IO0DIR = SLA VE_CS; /* 设置SPI 片选为输出*/ IOSET = SLA VE_CS;

MSPIInit(); /* 初始化SPI 接口*/ Timer0_InitExt();

IRQ_Init(); /*设置定时器0中断*/ IRQEnable();

ADC_Init(); /* ADC模块初始化*/ while(1) {

if(T0Flag)

{ T0Flag = 0;

num++;

if(num == 100)

{ num = 0;

/* 启动AD 转换*/

AD0CR |= (1 <<24);

while ((AD0STAT & 0x01) == 0); /* 读取AD0STAT 的通道0 的Done */

AD0CR |= (1 <<24);

while ((AD0STAT & 0x01) == 0); /* 读取AD0STAT 的通道0 的Done */

DelayNS(1); /* 至少等待11 个AD 转换时钟后才

读取数据否则会造成死等待*/ uiVal = AD0DR0;

uiVal = (uiVal >> 6) & 0x3FF;

uiVal = (uiVal * 3300)/1024; /* ADC 的参考电压为3300mV */

CONVBIT0(uiV al,3);

sprintf(cStr,"%4d mV VIN0", uiVal); /* 格式化显示数据*/

}

x = DATA0[k];

IOCLR = SLA VE_CS; /* 片选SSP */

MSPISendData(digitable[x]); /* 发送显示数据*/

MSPISendData(~selectable[k]); /* 发送位码*/

IOSET = SLA VE_CS;

if(k==7)

k=0;

else

k++;

}

}

return (0);

}

3.11.7 思考

1、在实验参考程序中,若需要更改AD通道,如何修改程序?

2、将实验数据发送到键盘板显示,数据应该怎样处理?