[讨论] 求msp430g2553(外接12864),怎么设置双通道采样同时测两个口的电压并同时显示哈

xxwakaka   2015-8-11 10:08 楼主
悬赏 10 分 芯积分未解决
小白通过自学一礼拜终于能测一端电压了,可是后面发现两端的不一样,求各位大神帮忙看看,急需,感激不尽。(用的是msp430g2553laundpad开发板和7管脚的oled12864,同时测两不同端电压并同时显示在oled上)奉上小弟所有芯币


回复评论 (9)

在ADC10CTL1寄存器的CONSEQx位选择repeat-sequence-of-channels(重复序列通道采样,也就是多通道采样),同时这个寄存器的INCHx位选择A1,也就是最大通道是A1,另外在ADC10AE0寄存器中打开A0和A1,这样你就设置了A0、A1两个通道了。其实这些user‘s guide里面都有。关于读取数值,因为g2553只有一个ADC10MEM,所以要用到ADC10DTC,你可以在ADC10DTC1中设置共采样8次,这样每个通道采4次,设置一个8位的数组,用来存放你的采样结果。    ADC10SA = (unsigned int)sample_value;这一句是关键,其中sample_value是你的数组名,这一句的意思是把存放数据的数组的首位地址告诉ADC,这样就会自动把八次采样结果存入数组。还有你最好在这一句之前加一句while (ADC10CTL1 & BUSY); 就是查忙。最后说一点,多通道采样时是先采高通道啊,也就是A1先采,A0后采,依次循环
点赞  2015-8-11 11:45
引用: 飞翔荷兰人号 发表于 2015-8-11 11:45
在ADC10CTL1寄存器的CONSEQx位选择repeat-sequence-of-channels(重复序列通道采样,也就是多通道采样), ...

大兄弟,单通道测电压的呢?精度不行怎么解决哈
点赞  2015-8-12 21:45
我以前也遇到过,我的解决办法是软件补偿。比如你每次测出来都低0.2V,你就在程序里给每次结果+0.2V。一般来说AD采样不准是因为参考电压不够稳,你看看你给单片机供电是不是标准的3.3V
点赞  2015-8-12 22:34
引用: 飞翔荷兰人号 发表于 2015-8-12 22:34
我以前也遇到过,我的解决办法是软件补偿。比如你每次测出来都低0.2V,你就在程序里给每次结果+0.2V。一般 ...

用电脑Usb供电哒。不知道是不是标准的3.3v。用直流电源当待测电压,发现1A以下精度还行,小于2%.超过1A了感觉误差慢慢放大了。1.4都测出1.6了。
点赞  2015-8-13 07:55
你测一下供电电压嘛
点赞  2015-8-13 08:31
12864.rar (3.31 KB)
(下载次数: 31, 2015-8-13 15:39 上传)
点赞  2015-8-13 15:39
/*任务要求:4路电压信号输入,电压范围0~5V。单片机A0~A3通道轮流采样转换
  4位LED数码管轮流显示4路电压值*/
#include
#define Num_of_Results 8
static unsigned int A0results[Num_of_Results];//A0结果数组
static unsigned int A1results[Num_of_Results];//A1结果数组
static unsigned int A2results[Num_of_Results];//A2结果数组
static unsigned int A3results[Num_of_Results];//A3结果数组
unsigned char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
                     0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳极数码管
