一、 实验目的
1.熟悉ARM 本身自带的八路十位A/D 控制器及相应寄存器。
2.编程实现ARM 系统的A/D 功能。
3.掌握带有A/D 的CPU 编程实现A/D 功能的主要方法。
二、 实验内容
学习A/D 接口原理,了解实现A/D 系统对于系统的软件和硬件要求。阅读ARM 芯片
文档,掌握ARM 的A/D 相关寄存器的功能,熟悉ARM 系统硬件的A/D 相关接口。利用外
部模拟信号
1.编程实现ARM 循环采集全部8路通道,并且在超级终端上显示。(不带操作系统)
2.编程实现ARM 采集某路的连续电压值,并且在屏幕上展开显示采集曲线。(带操作
系统)
三、 预备知识
1、用ARM SDT 2.5 集成开发环境,编写和调试程序的基本过程。
2、ARM 应用程序的框架结构。
3、会使用Source Insight 3 编辑C 语言源程序。
4、能够自己完成在LCD 上显示指定参量。
四、 实验设备及工具
硬件:ARM 嵌入式开发板、用于ARM7TDMI 的JTAG 仿真器、PC 机Pentumn100 以
上、模拟电压信号源
软件:PC 机操作系统win98、ARM SDT 2.51 集成开发环境、仿真器驱动程序、Source
Insight 3.0
五、 实验原理及说明
1.A/D 转换器
A/D 转换器是模拟信号源和CPU 之间联系的接口,它的任务是将连续变化的模拟信号
转换为数字信号,以便计算机和数字系统进行处理、存储、控制和显示。在工业控制和数据
采集及许多其他领域中,A/D 转换是不可缺少的。
A/D 转换器有以下类型:逐位比较型、积分型、计数型、并行比较型、电压-频率型,
主要应根据使用场合的具体要求,按照转换速度、精度、价格、功能以及接口条件等因素而
决定选择何种类型。常用的有以下两种:
(一)双积分型的A/D 转换器
双积分式也称二重积分式,其实质是测量和比较两个积分的时间,一个是对模拟输入电
压积分的时间T,此时间往往是固定的;另一个是以充电后的电压为初值,对参考电源Vncf
反向积分,积分电容被放电至零所需的时间T,(或T。等)。模拟输入电压Vi 与参考电压
VRef 之比,等于上述两个时间之比。由于VRef,T。固定,而放电时间Ti 可以测出,因而可计
算出模拟输入电压的大小(VRef 与Vi 符号相反)。
由于T。、VRef 为已知的固定常数,因此反向积分时间T1 与输入模拟电压Vi 在T。时间
内的平均值成正比。输入电压Vi 愈高,VA 愈大,T1 就愈长。在T1 开始时刻,控制逻辑同
时打开计数器的控制门开始计数,直到积分器恢复到零电平时,计数停止。则计数器所计出
的数字即正比于输入电压Vi 在T。时间内的平均值,于是完成了一次A/D 转换。
由于双积分型A/D 转换是测量输入电压Vi 在T。时间内的平均值,所以对常态干扰(串
模干扰)有很强的抑制作用,尤其对正负波形对称的干扰信号,抑制效果更好。
双积分型的A/D 转换器电路简单,抗干扰能力强,精度高,这是突出的优点。但转换
速度比较慢,常用的A/D 转换芯片的转换时间为毫秒级。例如12 位的积分型A/D 芯片
ADCETl2BC,其转换时间为lms。因此适用于模拟信号变化缓慢,采样速率要求较低,而
对精度要求较高,或现场干扰较严重的场合。例如在数字电压表中常被采用。
(二)逐次逼近型的A/D 转换器
逐次逼近型(也称逐位比较式)的A/D 转换器,应用比积分型更为广泛,其原理框图如图
6-1 所示,主要由逐次逼近寄存器SAR、D/A 转换器、比较器以及时序和控制逻辑等部分组
成。它的实质是逐次把设定的SAR 寄存器中的数字量经D/A 转换后得到电压Vc,与待转
换模拟电压V。进行比较。比较时,先从SAR 的最高位开始,逐次确定各位的数码应是“1”
还是“0”,其工作过程如下:
转换前,先将SAR 寄存器各位清零。转换开始时,控制逻辑电路先设定SAR 寄存器的
最高位为“1”,其余位为“0”,此试探值经D/A 转换成电压Vc,然后将Vc 与模拟输入电
压Vx 比较。如果Vx≥Vc,说明SAR 最高位的“1”应予保留;如果Vx<Vc,说明SAR 该
位应予清零。然后再对SAR 寄存器的次高位置“1”,依上述方法进行D/A 转换和比较。如
此重复上述过程,直至确定SAR 寄存器的最低位为止。过程结束后,状态线改变状态,表
明已完成一次转换。最后,逐次逼近寄存器SAR 中的内容就是与输入模拟量V 相对应的二
进制数字量。显然A/D 转换器的位数N 决定于SAR 的位数和D/A 的位数。图6-1(b)表示四
位A/D 转换器的逐次逼近过程。转换结果能否准确逼近模拟信号,主要取决于SAR 和D/A
的位数。位数越多,越能准确逼近模拟量,但转换所需的时间也越长。
逐次逼近式的A/D 转换器的主要特点是:
转换速度较快,在1—100μs 以内,分辨率可以达18 位,特别适用于工业控制系统。
转换时间固定,不随输入信号的变化而变化。抗干扰能力相对积分型的差。例如,对模拟输
入信号采样过程中,若在采样时刻有一个干扰脉冲迭加在模拟信号上,则采样时,包括干扰
信号在内,都被采样和转换为数字量,这就会造成较大的误差,所以有必要采取适当的滤波
措施。
2.A/D 转换的重要指标
⑴ 分辨率(Resolution):
分辨率反映A/D 转换器对输入微小变化响应的能力,通常用数字输出最低位(LSB)所对
应的模拟输入的电平值表示。n 位A/D 能反应1/2n 满量程的输入电平。由于分辨率直接与转
换器的位数有关,所以一般也可简单地用数字量的位数来表示分辨率,即n 位二进制数,最
低位所具有的权值,就是它的分辨率。
值得注意的是,分辨率与精度是两个不同的概念,不要把两者相混淆。即使分辨率很高,
也可能由于温度漂移、线性度等原因,而使其精度不够高。
⑵ 精度(Accuracy)
精度有绝对精度(Absolute Accuracy)和相对精度(Relative Accuracy)两种表示方法。
① 绝对误差
在一个转换器中,对应于一个数字量的实际模拟输入电压和理想的模拟输入电压之差并
非是一个常数。我们把它们之间的差的最大值,定义为“绝对误差”。通常以数字量的最小
有效位(LSB)的分数值来表示绝对误差,例如: ± 1LSB 等。绝对误差包括量化误差和其它
所有误差。
② 相对误差
是指整个转换范围内,任一数字量所对应的模拟输入量的实际值与理论值之差,用模拟
电压满量程的百分比表示。
例如,满量程为10V,10 位A/D 芯片,若其绝对精度为± 1/2LSB,则其最小有效位的
量化单位:9.77mV,其绝对精度为=4.88mV,其相对精度为0.048%。
⑶ 转换时间(Conversion Time)
转换时间是指完成一次A/D 转换所需的时间,即由发出启动转换命令信号到转换结束
信号开始有效的时间间隔。
转换时间的倒数称为转换速率。例如AD570 的转换时间为25us,其转换速率为40KHz。
⑷ 电源灵敏度(power supply sensitivity)
电源灵敏度是指A/D 转换芯片的供电电源的电压发生变化时,产生的转换误差。一般
用电源电压变化1%时相当的模拟量变化的百分数来表示。
⑸ 量程
量程是指所能转换的模拟输入电压范围,分单极性、双极性两种类型。
例如,单极性 量程为0~+5V,0~+10V,0~+20V;
双极性 量程为-5~+5V,-10~+10V。
⑹ 输出逻辑电平
多数A/D 转换器的输出逻辑电平与TTL 电平兼容。在考虑数字量输出与微处理器的数
据总线接口时,应注意是否要三态逻辑输出,是否要对数据进行锁存等。
⑺ 工作温度范围
由于温度会对比较器、运算放大器、电阻网络等产生影响,故只在一定的温度范围内才
能保证额定精度指标。一般A/D 转换器的工作温度范围为(0~700C),军用品的工作温度范
围为(-55~+1250C)
3.ARM 自带的十位A/D 转换器
ARM S3C440BX 芯片自带一个8路10 位A/D 转换器,该转换器可以通过软件设置为
Sleep 模式,可以节电减少功率损失,最大转换率为500K,非线性度为正负1位,其转换时
间可以通过下式计算:如果系统时钟为66MHz,比例值为9,则为
66MHz/2 (9+1)/16 (完成转换至少需要16 个时钟周期)=205.25KHz=4.85us。
ARM 芯片与A/D 功能有关的引脚为以下几个,其中AIN[7:0]为8 路模拟采集通道,
AREFT 为参考正电压,AREFB 为参考负电压,AVCOM 为模拟共电压。
转换在读操作时开始。2,3,4 位是通道号。5 位为睡眠模式设定,6 位为转换标志位(只读)。
通过该寄存器设置A/D 转换开始可以参见下例:
rADCCON=0x11(通道4开始转换)
即前四路通过电位器接倒3.3V 的电源上。
六、 实验步骤
1.不带操作系统的A/D 功能的实现
当本系统不嵌入操作系统,仅仅执行A/D 转换的单任务时,首先要设置各相关寄存器,
进行初始化,然后再开启转换。下面我们看看在不带操作系统时循环采集全部8 路通道是如
何实现的。
⑴ 学习上述A/D 转换原理,了解转换相应寄存器各位的意义。
⑵ 打开一个新工程,定义与AD 有关的三个寄存器地址和一些特殊的位命令。主要有
以下各寄存器:
/* ADC 的三个功能寄存器 */
#define rADCCON (*(volatile unsigned *)0x1d40000)
#define rADCPSR (*(volatile unsigned *)0x1d40004)
#define rADCDAT (*(volatile unsigned *)0x1d40008)
/* ADC 的各种指示符 */
#define ADCCON_FLAG 0x40 //转换标志
#define ADCCON_SLEEP 0x20 //休眠标志
#define ADCCON_ADIN0 (0x0<<2)//输入信道
#define ADCCON_ADIN1 (0x1<<2)
#define ADCCON_ADIN2 (0x2<<2)
#define ADCCON_ADIN3 (0x3<<2)
#define ADCCON_ADIN4 (0x4<<2)
#define ADCCON_ADIN5 (0x5<<2)
#define ADCCON_ADIN6 (0x6<<2)
#define ADCCON_ADIN7 (0x7<<2)
#define ADCCON_READ_START 0x2//读使转化标志
⑶ ADCDAT,转换结果数据寄存器。该寄存器的十位表示转换后的结果,全为1时为
满量程3.3 伏。
4.AD 转换器在扩展版的接法如下:
#define ADCCON_ENABLE_START 0x1//使能转化标志
将上述定义为一个AD 功能的头文件,并且加入到工程中。
⑶ 在上面的文件中添加两个执行函数,一个为初始化函数,一个为转换某路函数。
将函数放入AD 的函数库中(*.c)。
初始化函数:
void init_ADdevice()
{
rADCPSR=20; //采样率为32
rADCCON=ADCCON_SLEEP;//进入休眠模式
}
读取某路模拟量函数:
int GetADresult(int channel) //channel 为通道数
{
rADCCON=(channel<<2)|ADCCON_ENABLE_START; //启动某路转换
while(!(rADCCON&ADCCON_FLAG)); //直到转换完毕
return rADCDAT; //返回转换结果
}
⑷ 在主函数中首先初始化AD 寄存器,编程实现循环采集8路模拟量,并且在超级终
端上显示结果。
主函数如下:
int Main(int argc, char **argv)
{
int i;
float d=1024;
init_ADdevice();
Uart_Printf("\n");
while(1)
{
for(i=0;i<=7;i++)
{
d=GetADresult(i)*5.00/1024;
Uart_Printf("a%d=%f\n",i,d);
Delay(10000);
}
}
return 0;
}
⑸ 用万用表测量扩展板上电位器两端输出电压,记下输出电压。启动采集,观察转换
后的电压值是否与测量值相等。
2.带操作系统的A/D 功能实现
当系统内嵌入操作系统时,由于相当部分的工作已经被系统执行,甚至包括串行口的初
始化工作,所以A/D 功能的实现变的更加容易,下面我们看看如何周期性采集某路通道的
信号,并在LCD 上显示该信号的波形。
⑴ 打开一个已有的工程文件,在其中的主函数MAIN 中添加AD 的寄存器初始化代码,并添加键盘扫描任务。键盘扫描任务的代码如下:
void Key_Scan_Task(void *Id)
{
U32 key;
POSMSG pmsg;
Uart_Printf(0,"key\n");
for (;;){
key=GetKey();
pmsg=OSCreateMessage(OSM_KEY,(key+1)&0xffff,key>>16);
if(pmsg)
SendMessage(pmsg);
}
}
同时将A/D 转换单列为一个任务。软件部分将通道0的模拟电压经A/D 转换后到液晶
屏上展开显示。
void AD_Check_Task(void *Id)
{
int i;
float d;
init_ADdevice();
while(1)
{
if(ADOpen)
{
LCD_ChangeMode(DspGraMode);
ClearScreen();
for(i=0;i<=319;i++);
{
d=GetADresult(0)*5/1024;
Show(i,d);
OSTimeDly(1);
}
}
}
}
⑵ 在Main_Task 中添加消息响应部分,通过设置某个全局变量,当按键盘上的某个键
时(如nkey==4),变量改变,决定是否继续采集。键盘响应函数为:
void onKey(int nkey, int fnkey)
{
if(nkey==4)
if(ADOpen==True)
ADOpen=False;
else ADOpen=True;
}
AD 转换任务在执行时,将检测ADOpen 变量,判断是否开启转换。
⑶ 找一个信号发生器,使其产生0~5 伏连续变化的电压。接到A/D 的0 通道上,动
态采集电压,并在屏幕上显示出其电压波动情况(横坐标拉开,在屏幕上动态刷新)。
显示部分程序如下:
void Show(int i, float d)
{
PDC ADpdc;
U16 Point[2]={0x2e,0x00};
ADpdc=CreateDC();
TextOut(ADpdc,i,(int)(d*10),Point,TRUE, FONTSIZE_MIDDLE);
DestoryDC(ADpdc);
}
观察LCD 上显示的波形,并思考如果量程超出了测量范围,应采取何种方法测量模拟
电压。
七、 思考题
1.逐次逼近型的A/D 转换器原理是什么?
2.A/D 转换的重要指标包括哪些?
3.ARM 的A/D 功能的相关寄存器有哪几个,对应的地址是什么?
4.如何启动ARM 开始转换A/D,有几种方式?转换开始时ARM 是如何知道转换哪
路通道的?如何判断转换结束?
5.怎样动态显示某个通道的模拟电压波形?
评论
查看更多