主题中讨论的其他部件: 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;
}