金牌会员
- 积分
- 1746
- 威望
- 950
- 贡献
- 438
- 兑换币
- 538
- 注册时间
- 2012-7-27
- 在线时间
- 179 小时
- 毕业学校
- 武汉
|
都是新手过来的,没事。读取的程序很多吧!应该蛮好找的吧!
s12有16个ad端口为什么还要加锁存器呢?直接一个用一个吧!
下面是ad初始化和读取程序
void atd_init(void)
{
ATD0CTL1=0x00; //8位转换精度
//外部触发为AN0,8位转换精度 ETRIGCHn(n=0~3)=ETn
/*7 6 5 4 3 2 1 0
ETRIGSEL SRES1 SRES0 SMP_DIS ET3 ET2 ET1 ET0
ETRIGSEL:外部触发选择位,默认为0。
SRES[1:0]:精度控制度,00:8位,01:10位,10:12位,11:保留
SMP_DIS:采样前放电控制位。0:采样前不放电,1:采样前放电.*/
ATD0CTL2=0X60; //affc允许
//stopmode转换继续
/*7:空
6位AFFC:ATD标志快速清除位。
5位ICLKSTP:0 STOP MODE停止
转换,1 STOP MODE继续转换。
1位ASCIE:ad中断完成使能位,0:禁止,1:允许
其他位外部触发控制位不用 */
ATD0CTL3=0Xb0; //右对齐,序列长度为6,非fifo模式
//冻结模式时依然转换
//13.5.16 由于转换通道个数为6个,而自己只
//定义5个所以一直出错弄得我一下午没心情
//之后晚上铺赛道时有一点空余时间随便调了下
//突然想到要不用少一点通道看行不行结果果然可以
//所以意识到是转换序列数设错了
//bit7JM,'1'右对齐,‘0’左对齐
//bit[6:3]:SnC,一个ad转换序列长度
/*S8C~S1C就控制每轮进行多少次转换,最多为8。
比如可以选择为6,那么每6次转换称为一个序列。
如果选择了多通道转换,那么CC、CB和CA选择首个转换的通道,
后面的通道按通道号排列。比如S8C~S1C选择转换数为6,
MULT设为1,而CD、CC、CB和CA选择通道4,那么转换开始后,
AD模块将按通道4、通道5、通道6、通道7、通道0、通道1的顺序
依次进行转换,并将转换结果依次放入6个结果寄存器
中。要注意并不能间隔选择通道。*/
//bit2:FIFO先进先出模式选择位
//
ATD0CTL4=0X01; //采样时间为4个ad周期
//ad总线频率为40/4mhz
/*SMP[7:5]:采样时间选择位
000:4, 011:10, 110:20,
001:6, 100:12, 111:24.
010:8, 101:16,
PRS[4:0]:ad时钟预分频因子位
F atdclk=F busclk/(2*(PRS+1)) */
ATD0CTL5=0X30; //连续多通道模式转换
//第一个转换通道为AN0
/*7:空,SC6:特殊通道使能位。1使能,0禁止
SCAN5:连续转换序列模式位。1连续,0不连续
MULT4:多通道采样模式位。1多通道,0单通道
CD~CA[3:0]:模拟输入通道选择位。0000~1111=AN0~AN15*/
ATD0DIEN=0x00; //数字触发禁止
}
/**************ad数据处理************************
*************************************************
*************************************************
*************************************************/
/***************读取ad转换值函数****************/
void adget(char i)
{
for(;i<16;i++)
{
while(!ATD0STAT2L_CCF0); //读取数据
atdget0[i]=ATD0DR0L;
while(!ATD0STAT2L_CCF1);
atdget1[i]=ATD0DR1L;
while(!ATD0STAT2L_CCF2);
atdget2[i]=ATD0DR2L;
while(!ATD0STAT2L_CCF3);
atdget3[i]=ATD0DR3L;
}
} |
|