这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » msp430f149,ADC12 请教刘工及各位大虾msp430f149 ADC

共2条 1/1 1 跳转至

msp430f149,ADC12 请教刘工及各位大虾msp430f149 ADC12做波形采样,现已陷入僵局

院士
2006-09-17 18:14:16     打赏
msp430f149,ADC12 请教刘工及各位大虾msp430f149 ADC12做波形采样,现已陷入僵局



关键词: msp430f149     ADC12     请教     刘工     各位    

院士
2006-12-22 22:43:00     打赏
2楼
问 我用MSP430f149 ADC12做波形采样,现已陷入僵局

#####==>的地方是我的问题

是电压变化信号范围在0~2。5V,采样频率应大于10K,XT2的晶振为8M
我的系统时种设置如下(######==>1.时钟设置正确否?######==>2.MCLK是不是最大了?):
DCOCTL=0Xe0; //F149基础时钟设置
BCSCTL1=0x07; //开启XT2振荡器
BCSCTL2=SELM_2; //定义MCLK为XT2;MCLK分频为1;SMCLK时钟源为DCOCLK,SMCLK分频为1

(######==>3.f149芯片的ADC12最大采样频率可达200K?)我的ADC采样编码设想如下:

设置ADC12采样频率尽可能高,ADC12中断服务子程序尽可能小,(######==>4.中断服务子程序时间应当不超过ADC12的采样周期,否则ADC12的采样周期会被拉长?)利用缓冲处理的形式,设置一个缓冲数组ADCbuf[2][122];在中断服务程序中对ADCbuf[0],ADCbuf[1]进行轮流缓冲,每当一个缓冲生成后,置一个缓冲完成标志bufok=1,主程序中根据bufok=1轮流对缓冲数组ADCbuf[0],ADCbuf[1]进行处理(是要对缓冲中的每个采样值进行处理),每处理完一个缓冲清bufok=0;(######==>5.对每一个缓冲的处理时间应小于每一个缓冲的生成时间,要么对缓冲的处理会一直被中断?)

我程序这样的:
void ADC12Init(void)
{
ADC12CTL0&=~ENC; //关闭adc12转换允许位
ADC12CTL0 =MSC+ADC12ON+SHT0_3; //开adc12内核,采样自动转换
ADC12CTL1=SHS_0+SHP+ADC12DIV_0+ADC12SSEL_2+CONSEQ_2; //单通道重复
ADC12MCTL0 = EOS+INCH_11;
ADC12IE = 0x0001; // Enable ADC12IFG.0
}
#pragma vector=ADC_VECTOR
__interrupt void ADCINT (void)// ADC中断服务程序
{
...
if (buf_y==0) //如果是新的缓冲开始,则一维下标应变化
{
ADcount+=1; //记录ADC缓冲发生次数,全局变量
buf_x^=0x01;
}
ADCbuf[buf_x][buf_y]=ADC12MEM0;
buf_y+=1;
...
}
void main(void)
{
...
F149Init();
ADC12Init();
_EINT(); //开总中断
...
ADC12CTL0 |= ENC; // 使能ADC12转换允许位
ADC12CTL0 |= ADC12SC; // 开始转换
while(1)
{
if (bufok==1)
ADCBM(); //对生成的缓冲进行处理,处理完后清bufok=0
else
_NOP();
}
}

void ADCBM(void)
{
...
for (i=0;i<122;i++)
{...}
...
ADBMcount+=1; //处理缓冲的次数,全局变量
bufok=0;

}

遇到的问题是这样的:
#######==>6.ADC的频率设置最高只能设为
ADC12CTL1=SHS_0+SHP+ADC12DIV_0+ADC12SSEL_2+CONSEQ_2; //单通道重复
ADC12MCTL0 = EOS+INCH_11; //(此时INCH_10,INCH_9....均有错误)

ADC12CTL1=SHS_0+SHP+ADC12DIV_4+ADC12SSEL_2+CONSEQ_2; //单通道重复
ADC12MCTL0 = EOS+INCH_6; //(此时INCH_5,INCH_4....均有错误)


ADC12CTL1=SHS_0+SHP+ADC12DIV_5+ADC12SSEL_2+CONSEQ_2; //单通道重复
ADC12MCTL0 = EOS+INCH_5; //(此时INCH_4,INCH_4....均有错误)
正常时, ADBMcount<=ADcount 且ADcount<=ADBMcount+1
有错误时的表现为:ADcount大大的大于ADBMcount+1,可能是ADC缓冲中断按照原有速度继续生成,但处理缓冲程序ADBM()的速度一直跟不上,一直被重复中断重新开始执行ADBM(),要如何解决??而且很奇怪,ADBM()的语句很短时,就上述几条指令时也一样??

######==>7.频率时间应怎么算?比如我设成
ADC12CTL1=SHS_0+SHP+ADC12DIV_5+ADC12SSEL_2+CONSEQ_2; //单通道重复
ADC12MCTL0 = EOS+INCH_5;
实际调试过程中,在c-spy里暂停时,采样频率(ADcount*12)大概才6K左右
而ADC频率计算时可得MCLK/(ADC12DIV*(4*INCH+13))即为8000000/(6*(4*24+13))约为12K,相差了一半左右

######==>8.如何估算我一个子程序的执行时间?
比如执行完以下指令要多长时间要怎么算?
for (i=0;i<122;i++) {ADBMcount+=1;ADBMcount*=2;}

======================================================================
以上是我程序中关于ADC的主要设置、说明及疑问,可能哆嗦了一些,但我想把问题说清楚,有关采样频率这个问题已经连续几个星期困绕着我了,周围又没地方问,大虾们指点指点,小弟不胜感激!!!

Email:lhjbox2000yahoo.com.cn 欢迎交流 1: 大虾们出出手吧... 2: 字比较多一下消化不了,再研究一下。 3: 现在真的是卡在这儿了,采样率提高不了,我的波形编码时对时错,郁闷哪。。
还是谢谢刘工顶了一下 4: ad 的采样频率 理论就是ad对信号的牌照时间 你要是把处理信号的时间也加进来那采样时间就。。。。。。如果要提高采样率 应该采集完再处理信号 5: 给LZ提供几个数据:
1、ADC12信号采样处理周期=ADC12采样时间tsample+ADC12转换时间tconvert+处理程序执行时间
2、关于tsample,请看下面的附件
3、tconvert=13*ADC12CLK
4、ADC12信号采样(1/tsample)可大于200kHz
5、ADC12内核带16个缓冲存储器
http://www.lierda.com/bbs/attachmen...ntid=2748&stc=1 6: mmtcyq文件如下
7: 刘新锋请问现在哪里? 8: input MUX-ON resistance max=2k,是啥东西,最高输入阻抗? 9: “input MUX-ON resistance max=2k”是说该模拟多路器的接通电阻最大值为2k欧姆。

有的多通道ADC前面有个模拟多路器,是模拟开关的一种,用以提供一对多的模拟信号切换。模拟开关的一个重要参数是“接通电阻”。

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]