社区导航

 

搜索
查看: 2647|回复: 9

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

[复制链接]

15

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

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



回复

使用道具 举报

368

TA的帖子

1

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2015-8-11 11:45 | 显示全部楼层
在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后采,依次循环

回复

使用道具 举报

15

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2015-8-12 21:45 | 显示全部楼层
飞翔荷兰人号 发表于 2015-8-11 11:45
在ADC10CTL1寄存器的CONSEQx位选择repeat-sequence-of-channels(重复序列通道采样,也就是多通道采样), ...

大兄弟,单通道测电压的呢?精度不行怎么解决哈

回复

使用道具 举报

368

TA的帖子

1

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2015-8-12 22:34 | 显示全部楼层
我以前也遇到过,我的解决办法是软件补偿。比如你每次测出来都低0.2V,你就在程序里给每次结果+0.2V。一般来说AD采样不准是因为参考电压不够稳,你看看你给单片机供电是不是标准的3.3V

回复

使用道具 举报

15

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2015-8-13 07:55 | 显示全部楼层
飞翔荷兰人号 发表于 2015-8-12 22:34
我以前也遇到过,我的解决办法是软件补偿。比如你每次测出来都低0.2V,你就在程序里给每次结果+0.2V。一般 ...

用电脑Usb供电哒。不知道是不是标准的3.3v。用直流电源当待测电压,发现1A以下精度还行,小于2%.超过1A了感觉误差慢慢放大了。1.4都测出1.6了。

回复

使用道具 举报

368

TA的帖子

1

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2015-8-13 08:31 | 显示全部楼层
你测一下供电电压嘛

回复

使用道具 举报

1167

TA的帖子

0

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

荣誉会员勋章

发表于 2015-8-13 15:39 | 显示全部楼层
12864.rar (3.31 KB, 下载次数: 26)

回复

使用道具 举报

34

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2015-8-16 13:12 | 显示全部楼层
/*任务要求: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多路采样巡检,你再根据自己的要求加一些计算语句
  


回复

使用道具 举报

1167

TA的帖子

0

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

荣誉会员勋章

发表于 2015-9-12 01:31 | 显示全部楼层
清理积累的问题,这个问题的关键在“同时”二字。

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

剩下的就是操作显示的问题了。

回复

使用道具 举报

44

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2016-4-18 10:38 | 显示全部楼层
楼主 我现在利用nokia 5110LCD和G2553在launchpad开发板上做一个实时监测显示电池电压的设计。你做的板子成功了吗 能不能分享一下你的设计呀

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 1/4 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-6-6 09:33 , Processed in 0.312462 second(s), 29 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表