回复 19楼 寒雪剑91 的帖子

是哪里错了,能指出吗?
点赞  2012-8-2 20:45
if(v[6]>1)
                P1OUT^=BIT6;
                else
                P1OUT^=BIT0;
这句是什么意思呢?你是判断通道A6的电压吗,通道A6不就是P1.6吗?你直接给它外加电压它当然亮了
点赞  2012-8-2 23:47

回复 19楼 寒雪剑91 的帖子

我最终又没有改出来
点赞  2012-8-3 17:06

回复 40楼 rtx52 的帖子

#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(1+i,0,table[ge]);
  LCD_write_char(2+i,0,'.');
  LCD_write_char(3+i,0,table[shi_fen]);
  LCD_write_char(4+i,0,table[bai_fen]);
  
  //伏特符号
  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[ge]);
  LCD_write_char(2+i,1,'.');
  LCD_write_char(3+i,1,table[shi_fen]);
  LCD_write_char(4+i,1,table[bai_fen]);
  
  //伏特符号
  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[1+2*num];    //取采集P1.0五次的值
      P11 += a[2*num];     //取采集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)
}
这是我根据楼主写的程序改了一点,但是P1.1读出的数据时错的,P1.0是对的,这是为啥?
点赞  2012-8-3 17:30

回复 6楼 Domen 的帖子

楼主,关于六楼你更正后的代码。有点问题想要请教一下。首先,数据手册里面关于ADC10DTC1的英文解释是DTC transfers. These bits define the number of transfers in each block。01h-0FFh Number of transfers per block。这个应该是决定每个通道采样的次数吧,你开了A7~A0,是不是应该每个通道都采样了32次?,(手头没有430,所以希望楼主可以试一下,把数组A长度定义的大一些,看到底采样了多少次 )其次,采样到的值放在数组A,然后对应于同一通道的采样值整除4,放在数组B,这个时候数据就已经有误差,然后再放到数组V转换成浮点型,数据类型转换,进一步引入误差,为什么不直接定义浮点型数组B,一次性存放到B中呢?即使在没有输入的情况下,AD采样,ADC10MEM里面一样会有一定的数值,一般是40左右,转换成电压的话就是0.05~0.09V,所以精度考虑,还是少进行不同数据间类型的转换。          个人观点,望楼主多多指点
点赞  2012-8-4 16:30

回复 楼主 Domen 的帖子

LZ,如果我想显示数组a里面的值,要怎么读出来
点赞  2012-8-17 02:42
讨论这么激烈却插不上嘴,不行得好好学学。
点赞  2012-8-21 23:37
忽然想问一下如果加入 温度测量的ad10 序列通道重复转换 测温度的那个通道怎么加进去啊
点赞  2012-9-8 21:30
忽然想问一下如果加入 温度测量的ad10 序列通道重复转换 测温度的那个通道怎么加进去啊
点赞  2012-9-8 21:30

回复 12楼 maybug 的帖子

ADC采样需要一段时间来获取电压值。
点赞  2012-12-21 15:00
好贴子,正在学习!
点赞  2013-1-19 22:55
引用: Domen 发表于 2012-8-1 18:32
ADC10AE0是通道使能位,在这里我为了方便LED灯的测试而关闭了它,在实际采集模拟量的时候是需要打开的,在序列通道采集中INCH的作用是指采集通道的最大值,而不是像单通道中所指定的某个特定的通道

INCH的作用是指采集通道的最大值  楼主这个是在手册哪里看到的啊??
点赞  2015-4-15 16:10
你好楼主 我想知道那个采样结果是如何换算成电压值的  也就是说
                        b=b/4;//取4次采样的平均
                        v=b*25;
                        v=(v/1023)/10;//转化为电压值
这个公式是怎么得出的  谢谢了
点赞  2015-4-22 21:49
厉害。。。终于找到我自己程序的问题了
点赞  2016-5-24 19:58
请教一下楼主:设定INCH7-INCH0多通道采样,但是有两个引脚作为串口用了,不作为采样用。这时候一次转换后DTC里的数据还是8个,还是6个?
点赞  2017-8-11 11:26
楼主:问什么  while(ADC10CTL1 & ADC10BUSY);//判断是否有采样或转换动作
这个语句在执行第二次的时候,就无限停在那了?
点赞  2017-8-11 16:55
123
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复