寒雪剑91 发表于 2012-8-3 17:41:00

msp430g2553 adc10 序列通道多次采样

自己在论坛里放着某位大虾写的多通道程序写了一下,自己想测P1.0和P1.1的模拟电压,经过测试P1.0显示是对的,但是P1.1就有问题了,不知道为啥,敢请高手指点!小弟不胜感激{:3_59:}
#include "msp430g2553.h"
#include "lcd1602.h"
#define uint unsigned int
#define uchar unsigned char
float P10_v,P11_v,P10,P11;
uint shi,ge,shi_fen,bai_fen,i=6,j,P10_int,P11_int;
uchar table[]="0123456789";
uint a[],num;//,b[],num1;
//P1.0电压值
void display_v_P10(float P10_v)
{
//取出每位数值
P10_v=P10_v*100;//将得到的数*100为了方便取出小数部分
P10_int=(uint)P10_v;//保留两位小数 转化为整型
ge =P10_int/100;//取个位
shi_fen=P10_int/10%10;//取十分位
bai_fen=P10_int%10;//取百分位

//写每位数值
//LCD_write_char(0+i,0,table);
LCD_write_char(1+i,0,table);
LCD_write_char(2+i,0,'.');
LCD_write_char(3+i,0,table);
LCD_write_char(4+i,0,table);

//伏特符号
LCD_write_char(5+i,0,'V');
}
//P1.1电压值
void display_v_P11(float P11_v)
{
//取出每位数值
P11_v=P11_v*100;//将得到的数*100为了方便取出小数部分
P11_int=(uint)P11_v;//保留两位小数 转化为整型
ge =P11_int/100;//取个位
shi_fen=P11_int/10%10;//取十分位
bai_fen=P11_int%10;//取百分位

//写每位数值
LCD_write_char(1+i,1,table);
LCD_write_char(2+i,1,'.');
LCD_write_char(3+i,1,table);
LCD_write_char(4+i,1,table);

//伏特符号
LCD_write_char(5+i,1,'V');
}

//主函数
void main(void)
{

WDTCTL = WDTPW + WDTHOLD;               // Stop WDT
ADC10CTL1 = INCH_1 + ADC10DIV_0 + CONSEQ_3;         // Temp Sensor ADC10CLK/4
ADC10CTL0 |= ADC10ON + ADC10IE + REFON + REF2_5V + SREF_1 + MSC + ADC10SHT_2;
ADC10AE0 = 0X03;//P1.0 P1.1 analog enable
ADC10DTC1|=0X0a;
delay_us(40);

//LCD初始化
LCD_init_first();
LCD_init();

while(1)
{
   ADC10CTL0 &= ~ENC;//关闭采样使能
   while(ADC10CTL1 & ADC10BUSY);//判断是否有采样或转换动作
   ADC10SA = (uint)a;
   ADC10CTL0 |= ADC10SC + ENC;//开始采样
   _EINT();//关闭CPU,开启总中断
   LPM0;

   for(num=0;num<5;num++)
   {
      P10 += a;    //取采集P1.0五次的值
      P11 += a;   //取采集P1.1五次的值
   }
   //取五次的平均值
   P10=P10/5;
   P11=P11/5;
   //根据公式换算模拟电压值
   P10_v=P10/1023*2.5;
   P11_v=P11/1023*2.5;
   //显示部分
   display_v_P10(P10_v);
   display_v_P11(P11_v);   
}
}
// ADC10 interrupt service routine
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR (void)
{
LPM0_EXIT;// Clear CPUOFF bit from 0(SR)
}

lin562794072 发表于 2012-8-4 21:43:17

能同时显示吗?ADC10只有一个ADC10MEM,一次只能显示一个吧、。。。

寒雪剑91 发表于 2012-8-5 11:29:27

lin562794072 发表于 2012-8-4 21:43 static/image/common/back.gif
能同时显示吗?ADC10只有一个ADC10MEM,一次只能显示一个吧、。。。

两行都有显示,只不过只有第一行的显示时正确的,第二行的显示不正确

chenchaoting 发表于 2012-8-8 13:56:43

要用到DMA 就是把不同通道可以传送到一个块

luckseason 发表于 2012-8-22 16:06:23

mark{:sleepy:}{:time:}

在路上的旁观者 发表于 2013-4-14 11:31:46

看看{:smile:}{:smile:}{:smile:}{:smile:}

jie18778884418 发表于 2014-5-2 15:24:20

楼主把完整工程贴出来看看呢

jie18778884418 发表于 2014-5-2 23:10:41

ADC10SA = (uint)a;这句是什意思

jie18778884418 发表于 2014-5-5 01:40:48

怎么好像没货啊

wind2100 发表于 2014-5-23 11:24:18

我也碰到 DTC 搬数据的时候 一会儿在 一会儿在 通道乱掉 怪哉

wind2100 发表于 2014-5-23 11:49:11

可以了 有一条语句 顺序错了

错的
            ADC10CTL0 &= ~ENC;                      // ADC10 disable
                   ADC10SA = (u16)adc_temp;                        // Data buffer start address in RAM
       while (ADC10CTL1 & BUSY);             // Wait if ADC10 core is active
       
       ADC10CTL0 |= ENC + ADC10SC;             // Enable and conversion start

对的
            ADC10CTL0 &= ~ENC;                      // ADC10 disable
       while (ADC10CTL1 & BUSY);             // Wait if ADC10 core is active
       ADC10SA = (u16)adc_temp;                        // Data buffer start address in RAM
       ADC10CTL0 |= ENC + ADC10SC;             // Enable and conversion start
页: [1]
查看完整版本: msp430g2553 adc10 序列通道多次采样