导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→msp430f149 ADC12做波形采样,现已陷入僵局

* 34277: msp430f149 ADC12做波形采样,现已陷入僵局

   channel96 
channel96发表的帖子 

 msp430f149 ADC12做波形采样,现已陷入僵局
我用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:lhjbox2000@yahoo.com.cn 欢迎交流

发表时间:2003年6月13日13:59:12

  
回复该帖

本主题共有 1 帖,分页:>>>>>该主题的所有内容[1]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

[上一篇帖子]:电路中用了看门狗了吗?如果是仿真情况下看门狗应该不起作用 脱机情况下看门狗使用不当会引起电路
[下一篇帖子]:一个pic的基本问题,请大家帮忙看看本人刚开始用PIC的单片机,现在一个最基本的问题搞不定,已经快被