RealView MDK 与 AT91SAM7S64:模数转换器ADC

 

       在AT91SAM7S64中ADC的的使用方式与普通的单片机有些区别,它不仅可以软件触发还可以由硬件触发的方式开始一次转换操作,最为

     关键的是各通道间的切换也无需手工完成,在一次转换的操作当中所有使能的通道均完成一次转换,并将转换的结果存储到通道对应的

     寄存器中。下面是示例代码:

    #define TRGEN (0x0) // Software triggering
    #define TRGSEL (0x0) // Without effect in Software triggering
    #define LOWRES (0x0) // 10-bit result output format
    #define SLEEP (0x0) // Normal Mode (instead of SLEEP Mode)
    #define PRESCAL (0x4) // Max value
    #define STARTUP (0xc) // This time period must be higher than 20
    #define SHTIM (0x3) // Must be higher than 3 ADC clock cycles but depends on output

    void AdcInit(void)
    {
        UINT mask= ( 1 << AT91C_ID_ADC ) ;

        AT91C_BASE_PMC->PMC_PCER=mask; //时钟打开

        AT91C_BASE_ADC->ADC_CR = AT91C_ADC_SWRST; //清之前的结果

        //模式选择
        AT91C_BASE_ADC->ADC_MR =(SHTIM << 24) | (STARTUP << 16) | (PRESCAL << 8) |
                           (SLEEP << 5) | (LOWRES <<4) | (TRGSEL << 1) | (TRGEN ) ;

        //通道选择
        AT91C_BASE_ADC->ADC_CHER = (1<<0)|(1<<1)|(1<<2) ; //使能三个通道

        AT91C_BASE_ADC->ADC_CR = AT91C_ADC_START;//初始转换
    }

    void GetAdValue(WORD *buf)
    {
        buf[0] = AT91C_BASE_ADC->ADC_CDR0; //读转换结果
        buf[1]= AT91C_BASE_ADC->ADC_CDR1;
        buf[2]= AT91C_BASE_ADC->ADC_CDR2;

        AT91C_BASE_ADC->ADC_CR = AT91C_ADC_START; //再次开始转换
    }

     这个示例中GetAdValue函数的使用方法应该是每隔一段时间调用一次来获取AD转换结果,如下:

     int main(void)
     {

      WORD  AdBuffer[3];

      .....

      AdcInit();

       while(1)

       {

           delay();//在循环中要延时足够的时间来确保AD转换完成,可使用定时器等方式提升CPU的利用率

           GetAdValue(AdBuffer);

           ....

       }

     }
  
   
 

芯艺设计室(http://www.chipart.cn) 2010.09.02  转载请注明出处!
 

芯艺设计室    蒙ICP备06005492号

Copyright© 2004-2011 ChipArt Design House All Rights Reserved