|
在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 转载请注明出处!
|