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.

[参考译文] MSP430G2553:MSP430G2553 ADC的问题

Guru**** 2524550 points
Other Parts Discussed in Thread: MSP430G2553

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/618174/msp430g2553-problem-with-msp430g2553-adc

部件号:MSP430G2553
主题中讨论的其他部件: MSP-EXP430G2

我正在使用MSP-EXP430G2 Launchpad (带MSP430G2553微控制器)从分压器中采样。 更具体地说,我有一个FSR (力感应电阻器)传感器,与一个10 K欧姆固定电阻器串联,作为分压器。 我正在使用我的启动板上的Vcc为FSR传感器通电。 分压器的输出或ADC的输入是可变的,取决于施加在FSR传感器上的压力量(FSR传感器上的压力越大,分压器输出上的电压就越高)。 我设置了我的代码,使我的微控制器通常处于低功耗模式3 (LPM3),并且只有当我的上模式计数器溢出时,才会生成中断服务例程(ISR),以便使用ADC的通道0 (A0)获取单个ADC样本。 我遇到的问题是,我的ADC信道的采样值仅保持在0到80的范围内,具体取决于我对FSR施加的压力。 换言之,当我对传感器施加很大压力时,我应该会看到值大约为1023 (由于10位ADC)。 但是,ADC输出仅显示80。 此外,当我删除代码的ISR部分并移动代码以从主函数中获取ADC样本时,ADC工作正常(当我非常硬地压缩FSR传感器时,ADC输出的值大约为1000)。 我将感谢您为解决此问题提供任何建议/帮助。  

#include <msp430g2553.h>
#define CONSEQ_0
易失性无符号int ADC_Value=0;
void FaultRoutine(void);


内部主(无效)

WDTCTL = WDTPW + WDTHOLD;//停止WDT

IF (CALC1_1MHz == 0xFF || CALDCO_1MHz == 0xFF)
FaultRoutine();//如果校准数据被擦除,请运行FaultRoutine()

//配置时钟
BCSCTL1 = CALC1_1MHz;//设置范围DCOCTL = CALDCO_1MHz;
DCOCTL = CALDCO_1MHz;//设置DCO = 1MHz
BCSCTL2 = DIFS_0;//SMCLK = DCO = 1MHz
BCSCTL3 |= LFXT1S_0 + XCAP_3;//设置时钟系统以32 KHz的频率运行
IFG1 &=~OFIFG;//清除OSCFault标志

//配置引脚
P1DIR = 0xFF;//端口1中的所有引脚作为输出
P1OUT = 0;//为端口1中的所有引脚分配零(低)
P2DIR = 0xFF;//端口2中的所有引脚作为输出
P2OUT = 0;//为端口2中的所有引脚分配零(低)

//配置计时器
CCTL0 = CCIE;// CCR0中断已启用
CCR0 = 3277;//0.1秒之间的ISR间隔
TACTL = Tassel_1 + MC_1;//计时器时钟源ACLK,(MC_1为上模式)


同时(1)

_BIS_SR_REGISTER (LPM3_BITS + GIE);//输入带中断的LPM3
}

}

void FaultRoutine (void)

P1OUT = 0x01;//红色LED亮起
while (1);//陷阱
}

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

//使用Vcc为FSR加电
ADC10CTL1 = inch_0+ADC10DIV_0++ ADC10SSEL_1;//通道A0,ADC10CLK/1,ACLK作为ADC时钟
ADC10CTL0 = SREF_0 + ADC10SHT_0 +REFON+ ADC10ON + ADC10IE;// Vcc和VSS作为参考,采样和保持4个时钟周期,ADC打开
_DELAY周期(5);
ADC10CTL0 |= ENC + ADC10SC;
__DELAY周期(13);
}

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

ADC10CTL0 &=~ENC;
ADC10CTL0 &=~(REFON+ADC10ON);
ADC_VALUE = ADC10MEM;
CCR0 +=3277;
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1-我不知道FSR (力敏感电阻器)。
    2553 ADC mux的输入阻抗是否会干扰? (数据表SLAS735J第37页是否会干扰?
    换言之,您是否在仅使用DVM测量的分压器处获得所需的电压?

    2---您正在Launchpad上使用ADC信道A0?
    红色LED是否会干扰? 如果是,请卸下跳线。

    最后,我们想知道有关FSR的情况。 另外,分压器的连接方式:
    -(Vcc >> 10K >> FSR >> GND)
    或-
    -(Vcc >> FSR >> 10K >> GND)

    如您所述,2553 ADC A0连接到FSR和10K之间的V分压器。

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

    如果在不使用中断时ADC结果正常,则可能是由于计时而干扰了您的转换。 我看到的一件事是,您正在使用UP模式计时器,并且您在ADC ISR内将CCR0增加了100ms。 这是不寻常的-在UP模式下,计时器计数到给定的值,然后跳回0。 在连续模式下,通常使用向CC寄存器添加值。 您正在更改每个周期的周期。 顺便说一句,无需为每次转换重新初始化ADC。 只需执行一次。

    Dennis
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,
    感谢您的回复。 问题在于我将所有引脚都定义为输出和低。 为了获得成功的ADC读取,我只需要在ISR开始时将ADC通道定义为输入,然后将其切换回ISR结束时的输出。 这解决了问题。
    祝你一切顺利,
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Dennis,
    感谢您的回复。 我修改了我的代码并添加了您的建议。
    但是,我遇到的问题是因为我的所有引脚都被定义为输出,并且在我的主要功能中都是低的。 为了在ISR内成功读取ADC,我只需要在ISR开始时将ADC通道定义为输入,然后将其切换回ISR结束时的输出。 这解决了问题。
    祝你一切顺利,
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很高兴听到它工作正常,但输入/输出方向和功能选择位并不关心ADC模块- ADC的配置会覆盖引脚方向:

    所以你的解决方案是另一回事;)

    Dennis