概述
在调试ADC模块功能时,习惯性的在网上搜索中文资料。最后被这些中文资料坑了,最终还是看英文的Datasheet才解决这个问题,最后把ATD0和ATD1均调试出来了。
网上那些错误的描述:
错误1:引脚对应的AD模块号错误。该结论可以在Datasheet 97页中可以看到
错误二:转换队列长度错误描述,ADC长度可设置范围1-16
示例:
获取PAD0-PAD9的AD值
void adc_Init(void)
{
ATD0CTL1=0x00; //7:1-外部触发,65:00-8位精度,4:放电,3210:ch
ATD0CTL2=0x40; //禁止外部触发, 中断禁止
ATD0CTL3=0xD0; //右对齐无符号,每次转换10个序列, No FIFO,Freeze模式下继续转
ATD0CTL4=0x01; //765:采样时间为4个AD时钟周期,ATDClock=[BusClock*0.5]/[PRS+1]
ATD0CTL5=0x30; //6:0特殊通道禁止,5:1连续转换 ,4:1多通道轮流采样
ATD0DIEN=0x00; //禁止数字输入
}
uint8_t adc_Read(char ch)
{
uint8 ad=0;
while(!ATD0STAT0_SCF);
switch(ch)
{
default:
case 0:
ad= ATD0DR0L;
break;
case 1:
ad= ATD0DR1L;
break;
case 2:
ad= ATD0DR2L;
break;
case 3:
ad= ATD0DR3L;
break;
case 4:
ad= ATD0DR4L;
break;
case 5:
ad= ATD0DR5L;
break;
case 6:
ad= ATD0DR6L;
break;
case 7:
ad= ATD0DR7L;
break;
case 8:
ad = ATD0DR8L;
break;
case 9:
ad = ATD0DR9L;
break;
}
return ad;
}
void adcTest(void)
{
uint8_t i;
uint8_t temp_adc;
for(i=0;i<10;i++)
{
temp_adc = adc_Read(i);
printf("adc%d=%d \r\n",i,temp_adc);
}
}
Datasheet地址:
ADC驱动代码地址: