4236|11

12

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

求助!!!MSP430F5438a的ADC12模块采集不到外部的电压 [复制链接]

1芯积分
    想用MSP430F5438a的ADC12模块采集不到的电压,并转换成电流发送到电脑上,AD代码如下


void adc12_config(void)

{

      //只有在ADC12ENC复位情况下才可以操作

      ADC12CTL0 &= ~ADC12ENC;

      P6SEL |= 0x01;     //使能A0输入通道

      //ADC12CTL0 = ADC12ON;

      REFCTL0 &= ~REFMSTR;

      //ADC12CTL0 = ADC12SHT0_15 + ADC12SHT1_15 + ADC12ON + ADC12REF2_5V + ADC12REFON;

      ADC12CTL0 = ADC12SHT0_15+ ADC12ON + ADC12REF2_5V + ADC12REFON;

      ADC12CTL1 = ADC12SHP;

      ADC12CTL2 |= ADC12TCOFF;     //关闭内部温度检测以降低功耗

      ADC12MCTL0 = ADC12SREF_1;



      __delay_cycles(75);



      ADC12CTL0 |= ADC12ENC;

}


主函数


int main(void)  

{

       clock_config();                             // 初始化时钟  

       adc12_config();                             // 初始化ADC12  

       uart_config();  



       TA1CCTL0 = CCIE;                            // 使能TA1CCR0,比较匹配中断  

       TA1CCR0 = 32768;                            // 初始化最大值,发生比较匹配中断频率 32768/32768 = 1Hz  

       TA1CTL = TASSEL_1 + MC_1 + TACLR;           // 选择ACLK,最大值为CCR0,清除计数值  



       _EINT();                                    // 初始化全局中断  



       while(1)

       {

             if( second_flag )  

             {  

                   second_flag = 0;                        // 1s时间到  



                   ADC12CTL0 |= ADC12SC;                   // 启动转换  

                   while(!(ADC12IFG & BIT0));           // 等待转换完成  

                  // 被转换的通道为通道11 (AVCC-AVSS)/2;  

                  // 此时转换的精度为12位——4096  

                   float Current = ((ADC12MEM0 / 4096 * 3.3) - 1.388) / 3;      //uA

                   printf("Current = %.3f\r\n",Current);  



              }  

        }  

}




可AD一直检测不到电压,使得ADC12MEM0的值始终是零,是不是AD初始化函数哪里有错????

最佳答案

查看完整内容

我的意思是这一句: float Current = ((ADC12MEM0 / 4096 * 3.3) - 1.388) / 3; 不妨将3.3提前去,变成: float Current = ((3.3*ADC12MEM0 / 4096) - 1.388) / 3; 看看有没有改善。 我认为不管ADC12MEM0取什么值,由于这是一个12位整型的变量,都有0

最新回复

不是,我本来意思是你把工程弄成压缩包传上来,可是突然发现我没5438的片子,楼上回答的已经解决你的错误了  详情 回复 发表于 2015-6-30 15:15
 
点赞 关注

回复
举报

1193

帖子

0

TA的资源

纯净的硅(高级)

沙发
 
先确认一下是ADC12MEM0一直为0还是Current一直为0?
我怎么觉得是你计算的时候没有转换数据类型,ADC12MEM0/4096=0,然后0再参与运算了呢?
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
qiushenghua 发表于 2015-6-30 14:24
先确认一下是ADC12MEM0一直为0还是Current一直为0?
我怎么觉得是你计算的时候没有转换数据类型,ADC12MEM ...

Current 一直显示的是-0.463,如下图




之前用类似的程序,用片内AD测过电压,是正常的,所以是ADC12MEM0一直为0,测不到电压

点评

我的意思是这一句: float Current = ((ADC12MEM0 / 4096 * 3.3) - 1.388) / 3; 不妨将3.3提前去,变成: float Current = ((3.3*ADC12MEM0 / 4096) - 1.388) / 3; 看看有没有改善。 我认为不管ADC12MEM0取什么  详情 回复 发表于 2015-6-30 15:04
 
 
 

回复

9716

帖子

24

TA的资源

版主

4
 



