ATD 配置

来源:互联网 发布:无法访问网络打印机 编辑:程序博客网 时间:2024/05/17 23:52

1、ATD 有挺多东西要注意的,用的时候还是看下datasheet 。

2、A/D转换时间 = Initial Sample Time(2)+ Programmed Sample Time(可编程)+ Resolution Period(10),其中采样周期ATDCTL4的SMP[1:0]来选择。

3、据说xs128 A/D Clock 要在500Hz 到 2MHz这个范围内采样才会准确,但又有的说是小于8MHz。

4、xs128的AD口是可以当作普通IO使用的,由ATD0DIEN[15:0]这个32位寄存器设置,置1做IO口,置0做AD;ATD0DIEN有高地位,分别为ATD0DIENH和ATD0DIENL。

5、AD采样的数据按精度分别存在ATD0DRx的高低位里,但具体怎么存得看精度和对齐方式。

6、做IO口时,PT0AD0是[15:8]的数据寄存器,DDR0AD0是[15:8]的方向寄存器。这个有点奇葩,照理说应该是[7:0]口为PT0AD0才对,它反而是PT1AD0。

7、采样完毕可用中断或查询方式。

//------------------------ ATD ------------------------void AD_Init(void)     {    ATD0CTL1 = 0x00;   //选择AD通道为外部触发,8位精度,采样前不放电      ATD0CTL2 = 0x40;   //标志位自动清零,禁止外部触发, 禁止中断         ATD0CTL3 = 0x20;   //左对齐无符号,每次转换4个序列, No FIFO, Freeze模式下继续转         ATD0CTL4 = 0x13;   //采样时间为4个AD时钟周期,PRS=20-1,ATDClock=2MHz      ATD0CTL5 = 0x30;   //特殊通道禁止,连续转换,多通道转换,通道[3:0]轮流采样    ATD0DIENL = 0x00;  //AD口[7:0]禁止数字输入        //AD转换时间 = Initial Sample Time(2)+ Programmed Sample Time(可编程)+ Resolution Period(10)}
//--------------- AD转换 + 均值滤波 ---------------void ATD()//查询{    uchar AD_sample[4][3];    uchar i;    for(i = 0; i < 3; i++)           //采样3次    {        while(!ATD0STAT2_CCF0);      //等待转换结束        AD_sample[0][i] = ATD0DR0H;  //读取转换的结果        while(!ATD0STAT2_CCF1);      //等待转换结束        AD_sample[1][i] = ATD0DR1H;  //读取转换的结果        while(!ATD0STAT2_CCF2);      //等待转换结束        AD_sample[2][i] = ATD0DR2H;  //读取转换的结果        while(!ATD0STAT2_CCF3);      //等待转换结束        AD_sample[3][i] = ATD0DR3H;  //读取转换的结果    }    for(i = 0; i < 4; i++)           //滤波    {        AD_value[i] = (uchar)((AD_sample[i][0] + AD_sample[i][1] + AD_sample[i][2]) / 3);    }}
#pragma CODE_SEG NON_BANKED  //中断的方法没试过,反正大致就是这样。void interrupt 22 Int_AD0(void){  AD_wData[0] = ATD0DR0;   //将结果寄存器中的值存放到数组中  AD_wData[1] = ATD0DR1;   //将结果寄存器中的值存放到数组中  AD_wData[2] = ATD0DR2;   //将结果寄存器中的值存放到数组中}#pragma CODE_SEG DEFAULT_ROM




原创粉丝点击