MSP430F149的ADC操作
有这个还怕MSP430 AD模块不会用吗?
1) ADC图解
图1 ADC的原理图
理解:
1. ADC的时钟来源可以有四个(ACLK/MCLK/SMCLK/ADC12SO)由ADC12SSELx来选择。并且可以由ADC12DIVx控制选择分频。
2. ADC的采样参考电压可以由SREF0,SREF1来选择四种参考电压。
3. INCHx控制选择模拟电压输入口。
4. SHSx选择控制方式。
2) ADC的内核
1. ADC的转换公式
当采样最高电压高过或等于参考电压的时候,是最大值0FFFH。当采样最低电压低于或是等于参考电压的时候,是最小值000H。
2. 控制
ADC12的内核可以通过ADC12CTL0和ADC12CTL1两个寄存器来控制。当不使用的时候可以通过ADC12ON位来控制关闭内核以达到低功耗的目的。当修改转换使能标志ENC的时候,要先判断ADC12内核是否在进行转换工作,如果在转换工作期间关闭ENC(置零)那么最终得到错误的结果。
3) ADC的时钟来源
ADC可以有四种时钟来源。而ADC12OSC是ADC内置的一个时钟源,大概频率在5MHZ左右,不过该时钟源由个人设备、供电电压和外部温度的影响很大。
4) ADC的参考电压发生器
ADC内部可以提供一个可以产生1.5V或是2.5V的产考电压发生器。当设计使用的时候,需要将一个10uF的电容和一个0.1uF的电容并联到它的输出端。而且使用的时候,打开发生器至少需要等待17ms以让参考电压达到一个稳定的值。
5) ADC的低功耗
当ADC内核不适用的时候,它会自动进入关闭模式,在使用的时候自动苏醒。而它的参考电压却不会自动关闭,要用手通过REFON手动关闭。
6) ADC的采样保持触发源
它的触发源由四种选择。
1. ADC12SC位控制。
2. 定时器A输出控制
3. 定时器B输出控制
4. 定时器B输出控制
7) ADC的采样保持时间
ADC的采样保持时间有两种模式。
1. 拓展型采样时钟模式。
这个时候,采样的时间由SHI决定,也就是当SHI上升沿的时候开始采样,下降沿的时候结束采样。而这个SHI的来源就是来自于ADC的时钟。也就是由外部时钟控制的。
2. 脉冲采样模式
也就是起始的时候当SHI的一个上升沿的时候开始采样,而采样保持的时间由采样保持定时器决定。具体采样时间可以由ADC12CTL0寄存器中的SHT1x和SHIT0x决定。
8) ADC的采样模式
ADC有四种采样模式,由CONSEQx决定。
1. 单通道单次转换。也就是只对一个通道进行一次转换。
也就是说当SHSx=0(选择ADC12SC触发)并且ENC上升沿(转换使能开)并且ADC12SC上升沿(触发开始采样)时。或SHSx!=0时,等到了启动信号。进入采样阶段,开始采样,直到SMAPCON下降沿(也就是拓展模式时的SHI下降沿或是定时器模式的定时结束),进入转换阶段,ADC开始转换,需要12个ADC时钟转换完毕。然后用一个ADC时钟将转换结果存入转换结果寄存器。置位中断。在这过程中ENC要一直保持等于一,否则返回起始,当前转换结果也出现错误。最后返回起始,继续等待下次开始触发信号。
2. 单通道重复转换。
也就是说当SHSx=0(选择ADC12SC触发)并且ENC上升沿(转换使能开)并且ADC12SC上升沿(触发开始采样)时。或SHSx!=0时,等到了启动信号。进入采样阶段,开始采样,直到SMAPCON下降沿(也就是拓展模式时的SHI下降沿或是定时器模式的定时结束),进入转换阶段,ADC开始转换,需要12个ADC时钟转换完毕。然后用一个ADC时钟将转换结果存入转换结果寄存器。置位中断。在这过程中ENC要一直保持等于一,否则返回起始,当前转换结果也出现错误。再然后如果MSC=1(选择采样自动触发方式)并且SHP=1(采用脉冲模式采样,就是通过定时器定时采样时间)并且EOSx=0(不是最后一位转换)时,将存储地址+1并且直接进入采样阶段。如果当MSC=0(选择手动触发方式)或者SHP=0(采用外部时钟控制采样时间)并且EOS=0(不是最后一位转换)时,将存储地址+1并且进入等待开启采样时钟。如果EOS=1(是最后一位转换)时,返回起始,等待开启信号。
3. 序列通道单次转换。
也就是说当SHSx=0(选择ADC12SC触发)并且ENC上升沿(转换使能开)并且ADC12SC上升沿(触发开始采样)时。或SHSx!=0时,等到了启动信号。进入采样阶段,开始采样,直到SMAPCON下降沿(也就是拓展模式时的SHI下降沿或是定时器模式的定时结束),进入转换阶段,ADC开始转换,需要12个ADC时钟转换完毕。然后用一个ADC时钟将转换结果存入转换结果寄存器。置位中断。在这过程中ENC要一直保持等于一,否则返回起始,当前转换结果也出现错误。再然后如果MSC=1(选择采样自动触发方式)并且SHP=1(采用脉冲模式采样,就是通过定时器定时采样时间)并且EOSx=0(不是最后一位转换)时,直接进入采样阶段。如果当MSC=0(选择手动触发方式)或者SHP=0(采用外部时钟控制采样时间)并且EOS=0(不是最后一位转换)时,进入等待开启采样时钟。如果EOS=1(是最后一位转换)时,返回起始,等待开启信号。
4. 序列通道多次转换。
也就是说当SHSx=0(选择ADC12SC触发)并且ENC上升沿(转换使能开)并且ADC12SC上升沿(触发开始采样)时。或SHSx!=0时,等到了启动信号。进入采样阶段,开始采样,直到SMAPCON下降沿(也就是拓展模式时的SHI下降沿或是定时器模式的定时结束),进入转换阶段,ADC开始转换,需要12个ADC时钟转换完毕。然后用一个ADC时钟将转换结果存入转换结果寄存器。置位中断。在这过程中ENC要一直保持等于一,否则返回起始,当前转换结果也出现错误。再然后如果MSC=1(选择采样自动触发方式)并且SHP=1(采用脉冲模式采样,就是通过定时器定时采样时间)时,将存储地址+1(如果EOS=1是最后一个地址时,将存储地址返回存储首地址)并且直接进入采样阶段。如果当MSC=0(选择手动触发方式)或者SHP=0(采用外部时钟控制采样时间)时,将存储地址+1(如果EOS=1是最后一个地址时,将存储地址返回存储首地址)并且进入等待开启采样时钟。如果EOS=1(是最后一位转换)并且ENC=0(转换使能关闭)时,返回起始,等待开启信号。
9) ADC的各个寄存器。
1. ADC12CTL0
注意:有阴影部分只能在ENC为0的时候才能操作。
l SHT1x:当使用采样寄存器设定时间时,ADCMEM8到ADCMEM15的采样时间选择。
l SHT0x:当使用采样寄存器设定时间时,ADCMEM0到ADCMEM7的采样时间选择。
采样时间的图标如下:
l MSC:当它是零的时候,每次采样转换都要SHI的一个上升沿触发开始采样转换。当它是一的时候,除了第一次需要SHI的一个上升沿触发开始采样转换,接下来都是自动触发开始采样转换的。这个设置只在顺序采样和重复采样模式下。
l REF2_5V:当选择内部参考电压并且内部参考电压发生器打开时,为其选择你参考电压。当零时为1.5V,当1时为2.5V。
l REFON:内部参考电压发生器开关控制位。
l ADC12ON:ADC内核开关控制位。也就是打开转换器的控制位。
l ADC12OVIE:转换结果存储器溢出中断使能位。要配合总中断GIE使用。所谓溢出就是里面已经存了一个转换结果但是没有被读取又有一个转换结果产生,这时就发生了溢出。
l ADV12TOVIE:转换时间溢出中断使能。要配合总中断GIE使用。
l ENC:转换开始使能位。
l ADC12SC:手动触发采样保持电路时,用这位来触发。
2. ADC12CTL1
注意:有阴影部分只能在ENC为0的时候才能操作。
l CSTARTADDx:在单通道一次转换和单通道多次转换时转换结果的存放首地址设置位。
l SHSx:采样保持触发源的选择,是通过ADC12SC还是通过定时器。
l SHP:选择不同的采样触发模式。零是拓展触发模式,一是脉冲触发模式(也就是通过采样定时器决定采样保持时间的)。
l ISSH:是否将触发信号反相。
l ADC12DIVx:ADC的输入时钟分频比控制。
l ADC12SSELx:时钟源选择。
l CONSEQx:转换模式选择。
l ADC12BUSY:当为零的时候说明转换器工作完毕。当为一的时候说明转换器还在进行转换工作。
3. ADC12MCTLx
注意:有阴影部分只能在ENC为0的时候才能操作。
l EOS:序列转换的时候,序列结束标志。也就是当这个位为一的时候,这个地址存放的就是序列最后一次的转换结果。
l 参考电压选择。
l INCHx:存放数据的通道选择。就是该地址存放那个通道的转换结果。
4. ADC12IE
各个转换结果存储器中断使能。
5. ADCIFG
各个转换结果存储器中断标志。
10) ADC的操作
1. 将需要的输入的I/O选择为片内外设。
2. 选择参考电压(如果要选择参考电压发生器时候要开启发生器并且等待17ms)(可以使用默认)
3. 选择时钟和分频(可以直接使用默认值)
4. 选择采样保持时间模式(是拓展模式还是脉冲模式,如果是定时器还要设置定时器时间,当然也可以用默认时间。)默认是拓展模式。
5. 选择采样模式。(默认单通道单次转换)
7. 设置存储地址(可以默认)
8. 开启相应中断使能(ADC12IE)
9. 开始总中断使能
10. 打开ADC内核(ADC12ON)
11. 打开转换使能ENC
12. 开启工作(ADC12SC触发或时钟)
13. 中断取结果。
#include<msp430x14x.h>
#define uint unsigned int
void main()
{
WDTCTL=WDTHOLD+WDTPW;//关闭看门狗。
ADC12CTL0=SHT0_2+ADC12ON;
//选择采样定时器为16个ADC时钟。打开ADC内核
ADC12CTL1=SHP;//将采样模式选定为脉冲采样模式
ADC12IE=0X01;//打开中断使能
ADC12CTL0|=ENC;//启动转换使能
P6SEL|=0X01;//将P6.0口设置为外设端口
P3DIR=BIT4;//将P0.5口设置为输出
for(;;)
{
ADC12CTL0|=ADC12SC;//通过ADC12SC启动采样
_BIS_SR(CPUOFF+GIE);//关闭CPU打开总中断
}
}
#pragma vector=ADC_VECTOR
__interrupt void ADC12(void)
{
if(ADC12MEM0<0X7FF)//当ADC输入少于参考电压的一半的时候
P3OUT|=BIT4;//输出1
else
P3OUT|=~BIT4;//输出1
_BIS_SR_IRQ(CPUOFF);//CPU休眠
}