文档详情

嵌入式系统设计与实例开发.ppt

发布:2017-09-26约字共66页下载文档
文本预览下载声明
A/D接口及采样实现 A/D转换器是摸拟信号源和CPU之间联系的接口,它的任务是将连续变化的摸拟信号转换为数字信号,以便计算机和数字系统进行处理、存储、控制和显示。在工业控制和数据采集及许多其他领域中,A/D转换是不可缺少的。 ARM S3C440BX芯片自带一个8路10位A/D转换器,该转换器可以通过软件设置为Sleep摸式,可以节电减少功率损失,最大转换率为500K,非线性度为正负1位。 其转换时间可以通过下式计算:如果系统时钟为66MHz,比例值为9,则为 66MHz/2 (9+1)/16 (完成转换至少需要16个时钟周期)=205.25KHz(相当于4.85us) 与AD相关的寄存器主要是如下三个: ADCPSR:采样比率寄存器。 通过设置该寄存器,可以设置采样率,最后得到的除数因子 =2(寄存器值+1)。 ADCDAT:转换结果数据寄存器。该寄存器的十位表示转换后的结果,全为1时为满量程3.3伏。 ⑴?????????? ADCCON:采样控制寄存器。其地址和意义参见下表: 该寄存器的0位是转换使能位,写1表示转换开始。1位是读操作使能转换,写1表示转换在读操作时开始。2、3、4位是通道号。5位为睡眠摸式设定,6位为转换标志位(只读)。 rADCCON=0x11(通道4开始转换) 初始化函数: void init_ADdevice() { rADCPSR=20; //采样率为32 rADCCON=ADCCON_SLEEP;//进入休眠摸式 } 读取某路摸拟量函数: int GetADresult(int channel) //channel为通道数 { rADCCON=(channel2)|ADCCON_ENABLE_START; //启动某路转换 while(!(rADCCONADCCON_FLAG));   //直到转换完毕 return rADCDAT; //返回转换结果 } 主函数如下: 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; } 带操作系统的A/D功能实现 当系统内嵌入操作系统时,由于相当部分的工作已经被系统执行,甚至包括串行口的初始化工作,所以A/D功能的实现变得更加容易,下面我们看看如何周期性采集某路通道的信号,并在LCD上显示该信号的波形。 void AD_Check_Task(void *Id) { int i=0; float d; int oldx,oldy; PDC ADpdc; ADpdc=CreateDC(); init_ADdevice(); SetDrawOrg(ADpdc, 0,LCDHEIGHT, oldx, oldy); //设置原点 while(1) { if(ADOpen) //AD采集开关,按4键有效 {d=GetADresult(0)*3.3/1024;//采集数据,并处理 //在屏幕上展开显示采集曲线 if(i=LCDWIDTH-1) { i=0; ClearScreen(); } OSSemPend(Lcd_Disp_Sem,0, err);//得到信号量 SetPixel(ADpdc,i,(int)(-d*LCDHEIGHT/3.3),ADpdc-PenColor); OSMboxPost(LCDFresh_MBox,(void*)1); //刷新LCD OSSemPost(Lcd_Disp_Sem);//发送信号量 i++; } else //AD 开关:关 { ClearScreen(); i=0; } OSTimeDly(10); } } 在Main_Task中添加消息响应部分,通过设置某个全局变量,当按键盘上的某个键时(如nkey==4),变量改变,决定是否继续采集。键盘响应函数为: v
显示全部
相似文档