ARM9工控主板内嵌AD的应用

 2009-5-6          [nemail]    
[lablebox]

        英创公司推出的ARM9 嵌入式工控主板产品系列,均预装了正版WinCE5.0 操作系统。支持微软公司的eVC 进行应用程序的开发。eVC 是微软针对嵌入式系统提供的一套功能完善且可免费获取的开发工具,与PC 平台通用的VC 保持了高度的一致性,同时考虑C/C++的执行效率,因此eVC 被作为英创ARM9 工控主板上应用程序开发的首选工具。在利用英创ARM9 工控主板进行产品开发时,可能会出现简单的模拟信号的采集。因此,英创公司的EM9260和EM9160就考虑到了这些应用,引出了系统自带的ADC(Analog-to-digital Converter)接口,并提供相应的程序库,方便客户的使用。

 

        EM9260有2路ADC,EM9160有2路ADC,均是与GPIO复用:

                采样速度:300kSPS

                数据宽度:10位

                基准信号:3.3V

                量程范围:0 – 3.3V

                信号输入:


 

ADC0

ADC1

EM9260

GPIO4

GPIO5

EM9160

GPIO4

GPIO5


 

        在使用ADC的时候,将“EM9X60_ADC_API.lib”和 “EM9X60_ADC_API.h”两个文件放在工程目录下,并在应用程序中加入“EM9X60_ADC_API.h”文件,如下图所示:

 

 

        然后对工程进行设置,主要是使工程链接EM9X60_ADC_API.lib库文件。

 

        从“Project”菜单下,打开工程的 “settings”项(或是快捷键“ALT+F7”),在“LINK”选项中的“Object/library modules:”栏,加入“EM9X60_ADC_API.lib”,如下图所示:

 

        设置好后,点击“OK”确认。应当注意的是,在工程中的“Debug”和“Release”两个状态下都要进行分别设置。

 

        由于是和GPIO复用,所以使用ADC后,GPIO功能将不能使用。具体操作函数如下:

 

        启动ADC:

        BOOL StartADC( int ChIndex );

        输入参数:

                ChIndex 要启动的ADC的通道号,仅0和1有效

        返回值:

                启动成功,返回TRUE;启动失败,返回FALSE

 

        读取ADC数据:

        DWORD GetADC(int ChIndex);

        输入参数:

                ChIndex 要读取数据的ADC的通道号,仅0和1有效

        返回值:

                0xffffffff:数据没有转换好

        其它:

                可用的ADC输出的数据

 

        基本应用框图:

 

        应用示例:

 

        bStart_AD=StartADC(nChr); // 启动ADC,其中,nChr为要启动的ADC通道号

        if ( bStart_AD != TRUE ) // 判断ADC是否启动成功

        {

                printf('ADC%d Initialize Fail!!\n',nChr);

                return -1;

        }

        printf('ADC%d Initialize OK!!\n',nChr);

        for (ni=0 ; ni<20 ; ni++ )

        {

                Do 

                        dwtmp = GetADC(nChr); // 数据读取 

                while( dwtmp == Invalid ); // 判断数据是否为有效数据

                dwCLDATA[ni] = dwtmp; // ADC数据缓存

        }

        dwAverage=0; // ADC数据处理,在这里,是进行了20次的平均

        for (ni=0 ; ni<20 ; ni++ ) // 然后再算出相应的输入信号的电压值并打印出来

        dwAverage+=dwCLDATA[ni];

        dwAverage/=20;

        // ref 3.3V 10位 (1023)

        // 电压分辨率Div约为3.2mV

        fVot=(float) (dwAverage*Div)/1000;

        printf('ADC%d Vot %1.2f V\r',nChr,fVot);

        Sleep(500);

[lablebox]