S3C2440之ADC

S3C2440包含一个8通道A/D转换器,有10位分辨率下面简要介绍一下S3C2440中ADC的用法:

用到的寄存器:

      ADCCON:ADC控制寄存器

      ADCDAT0:ADC转换数据寄存器

      SUBSRCPND:次级源挂起寄存器

      INTSUBMSK:中断次级屏蔽寄存器

      SRCPND:源挂起寄存器

      INTPND:中断挂起寄存器

      INTMSK:中断屏蔽寄存器

      ADCCON:AD控制寄存器

      ADCDAT0:AD转换数据寄存器

1,首先设置控制寄存器ADCCON的相应位来选择频率和通道:

[html]  view plain  copy
  1. rADCCON = (1<<14)|(preScaler<<6)|(ch<<3); //setup channel,分频使能,写入分频值,选择通道  
其中PreScaler是预分频值,决定 A/D转换器频率 = 50MHz/(49+1) = 1MHz

如图:


2,然后启动AD并等待启动位ADCCON[0]清0和转换结束位ADCCON[15]置1:

[html]  view plain  copy
  1. rADCCON|=0x1;   //start ADC开始转换  
  2.   
  3. while(rADCCON & 0x1);   //check if Enable_start is low等待启动位清零,转换启动结束  
  4. while(!(rADCCON & 0x8000)); //check if EC(End of Conversion) flag is high等待转换结束  

3,最后读取相应通道转换结果寄存器的值:

寄存器ADCDAT0的低10位用于存储A/D转换后的数据。

[html]  view plain  copy
  1. return ( (int)rADCDAT0 & 0x3ff );//返回0~9位的采样值,0~1023  
[html]  view plain  copy
  1. a0=ReadAdc(0); //对应开发板上W1可调电阻  
  2. a1=ReadAdc(1); //对应开发板上W2可调电阻  

OK!

有必要介绍一下寄存器ADCCON:

如下图:


寄存器ADCCON的第15位用于标识A/D转换是否结束。第14位用于使能是否进行预分频,而第6位到第13位则存储的是预分频数值,因为A/D转换的速度不能太快,所以要通过预分频处理才可以得到正确的A/D转换速度,如我们想要得到A/D转换频率为1MHz,则预分频的值应为49。第3位到第5位表示的是A/D转换的通道选择。第2位可以实现A/D转换的待机模式。第1位用于是否通过读取操作来使能A/D转换的开始。第0位则是在第1位被清零的情况下用于开启A/D转换。


ADC.c源码,可实现超级终端显示adc0,adc1转换后的结果0-1023,adc0可通过滑动变阻器调节输入电压

[html]  view plain  copy
  1. //====================================================================  
  2. // File Name : Adc.c  
  3. // Function  : S3C2410 ADC Test   
  4. // Program   : Kang, Weon Tark   
  5. // Date      : May 22, 2002  
  6. // Version   : 0.0  
  7. // History  
  8. //   0.0 : Programming start (March 29,2002) -> KWT  
  9. //         ADC Test                          -> May 15, 2002 SOP  
  10. //====================================================================  
  11.   
  12. #include "def.h"  
  13. #include "option.h"  
  14. #include "2440addr.h"  
  15. #include "2440lib.h"  
  16. #include "2440slib.h"   
  17.   
  18. #define REQCNT 100              //May 08, 2002 SOP  
  19. #define ADC_FREQ 2500000  
  20. //#define ADC_FREQ   1250000  
  21. //#define LOOP 1  
  22. #define LOOP 10000  
  23.   
  24. volatile U32 preScaler;  
  25.   
  26. //==================================================================================          
  27. int ReadAdc(int ch)  
  28. {  
  29.     int i;  
  30.     static int prevCh=-1;  
  31.   
  32.     rADCCON = (1<<14)|(preScaler<<6)|(ch<<3); //setup channel,分频使能,写入分频值,选择通道  
  33.   
  34.     if(prevCh!=ch)  
  35.     {  
  36.     rADCCON = (1<<14)|(preScaler<<6)|(ch<<3);   //setup channel  
  37.     for(i=0;i<LOOP;i++); //delay to set up the next channel切换通道要等待一段时间?  
  38.     prevCh=ch;  
  39.     }  
  40.     rADCCON|=0x1;   //start ADC开始转换  
  41.   
  42.     while(rADCCON & 0x1);   //check if Enable_start is low等待启动位清零,转换启动结束  
  43.     while(!(rADCCON & 0x8000)); //check if EC(End of Conversion) flag is high等待转换结束  
  44.   
  45.     return ( (int)rADCDAT0 & 0x3ff );//返回0~9位的采样值,0~1023  
  46. }  
  47.   
  48. //==================================================================================  
  49. void Test_Adc(void)   
  50. {  
  51.     int a0=0, a1; //Initialize variables  
  52.     U32 rADCCON_save = rADCCON;//保存原值  
  53.       
  54.     Uart_Printf( "ADC INPUT Test, press ESC key to exit !\n" ) ;  
  55.   
  56.     preScaler = ADC_FREQ;  
  57.     Uart_Printf("ADC conv. freq. = %dHz\n",preScaler);  
  58.     preScaler = 50000000/ADC_FREQ -1;               //PCLK:50.7MHz//preScaler =1转换频率freq=50M/(1+1)=25M,最大不超过PCLK的1/5?  
  59.       
  60.     Uart_Printf("PCLK/ADC_FREQ - 1 = %d\n",preScaler);  
  61.       
  62.     while( Uart_GetKey() != ESC_KEY )  
  63.     {  
  64.         a0=ReadAdc(0); //对应开发板上W1可调电阻  
  65.         a1=ReadAdc(1); //对应开发板上W2可调电阻  
  66.   
  67.         Uart_Printf( "AIN0: %04d,   AIN1: %04d\n", a0, a1 );  
  68.         Delay( 500 ) ;  
  69.     }  
  70.       
  71.     //rADCCON=(0<<14)|(19<<6)|(7<<3)|(1<<2);  //stand by mode to reduce power consumption  
  72.     rADCCON = rADCCON_save;//恢复原值  
  73.     Uart_Printf("\nrADCCON = 0x%x\n", rADCCON);  
  74. }  

效果图:


完整工程文件可在这里下载。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值