这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 物联网技术 » 求教,程序贴上

共12条 1/2 1 2 跳转至

求教,程序贴上

助工
2014-09-09 11:24:42     打赏

高手们见笑了,这个程序是测10次AD转换的值,但是我在调试的时候发现10次测试完之后,Index的值会变成一个特别大的值比如1024, 所以我想问这个程序中断测完后,怎么退出呢?还有我想计算这10个数的平均值,这个应该放在程序的哪块,中断里面吗?

#include  <msp430x14x.h>

typedef unsigned char uchar;
typedef unsigned int  uint;

#define   Num_of_Results   10

static uint results[Num_of_Results];    //保存ADC转换结果的数组  

/************************主函数****************************/
void main(void)
{
  WDTCTL = WDTPW+WDTHOLD;                   //关闭看门狗
 
  /*下面六行程序关闭所有的IO口*/
    P1DIR = 0XFF;P1OUT = 0XFF;
    P2DIR = 0XFF;P2OUT = 0XFF;
    P3DIR = 0XFF;P3OUT = 0XFF;
    P4DIR = 0XFF;P4OUT = 0XFF;
    P5DIR = 0XFF;P5OUT = 0XFF;
    P6DIR = 0XFF;P6OUT = 0XFF;
 
  P6DIR |= BIT0;P6OUT |= BIT0;              //关闭电平转换
  P6SEL |= 0x01;                            // 使能ADC通道
  ADC12CTL0 = ADC12ON+SHT0_15+MSC+REF2_5V+REFON;     //打开ADC,设置采样时间,内部参考电压2.5V
  ADC12CTL1 = CSTARTADD_0+SHP+CONSEQ_2;         //MEM0为起始地址+采样定时器+单通道多次采样
  ADC12MCTL1|=INCH_0+SREF_1;
  ADC12IE = 0x01;                           // 使能ADC中断
  ADC12CTL0 |= ENC;                         // 使能转换
 
  while(1)
  {
  ADC12CTL0 |= ADC12SC;                     // 开始转换
  _EINT();
  LPM0;
  }
}

/*******************************************
函数名称:ADC12ISR
功    能:ADC中断服务函数,在这里用多次平均的
          计算P6.0口的模拟电压数值
参    数:无      
返回值  :无
********************************************/
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR (void)
{
  static uint index = 0;

  results[index++] = ADC12MEM0; // 转换结果存入results
 
}


专家
2014-09-09 13:35:08     打赏
2楼
自己设计一个数据缓存器

专家
2014-09-09 13:56:21     打赏
3楼
测十次的话你可以设一个变量啊,计数到十次就关闭ad转换。

助工
2014-09-09 14:07:25     打赏
4楼

还要去掉最大最小值计算平均值,所以用这个数组比较方便


助工
2014-09-09 15:39:34     打赏
5楼

这样写会不会不合理啊,把计算都写在了中断里面,

 

#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR (void)
{
  ADC12CTL0 |= ENC;                         // 使能转换

  static uint index = 0;

  results[index++] = ADC12MEM0; // 转换结果存入results
  if(index>=10)
  {
    ADC12CTL0 &= ~ENC;        // 使能转换

    for(uchar i=0;i<index;i++)
    {
      for(uchar j=i+1;j<index;j++)
        if(results[i]>results[j])//从小到大排序
        {
          a=results[i];
          results[i]=results[j];
          results[j]=a;
        }
    }
    for(uchar i=1;i<index-1;i++)
    {
      sum+=results[i];
      average=sum/8;
    }
    vol=(float) 2.5 * (float)average / 4096;
  }
}


院士
2014-09-09 22:24:34     打赏
6楼

我是觉得还有更好的方法。

中断里尽量不要放这么多的大运算。

每10次采集,可以通过定时器等间隔触发


助工
2014-09-10 09:18:14     打赏
7楼

不太明白,那这个中断还用吗,脑子没转过来呢,我还是不明白用了定时中断我就可以不在中断内部进行计算了吗,您能简单写一下代码吗,谢谢


专家
2014-09-10 14:30:39     打赏
8楼
是用数组存储数据,再设一个变量控制采集数据次数,到十次的时候对数组内的数据进行操作,并关闭AD。

院士
2014-09-10 23:13:16     打赏
9楼

楼主 你程序中的是ADC中断,我说的定时中断

不是一个东西啊~~


助工
2014-09-22 10:43:11     打赏
10楼

我想的是既然有ADC中断就不浪费一个定时中断了,留着别的用


共12条 1/2 1 2 跳转至

回复

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