总体来说对430的内置ADC模块的配置还是比较繁琐的,各种寄存器需要检索,有哪一个寄存器没有配置好都不会达到想要的效果。
这是曾经做过的一个数控电源的ADC部分代码,左边是430f149的时钟树。可能是说一开始就去看那些密密麻麻的时钟树,
看懂也不太现实,其实也没有一定要看懂的必要。其实只要能明白那一个寄存器应该要怎么去配置,就可以完成ADC的配置。
下面主要来讲解一下各个寄存器以及标志位的作用:
(1)
灰色的部分表示只有当ENC=0 时才可以改变,这一点要注意,尤其是在开启转换之后。因为在开启转换之后ENC是被
拉高了的,如果不对ENC进行拉低的操作,对灰色部分标志位的操作是无效的。
SHT0,SHT1:采样保持定时器,例:SHT0_2(2是分频因子,确定采样周期是时钟周期的整数倍)。对于具体的对应关系
可以去查看对应的官方USER
GUIDE。
MSC:多次采样转时要将这一位置高;
REF2_5V:当内部参考电压和内部参考电压发生器打开时,内部参考电压选择位;当为零时为1.5,当为是 2.5;
REFON:内部参考电压发生器开关控制位;
ADC12ON:ADC内核开关控制位;
ADC12OVIE:转换结果储存器溢出中断使能位;
ADC12TOVIE:转换时间溢出中断使能;
ENC:转换开始使能位;
ADC12SC:手动触发采样保持电路;
(2)
CSTARTADDx: 单通道转换的存放首地址;
SHSx:采样触发源的选择(对应关系查询USER
GUIDE);
SHP:采样触发模式的选择;(一般是要置高)
ISSH:是否将触发信号反相;
ADC12DIVx:输入时钟分频控制;
ADC12SSELx: 时钟源选择;
CONSEQx:转换模式选择;
ADC12BUSY:判忙标志位;(0:工作完毕;1:正在工作)
(3)
EOS:序列转换的结束标志;
SREFx: 参考电压的选择;
INCHx: 存放数据的通道选择,一个通道对应一个地址;
(4)
ADC12IEx: 中断使能位;
ADC12IFGx:中断标志位;
这里要注意中断标志位的特性,可以通过读写memory来复位,也可以直接写寄存器来复位;
下面对于我的代码的每一个部分进行解释:
P6SEL |=BIT0; //开启复用功能
P6SEL |= BIT1;
P6SEL |= BIT2;
P6SEL |= BIT7;
ADC12CTL0 = ADC12ON + MSC + SHT0_8 + REF2_5V + REFON; // 开启ADC,重复采样设置MSC,采样周期是256个时钟,2.5v
基准源
ADC12CTL1 = SHP + CONSEQ_3; //多通道连续采样模式
ADC12MCTL0 = INCH_0 + SREF_1 ; //记忆体对应的通道选择
ADC12MCTL1 = INCH_1 + SREF_1 ;
ADC12MCTL2 = INCH_2 + SREF_1 ;
ADC12MCTL7 = INCH_7 + SREF_1 +EOS;// 设定通道7为一次连续转换的结束
ADC12IE = 0x80;//只开启通道7的中断申请,至于为什么大家可自行思考
ADC12CTL0 |= ENC;//使能转换
ADC12CTL0 |= ADC12SC;//开启转换
P6DIR &= ~BIT0;//IO口为输入
P6DIR &= ~BIT1;
P6DIR &= ~BIT2;
P6DIR &= ~BIT7;
最后其实我想说,对于一个程序的编写,最好还是要去看一下例程,然后会看USER GUIDE,这样才能写好。
千万不要忽略USER GUIDE的作用。
|