我使用MSP430F149对一个低频的信号进行采样。程序按下列设置ADC12的寄存器:
//ADC12初始化设置
P6SEL |= 0x03; //ADC12 A1/A0
ADC12CTL0 = ADC12ON + SHT0_3 + MSC;
ADC12CTL1 = SHP + ADC12DIV_7 + ADC12SSEL_1 + CONSEQ_3; //ADC12时钟源为ACLK,1/8分频
ADC12MCTL0 = INCH_0;
ADC12MCTL1 = INCH_1 + EOS;
ADC12IE = 0x02; //开启ADC12IFG.1中断
//ADC12中断函数
#pragma vector = ADC_VECTOR
__interrupt void ISR_ADC12(void)
{ _DINT();
ADC12IE = 0x00; //关闭ADC12中断
buff0[index] = ADC12MEM0;
buff1[index] = ADC12MEM1;
index++;
if(index == 30)
{
index = 0;
……
}
ADC12IE = 0x02; //开启ADC12IFG.1中断
_EINT();
}
其中ACLK时钟为LFXT1,是32768Hz的晶振。我根据如下公式:
4*Tadc12clk*2^SHTx + 13*(ADC12CLK时钟分频系数*1/Fadc12clk)
计算的采样频率大约是30.1Hz。从ADC12MEM寄存器接收数据是在中断程序中进行的,经过测量发现每个通道各接收30个数据均花费700ms的时间。这样看来,实际的采样率和寄存器设置的理论采样率有很大出入。这是为什么呢?
fuwenjia:
是不是计算转换时间的公式 tCONVERT = 13*(ADC12DIV*1/Fadc12clk) 有误?很多资料上讲转换时间是13×ADC12CLK,那么手册上这个tCONVERT = 13*(ADC12DIV*1/Fadc12clk) 是什么意思?
Shi JianHua:
回复 fuwenjia:
转换速率对你的项目很重要么?如果不是很关键的话,没有必要在这个上面花费太多时间。只要转换精度达到了,转换数值正确就可以了。
fuwenjia:
回复 Shi JianHua:
应用中的信号处理和计算,需要知道430F149的数据采样频率。虽然实测可以知道这个采样频率,但是实测的采样率和adc12寄存器设置的理论采样频率有很大出入。
zhi xin chen:
你好,我最近也在用MSP430自带的ADC12,看过你的帖子有问题想请教一下。
采样时间4*Tadc12clk*n, 你程序中的SHT0_3对应的n等于8吧。而你说的是4*Tadc12clk*2^SHTx ,不知道是不是这里的问题?
希望能得到回复。