原创 ARM9工控主板内嵌AD的应用--成都英创信息技术有限公司

2009-5-8 09:31 819 2 2 分类: MCU/ 嵌入式

文章来源:http://www.emtronix.com/article/article2009274.html


  英创公司推出的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 GPIO4GPIO5 
 EM9160 GPIO4GPIO5

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


20095617622740.jpg


在工程中加入EM9X60_ADC_API.h文件


20095617652833.jpg


在应用程序中添加EM9X60_ADC_API.h头文件


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

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


20095617740384.jpg



 
      设置好后,点击“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输出的数据


      基本应用框图:


20095617759580.jpg


 


      应用示例:

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


 


[查看全文]


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
2
关闭 站长推荐上一条 /3 下一条