为了方便帮助你的人阅读,我把你的代码做了格式化。



  1. void adc12_config(void)
  2. {      //只有在ADC12ENC复位情况下才可以操作
  3.       ADC12CTL0 &= ~ADC12ENC;
  4.       P6SEL |= 0x01;     //使能A0输入通道
  5.       //ADC12CTL0 = ADC12ON;
  6.       REFCTL0 &= ~REFMSTR;
  7.       //ADC12CTL0 = ADC12SHT0_15 + ADC12SHT1_15 + ADC12ON + ADC12REF2_5V + ADC12REFON;
  8.       ADC12CTL0 = ADC12SHT0_15+ ADC12ON + ADC12REF2_5V + ADC12REFON;
  9.       ADC12CTL1 = ADC12SHP;
  10.       ADC12CTL2 |= ADC12TCOFF;     //关闭内部温度检测以降低功耗
  11.       ADC12MCTL0 = ADC12SREF_1;
  12.       __delay_cycles(75);
  13.       ADC12CTL0 |= ADC12ENC;
  14. }
  15. int main(void)  
  16. {
  17.        clock_config();                             // 初始化时钟  
  18.        adc12_config();                             // 初始化ADC12  
  19.        uart_config();  
  20.        TA1CCTL0 = CCIE;                            // 使能TA1CCR0,比较匹配中断  
  21.        TA1CCR0 = 32768;                            // 初始化最大值,发生比较匹配中断频率 32768/32768 = 1Hz  
  22.        TA1CTL = TASSEL_1 + MC_1 + TACLR;           // 选择ACLK,最大值为CCR0,清除计数值  
  23.        _EINT();                                    // 初始化全局中断  
  24.        while(1)
  25.        {
  26.              if( second_flag )  
  27.              {  
  28.                    second_flag = 0;                        // 1s时间到  
  29.                    ADC12CTL0 |= ADC12SC;                   // 启动转换  
  30.                    while(!(ADC12IFG & BIT0));           // 等待转换完成  
  31.                   // 被转换的通道为通道11 (AVCC-AVSS)/2;  
  32.                   // 此时转换的精度为12位——4096  
  33.                    float Current = ((ADC12MEM0 / 4096 * 3.3) - 1.388) / 3;      //uA
  34.                    printf("Current = %.3f\r\n",Current);  
  35.               }  
  36.         }  
  37. }
复制代码











 
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 

回复

2549

帖子

0

TA的资源

五彩晶圆(初级)

5
 
不需要关看门都么
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

6
 

之前的函数里关过了,不用再写一遍的吧。。。不过还是试了下,结果一样。。。那这个程序本身有没有其他问题呢?

点评

把串口部分先全部屏蔽掉,直接看AD12的寄存器值对不,对的话再加串口  详情 回复 发表于 2015-6-30 15:01
 
 
 

回复

2549

帖子

0

TA的资源

五彩晶圆(初级)

7
 
谁是谁的谁 发表于 2015-6-30 14:44
之前的函数里关过了,不用再写一遍的吧。。。不过还是试了下,结果一样。。。那这个程序本身有没有其他问 ...

把串口部分先全部屏蔽掉,直接看AD12的寄存器值对不,对的话再加串口
 
 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

8
 
谁是谁的谁 发表于 2015-6-30 14:30
Current 一直显示的是-0.463,如下图




之前用类似的程序,用片内AD测过电压,是正常的,所以是AD ...

我的意思是这一句:
float Current = ((ADC12MEM0 / 4096 * 3.3) - 1.388) / 3;
不妨将3.3提前去,变成:
float Current = ((3.3*ADC12MEM0 / 4096) - 1.388) / 3;
看看有没有改善。
我认为不管ADC12MEM0取什么值,由于这是一个12位整型的变量,都有0<=ADC12MEM0 / 4096<1,在没有进行强制类型转换的情况下,ADC12MEM0 / 4096还是一个整型的变量,也就是说ADC12MEM0 / 4096=0。
所以后面的运算(0-1.388)/3=-0.463

点评

谢谢啊,太感谢了,终于成功了,哈哈哈  详情 回复 发表于 2015-6-30 15:26
 
 
 

回复

2549

帖子

0

TA的资源

五彩晶圆(初级)

9
 
要不你把完整的工程传上来吧,还有你用的哪个通道,没见开启啊

点评

#include #include #include void clock_config(void); void select_xt1(void); void dco_config(void); void adc12_config(void); void uart_config(void); char second_flag = 0;  详情 回复 发表于 2015-6-30 15:11
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

10
 
数码小叶 发表于 2015-6-30 15:08
要不你把完整的工程传上来吧,还有你用的哪个通道,没见开启啊

#include
#include
#include

void clock_config(void);  
void select_xt1(void);  
void dco_config(void);  
void adc12_config(void);  
void uart_config(void);  
char second_flag = 0;

