This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

msp430f149adc12模块的单通道序列转换的问题

Other Parts Discussed in Thread: MSP430F5529

我自己写了个149的adc12单通道序列转换的程序,使用的是p6.0(A0通道),结果现象正确,可是吧程序中控制A0通道的寄存器参数改成对应的控制p6.1的A1通道的寄存器参数,其余地方不动,结果转换的结果不对。其中A1输入一个模拟电压转换的结果数字不变。有时候还出现一些随机数字,请问什么原因。

  • gj chen,

    您好,

    最可能的原因就是程序中有些部分没有修改,建议你将代码贴上来。

  • ADC修改的时候一个是ADC12INCH通道修改,一个是转换值ADC12MEMx的修改,您的问题肯定是由于ADC寄存器修改的地方不对导致的,建议再检查一下代码。

  • //*****此程序实现的是以ADC12内部的2.5v的参考电压,对a0通道进行32次采集平均后,把采集结果在数码管上显示*****//

    #include  <msp430x14x.h>

    #define   Num_of_Results   32

    #define uint  unsigned int

    #define uchar  unsigned char

    uchar seg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,};//0-9对应的共阴极段码

    uint results[Num_of_Results] = {0};

    unsigned long int  average=0;

    //***********ADC12的初始化函数********************//

    void ADC_Init(void)

    {

     P6SEL |= BIT0;// 设置p6.0为a0采样通道

     ADC12CTL0 &= ~ENC;

     ADC12CTL0 = ADC12ON+SHT0_15+MSC;

     ADC12CTL1 = SHP+CONSEQ_2+CSTARTADD_0;           //采样定时器触发采样、单通道多次转换

     ADC12MCTL0 = INCH_0;//a0通道、Vr+=Vref+,Vr-=AVcc

     ADC12IE = 0x01;                         // 使能中断

     ADC12CTL0 |= ENC;  

     ADC12CTL0 |= ADC12SC;// 开始转换

      _EINT();

    }

    //*****************延时函数**********************//

    void delay_ms()

    {for(uint i=500;i>0;i--);}

    ////**********数码管动态显示程序********************//

     

    void display(uint num)

    { uint qian=(num / 1000);

     uint bai=(num-(num/1000)*1000)/100;

     uint shi=(num-qian*1000-bai*100)/10;

     uint ge=(num-qian*1000-bai*100) %10;

     //显示端口初始化

     P3SEL=0x00;//p3作为i/o

     P3DIR=0x0f;//p3.0-p3.3作为输出

     P3OUT|=0x0f;//关闭数码管位选信号

     P4SEL=0x00;//p4作为i/o

     P4DIR=0xff;//p4为输出

     P4OUT=0x00;//数码管不亮

     P4OUT = seg[qian];//千位数字段选

     P3OUT^=BIT0;//打开千位位选

     delay_ms();   //显示1ms千位

     P4OUT=0x00;//消掉阴影

     P3OUT^=BIT0;//关闭千位位选

     P4OUT = seg[bai];//送百位段码

     P3OUT^=BIT1;//打开百位位选          

     delay_ms();   //显示1ms个位

     P4OUT=0x00;//消掉阴影

     P3OUT^=BIT1;//关闭百位位选    

     P4OUT = seg[shi];//十位数字段选

     P3OUT^=BIT2;//打开十位位选

     delay_ms();   //显示1ms十位

     P4OUT=0x00;//消掉阴影

     P3OUT^=BIT2;//关闭十位位选

     P4OUT = seg[ge];//送个位段码

     P3OUT^=BIT3;//打开个位位选          

     delay_ms();   //显示1ms个位

     P3OUT^=BIT3;//关闭个位位选

    }

    void main(void)

    {

     WDTCTL = WDTPW + WDTHOLD;    // 关狗

     ADC_Init();     // 初始化ADC12

     _EINT();       //开总中断

     while(1)//显示    

     {   _BIS_SR(LPM0_bits+GIE);   //进入低功耗

         display(average);

     }

    }

    //*********中断服务****************//

    #pragma vector=ADC12_VECTOR

    __interrupt void ADC12ISR (void)

    {

     static uint index = 0;

     results[index++] = ADC12MEM0;        

     if (index == 32)

     {

     //  ADC12CTL0 &= ~ENC;                    

       index = 0;

       for(uchar i=0;i<32;i++)

       {average+=results[i];}

        average>>=5; 

       _BIC_SR_IRQ(LPM0_bits) ;  

     }

    }

  • 代码已经黏贴,麻烦指点,新手初学,谢谢。

  • gj chen,

    这个不是采集A0通道的代码么?这个是正常工作的吧?

  • 恩,的确,黏贴的程序是A0通道的,能正常工作,但是把控制A0的寄存器全部对应改成控制A1的寄存器,就不知怎么程序不能得到正常现象了。如果可以,麻烦给个正确控制A1或则其他通道的示例程序,谢谢。

  • 手头暂时没有这方面的代码。请参考peter zheng给你的建议。或者把你的错误代码发上来

  • 把你错误代码贴出来。

    我下面这段代码是基于msp4305529  A1的,参考一下

    #include "msp430f5529.h"

    void Init_ADC(void)

    {

     P6SEL |= BIT6;                            // Enable A/D channel A0

     ADC12CTL0 = ADC12SHT0_8; // Set sample time

     ADC12CTL1 = ADC12SHP;                     // Enable sample timer

     ADC12MCTL0 = ADC12SREF_0 + ADC12INCH_1;  

    }

    unsigned char luminary_measure()

    {

     unsigned char temp;

     ADC12CTL0 |= ADC12ENC+ ADC12ON;

     ADC12CTL0 |= ADC12SC;                   // Start conversion

     while (!(ADC12IFG & BIT0));

     temp=(ADC12MEM0>>4)/3;

     ADC12CTL0 &= ~(ADC12ENC+ ADC12ON);

     return temp;

    }

    void main(void)

    {

     WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT

     P1DIR |= 0x01;                            // P1.0 output

     Init_ADC();

     while(1)

     {

       if(luminary_measure()>0x1F)

         P1OUT|=BIT0;

       else

         P1OUT&=~BIT0;

     }

    }

  • 我这个附件里的程序是想实现在程序上电时数码管显示8888,当矩阵键盘中key1按下时显示A0通道转换的模数值,按下key2时显示通道A1的模数值,按下key3时显示A2通道的模数值。结果发现只有A0通道能正确转换并显示,而A1和A2通道则不能转换,却显示一些随机数在数码管上。请问怎么回事?如果要实现我说的功能,如何修改,期待回复。谢谢。

  • 大概看了你的代码,AD这块没看出啥问题,AD转换这块你使用断点调试,看一下寄存器ADC12MEM0-2转换值是否正确,average0-2这几个数是否被正确显示。另外,在处理键值的时候建议使用switch语句。

  • 我也遇到了这个问题,只有0通道可以采集,但是如果采用多通道,又是可以的。。。郁闷呢。。。