char position[]={0x08,0x04,0x02,0x01};//位码
unsigned char led_buf[]={0,0,0,0};//显示缓冲区
unsigned long data;
void data_to_buf(void)//值送显示缓冲区函数
{
  char i;
  for(i=0;i<6;i++)
  {
    led_buf[i]=data%10;//低位在前
    data=data/10;
  }
}
void disp(void) //动态扫描显示函数
{
  char i;
  unsigned int k;
  for(i=0;i<6;i++)
  {
    P4OUT=led[led_buf[i]];
    P5OUT=position[i];
    //if(i==3)  
    //P4OUT&=0x7f;  //小数点  
    for(k=0;k<600;k++);//延时
    P5OUT=0x00;  //关显示
  }
}
void main(void)
{
  char i;
  unsigned long data1,data2,data3,data4;
  WDTCTL=WDTPW+WDTHOLD;
  P4DIR=0xff;
  P5DIR=0xff;
  P6SEL|=0x0f;//打开A0~A3A/D通道输入
  ADC12CTL0=ADC12ON+SHT0_15+MSC;//开ADC12模块+采样信号由SHI仅首次触发
                                   //采集定时器分频系数n=1024
  ADC12CTL1=SHP+CONSEQ_3+ADC12DIV_7;
                                //使用采样定时器输出作采集/转换信号SAMPCON
                                   //重复序列采样模式+ADC12SSEL_2
  ADC12MCTL0=INCH_0;//参考电压取AVCC,输入通道选择为A0
  ADC12MCTL1=INCH_1;//参考电压取AVCC,输入通道选择为A1
  ADC12MCTL2=INCH_2;//参考电压取AVCC,输入通道选择为A2
  ADC12MCTL3=INCH_3+EOS;//参考电压取AVCC,输入通道选择为A3
                           //由此通道产生序列结束控制位
  ADC12IE=0x08;//A3通道开中断ADC12IFG.3
  ADC12CTL0|=ENC;//允许转换
  ADC12CTL0|=ADC12SC;//启动转换
  _EINT();
  while(1)
  {
    data1=0;
    data2=0;
    data3=0;
    data4=0;
    for(i=0;i     {
      data1=data1+A0results[i];
    }
    for(i=0;i     {
      data2=data2+A1results[i];
    }
    for(i=0;i     {
      data3=data3+A2results[i];
    }
    for(i=0;i     {
      data4=data4+A3results[i];
    }
    data1=data1/Num_of_Results;//求平均值
    data2=data2/Num_of_Results;//求平均值
    data3=data3/Num_of_Results;//求平均值
    data4=data4/Num_of_Results;//求平均值
    data=data1*50;
    data=data*10;
    data=data*10;
    data=data/4096;
    data_to_buf();//数据送显示缓冲区
    for(i=0;i<100;i++)
    {
      disp();
    }
    data=data2*50;
    data=data*10;
    data=data*10;
    data=data/4096;
    data_to_buf();//数据送显示缓冲区
    for(i=0;i<100;i++)
    {
      disp();
    }
    data=data3*50;
    data=data*10;
    data=data*10;
    data=data/4096;
    data_to_buf();//数据送显示缓冲区
    for(i=0;i<100;i++)
    {
      disp();
    }
    data=data4*50;
    data=data*10;
    data=data*10;
    data=data/4096;
    data_to_buf();//数据送显示缓冲区
    for(i=0;i<100;i++)
    {
      disp();
    }
  }
}
#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR(void)//ADC中断服务函数
{
  static unsigned int index=0;
  A0results[index]=ADC12MEM0;//移动A0结果到数组,同时清除ADC12IFG.0
  A1results[index]=ADC12MEM1;//移动A1结果到数组,同时清除ADC12IFG.1
  A2results[index]=ADC12MEM2;//移动A2结果到数组,同时清除ADC12IFG.2
  A3results[index]=ADC12MEM3;//移动A3结果到数组,同时清除ADC12IFG.3
  index=(index+1)%Num_of_Results;//索引增加,取index变量的模(余数)
}
这是AD多路采样巡检,你再根据自己的要求加一些计算语句
  

点赞  2015-8-16 13:12
清理积累的问题,这个问题的关键在“同时”二字。

MCU没有绝对的同时,所以你只能先测一个电压,再测另外一个电压。只要你测量这两个电压间隔时间足够短,那么就可以认为是同时。

剩下的就是操作显示的问题了。
点赞  2015-9-12 01:31
楼主 我现在利用nokia 5110LCD和G2553在launchpad开发板上做一个实时监测显示电池电压的设计。你做的板子成功了吗 能不能分享一下你的设计呀
点赞  2016-4-18 10:38
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复