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.

[参考译文] CCS/MSP430G2553:不同引脚中ADC值的变化过于夸张

Guru**** 2502205 points
Other Parts Discussed in Thread: MSP430G2553, MSP430G2253

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/574462/ccs-msp430g2553-adc-values-change-exaggeratedly-in-different-pins

部件号:MSP430G2553
主题中讨论的其他部件: MSP430G2253

工具/软件:Code Composer Studio

你(们)好

我正在为项目使用MSP430G2553。 我需要从加速器的三个轴测量ADC值,因此我使用以下代码:

/*
 * MSP430G2253 ADC_3GPIO v1.c
 *
 * 创建日期:2013年09月20日
 *     作者:Ant Scanney
 */
#include <MSP4S.h>
//全局变量
无符号int ADC[3]={0}; //这将保存x,y和z轴值
无符号int X_Axis =0;
无符号int Y_Axis =0;
无符号int Z_Axis =0;
//函数原型
void Setup_HW(void);       //设置监视程序计时器,时钟,ADC端口
void read_Acc (void);   //此函数读取ADC并存储x,y和z值

内部主(无效)

 Setup_HW();
 同时(1)
 {
       READ_ACC();//此函数读取ADC并存储x,y和z值
 }
}

// ADC10中断服务例程
#pragma vector=ADC10_vector
__interrupt void ADC10_ISR(void)

 __BIC_SR_REGISTER_ON_EXIT (CPUOFF);       //从0 (SR)清除CPUOFF位
}

作废Setup_HW (void)

     WDTCTL = WDTPW + WDTHOLD;                //停止WDT
     ADC10CTL1 = inch_5 + CONSEQ_1;           // A2/A1/A0,单序列
     ADC10CTL0 = ADC10SHT_2 + MSC + ADC10ON + ADC10IE;
     ADC10DTC1 = 0x03;                        // 3个转换
     ADC10AE0 |= BIT0 + BIT3 + BIT5;                        //禁用WFP 1.0 到WFP 1.2 的数字I/O
}
作废Read_Acc (void)

   ADC10CTL0 &=~ENC;
   当(ADC10CTL1 & BUSY);              //如果ADC10内核处于活动状态,请等待
   ADC10SA =(无符号int) ADC;           //将ADC10SA中的数据复制到无符号int ADC阵列
   ADC10CTL0 |= ENC + ADC10SC;            //开始采样和转换

   X_Axis = ADC[0];                       // ADC数组0已复制到变量X_Axis
   Y_Axis = ADC[1];                       // ADC数组1已复制到变量Y_Axis
   Z_Axis = ADC[2];                       // ADC数组2已复制到变量Z_Axis
   __bis_sr_register (CPUOFF + GIE);       // LPM0,ADC10_ISR将强制退出
}

当我使用针A0,A3和A5时,我获得ADC的一致值,从300到600,但在其他针(A1,A2,A4)中,我获得的值直到900。 我使用Vcc作为参考电压,它与我连接加速计的电压相同。 我在不同的MSP430G2553微控制器中尝试了不同的引脚,但遇到了相同的问题。

我是否有误解?

提前感谢!

Tatiana。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    开始ADC转换后,结果不会立即在内存中可用。 转换需要时间,ADC比CPU慢得多-因此您必须停止它,等待ADC "转换完成"中断发生。 在READ_ADC()中,您没有这样做。

    ADC10CTL0 |= ENC + ADC10SC;//开始采样和转换
    __bis_sr_register (CPUOFF + GIE);// LPM0,ADC10_ISR将强制退出

    您应查看 使用DTC来解决ADC的源代码示例。 此外,如果您使用的是启动板,建议您检查其电路-因为P1端口的某些引脚连接到LED,并且也会上拉按钮。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回答。

    我了解当您设置ADC10AE0时,它会将引脚配置为模拟,覆盖引脚选择(PxSEL)和引脚方向(PxDIR),引脚选择是GPIO应使用的内容。 这是错了吗?还是应该多做点什么?

    另一方面,我尝试了源代码,但问题仍然存在。 您可以在下面看到代码

    //  使用CCS版本4.2 0和IAR嵌入式工作台版本:5.10 构建
    //************************************************************************************************
    #include <MSP4S.h>

    内部主(无效)

     WDTCTL = WDTPW + WDTHOLD;                //停止WDT
     ADC10CTL1 = inch_3 + CONSEQ_1;           // A3/A2/A1,单序列
     ADC10CTL0 = ADC10SHT_2 + MSC + ADC10ON + ADC10IE;
     ADC10DTC1 = 0x03;                        // 3个转换
     ADC10AE0 |= 0x0E;                        // WFP 1.3 ,2,1 ADC10选项选择
     P1DIR |=0x01;                           //设置WFP 1.0 输出

     (;;)
     {
       ADC10CTL0 &=~ENC;
       while (ADC10CTL1和ADC10BUSY);              //如果ADC10内核处于活动状态,请等待
       ADC10SA = 0x200;                       //数据缓冲区启动
       P1OUT |= 0x01;                         // WFP 1.0 = 1
       ADC10CTL0 |= ENC + ADC10SC;            //开始采样和转换
       __bis_sr_register (CPUOFF + GIE);       // LPM0,ADC10_ISR将强制退出
       
       P1OUT =~0x01;                        // WFP 1.0 = 0
       
     }
    }

    // ADC10中断服务例程
    #if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
    #pragma vector=ADC10_vector
    __interrupt void ADC10_ISR(void)
    #Elif已定义(__GMNU__)
    void __attribute__((interrupt (ADC10_vector))) ADC10_ISR (void)
    #否则
    错误编译器不受支持!
    #endif

     __BIC_SR_REGISTER_ON_EXIT (CPUOFF);       //从0 (SR)清除CPUOFF位
    }

    此代码是否使用您编写的带有DTC的ADC?

    提前感谢!

    Tatiana,

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    I understand that you set the ADC10AE0,it configures the pin to analog,overwriting pin select (PxSEL) and pin direction (PxDIR),pin select is the should be used for GPIO (如果设置ADC10AE0,它将引脚配置为模拟,覆盖引脚选择(PxSEL)和 这是错误的还是我应该做更多的事情?[/QUOT]

    是的。 这是正确的,无需执行任何其他操作,您应检查数据表中每个引脚和引脚配置逻辑表的I/O电路。

    Tatiana Barrios 说:
    此代码是否在您编写时使用带有DTC的ADC?

    是的。

    Tatiana Barrios 说:
    另一方面,我尝试了源代码,但问题仍然存在。

    尝试增加采样时间。 -可能是加速器的阻抗过高,这可能会影响ADC读数。 您使用哪种加速器? 数据表的任何URL?

    您应仅将单个输出(如X_Axis)并行连接到所有引脚A0,A1,A2,A3,运行4个DTC转换并检查结果。 那么他们真的很不一样?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    非常感谢您的回答。

    我解决了将针脚A3,A4和A5分配到加速度计的问题。 它按应有的方式工作。
    但是我还有一个问题,我可以在使用ADC进行加速度计的同时使用另一个针脚来读取数字传感器吗?

    提前感谢!

    TBM
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Tatiana Barrios 说:
    但我还有另一个问题,我是否可以在将ADC用于加速计的同时使用另一个针脚并读取数字传感器?

    当然。 ADC正在实现其神奇的功能,而其它外设甚至CPU也可以自由地执行其它操作。