int main(void)  
{
       clock_config();                             // 初始化时钟  
       adc12_config();                             // 初始化ADC12  
       uart_config();  
  
       TA1CCTL0 = CCIE;                            // 使能TA1CCR0,比较匹配中断  
       TA1CCR0 = 32768;                            // 初始化最大值,发生比较匹配中断频率 32768/32768 = 1Hz  
       TA1CTL = TASSEL_1 + MC_1 + TACLR;           // 选择ACLK,最大值为CCR0,清除计数值  
  
       _EINT();                                    // 初始化全局中断  
  
       while(1)
       {
             if( second_flag )  
             {  
                   second_flag = 0;                        // 1s时间到  
  
                   ADC12CTL0 |= ADC12SC;                   // 启动转换  
                   while(!(ADC12IFG & BIT0));           // 等待转换完成  
                  // 被转换的通道为通道11 (AVCC-AVSS)/2;  
                  // 此时转换的精度为12位——4096  
                   float Current = ((ADC12MEM0 / 4096 * 3.3) - 1.388) / 3;      //uA
                   printf("Current = %.3f\r\n",Current);  
                                
              }  
        }  
}  
  
void clock_config(void)  
{  
  
      WDTCTL = WDTPW + WDTHOLD;                   // 停止看门狗  
      select_xt1();                               // 选择XT1  
      dco_config();                               // ACLK = XT1 = 32.768K  
                                                 // MCLK = SMCLK = 8000K  
}   
   
void select_xt1(void)  
{  
      // 启动XT1  
      P7SEL |= 0x03;                              // P7.0 P7.1 外设功能  
      UCSCTL6 &= ~(XT1OFF);                       // XT1打开  
      UCSCTL6 |= XCAP_3;                          // 内部电容  
      do  
      {   
           UCSCTL7 &= ~XT1LFOFFG;                  //清除XT1错误标记  
      
      }while (UCSCTL7&XT1LFOFFG);                 // 检测XT1错误标记  
}  
   
void dco_config(void)
{
      __bis_SR_register(SCG0);
      UCSCTL0 = 0x0000;
      UCSCTL1 = DCORSEL_5;
      UCSCTL2 = FLLD_1 + 243;
  
  
      __bic_SR_register(SCG0);
      //必要延时
      __delay_cycles(250000);
     
      //清除错误标志位
      do
      {
      
            UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
            SFRIFG1 &= ~OFIFG;
           
      }while(SFRIFG1 & OFIFG);
}

void adc12_config(void)
{
      WDTCTL = WDTPW + WDTHOLD;
     
      //只有在ADC12ENC复位情况下才可以操作
      ADC12CTL0 &= ~ADC12ENC;
      P6SEL |= 0x01;     //使能A0输入通道
      //ADC12CTL0 = ADC12ON;
      REFCTL0 &= ~REFMSTR;
      //ADC12CTL0 = ADC12SHT0_15 + ADC12SHT1_15 + ADC12ON + ADC12REF2_5V + ADC12REFON;
      ADC12CTL0 = ADC12SHT0_15+ ADC12ON + ADC12REF2_5V + ADC12REFON;
      ADC12CTL1 = ADC12SHP;
      ADC12CTL2 |= ADC12TCOFF;     //关闭内部温度检测以降低功耗
      ADC12MCTL0 = ADC12SREF_1;
  
      __delay_cycles(75);
     
      ADC12CTL0 |= ADC12ENC;
}

void uart_config(void)
{
      P3SEL = 0x30;
      
      UCA0CTL1 |= UCSWRST;
      UCA0CTL1 |= UCSSEL_1;
      UCA0BR0 = 3;
      UCA0BR1 = 0;
      UCA0MCTL |= UCBRS_3 + UCBRF_0;
      UCA0CTL1 &= ~UCSWRST;
     
      UCA0IE |= UCRXIE;
}

int putchar(int ch)
{
      UCA0TXBUF = ch;
      while(!(UCA0IFG & UCTXIFG));
      return ch;
  
}

#pragma vector = TIMER1_A0_VECTOR
__interrupt void TIMER1_A0_ISR(void)
{
      second_flag = 1;
  
}

点评

不是,我本来意思是你把工程弄成压缩包传上来,可是突然发现我没5438的片子,楼上回答的已经解决你的错误了  详情 回复 发表于 2015-6-30 15:15
 
 
 

回复

2549

帖子

0

TA的资源

五彩晶圆(初级)

11
 
谁是谁的谁 发表于 2015-6-30 15:11
#include
#include  
#include

void clock_config(void);  
void select_xt1(void);  
voi ...

不是,我本来意思是你把工程弄成压缩包传上来,可是突然发现我没5438的片子,楼上回答的已经解决你的错误了
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

12
 
qiushenghua 发表于 2015-6-30 14:06
我的意思是这一句:
float Current = ((ADC12MEM0 / 4096 * 3.3) - 1.388) / 3;
不妨将3.3提前去,变成 ...

谢谢啊,太感谢了,终于成功了,哈哈哈
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表