Other Parts Discussed in Thread: MSP430F5529, LMP7721
主题中讨论的其他器件: LMP7721
大家好、
我已经使用连接到我的传感器的 MSP430F5529系统构建了一个数据采集系统。 我的传感器同时产生正值和负值。 我能够存储正值、但无法存储负值。 有人可以建议我如何操作?
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.
Other Parts Discussed in Thread: MSP430F5529, LMP7721
大家好、
我已经使用连接到我的传感器的 MSP430F5529系统构建了一个数据采集系统。 我的传感器同时产生正值和负值。 我能够存储正值、但无法存储负值。 有人可以建议我如何操作?
您好 Dennis、
我正在使用电化学传感器。 它会产生氧化和减少电流、其中氧化电流为正电流、减少电流为负电流。 电流通过跨阻放大器转换为电压。 我需要对该正负电压进行采样。
我已经将变量分配为有符号整数。 我想知道我需要在我的代码中做出什么更改。 我将在下面编写代码。
#include
unsigned int i、b;
signed int ADC_Data = 0;
void main(){
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
///////////////////////////////////////////////////// 配置 REF 模块////////////////////////////////////////////////////////////////
REFCTL0 = 0x0000;//禁用 REFMSTR
////////////////////////////////////////////////// 计数器 IC 的端口配置//////////////////////////////////////////////////
P3DIR = 0x01;//端口 p3.0为同步计数器提供时钟信号
P3OUT = 0x00;//将时钟初始化为零
P4DIR = 0x02;//端口4.1用作计数器 IC 的使能端
P4OUT = 0x02;//计数器 S0/S1的复位状态。
////////////////////////////////////////////////// 配置 UART //////////////////////////////////////////////////////////////////////////////
P4SEL |= BIT4+BIT5;
UCA1CTL1 |= UCSWRST;//**将状态机置于复位状态**
UCA1CTL1 |= UCSSEL_2;// SMCLK
UCA1BR0 = 9;// 1MHz 115200 1/.1152 = 9
UCA1BR1 = 0;// 1MHz 115200
UCA1MCTL |= UCBRS_1 + UCBRF_0;//调制 UCBRSx=1、UCBRFx=0
UCA1CTL1 &=~UCSWRST;//**初始化 USCI 状态机**
UCA1IE |= UCRXIE;
UCA1IFG &=~UCRXIFG;//复位接收 IFG 标志
////////////////////////////////////////// 配置 ADC //////////////////////////////////////////////////////////////////////////////////
P6SEL |= 0x01; // P6.0 ADC 选项选择
ADC12CTL0 = ADC12SHT0_3 + ADC12ON + ADC12REFON; //采样时间、ADC12ON、
ADC12CTL1 = ADC12SHP + ADC12SSEL_0 + ADC12CONSEQ_0 + ADC12DIV_0 + ADC12CSTARTADD_0; //使用脉冲模式采样计时器+ ADCCLK=SMCLK
ADC12CTL2 = ADC12RES_2 + ADC12DF; //分辨率= 12位
ADC12MCTL0 = ADC12SREF_1 + ADC12INCH_0; // VR+= 1.5V & VR-= 0V
对于(i=0;i<0x50;i++); //基准启动延迟
ADC12IE = 0x0001;
ADC12IFG = 0x0000;
ADC_Data = 0;
while (1)
{
_bis_SR_register (LPM0_bits + GIE); //输入 LPM0、中断被启用
__no_operation();
}
}
////////////////////////////////////////////////// ISR- UART ////////////////////////////////////////////////////////////////////////////////////////////////////////
#pragma vector=USCI_A1_vector
_interrupt void USCI_A1_ISR (void)
{
UCA1IFG &=~UCRXIFG;
B=0;
P3OUT = 0;
P4OUT = 0x00;//如果 P4.1为1、则 S0/S1为高电平、计数器开始计数。
TA0CCTL0 = CCIE;
TA0CTL = tassel_2 + ID_0 + TACLR + MC_1;
TA0CCR0 = 21000;
_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);
}
////////////////////////////////////////////////// ISR - timer_A0 //////////////////////////////////////////////////////////////////
#pragma vector = TIMER0_A0_vector // Timer0 A0中断服务例程
_interrupt void TIMER0_A0_ISR (void)
{
ADC12CTL0 |= ADC12ENC + ADC12SC; //开始采样/转换
ADC12CTL0 = 0xFFFE;
_DELAY_CYCLES (50);
P3OUT ^= 1;
b +=1;
如果(b > 511)
{
TA0CTL = 0;
P4OUT = 0x02; //异步清零
P3OUT=0;
}
}
////////////////////////////////////////////////// ISR- ADC //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#pragma vector = ADC12_vector
_interrupt void ADC12_ISR (void)
{
switch (__evo_in_range (ADC12IV、34))
{
情况0:中断;//向量0:无中断
情况2:中断;//矢量2:ADC 溢出
情况4:中断;//矢量4:ADC 时序溢出
情况6://向量6:ADC12IFG0
ADC_Data = ADC12MEM0;
ADC12IFG &=~ADC12IFG0;
while (!(UCA1IFG & UCTXIFG));
UCA1TXBUF =(ADC_Data& 0x00FF);//首先发送最低有效字节
while (!(UCA1IFG & UCTXIFG));
UCA1TXBUF =((ADC_Data & 0xFF00)>>8);//发送最高有效字节
_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出活动 CPU
中断;
情况8:中断;//向量8:ADC12IFG1
情况10:中断;//向量10:ADC12IFG2
情况12:中断;//向量12:ADC12IFG3
案例14:中断;//矢量14:ADC12IFG4
情况16:中断;//向量16:ADC12IFG5
情况18:中断;//向量18:ADC12IFG6
情况20:中断;//向量20:ADC12IFG7
情况22:中断;//向量22:ADC12IFG8
情况24:中断;//向量24:ADC12IFG9
情况26:中断;//向量26:ADC12IFG10
情况28:中断;//向量28:ADC12IFG11
情况30:中断;//向量30:ADC12IFG12
情况32:中断;//向量32:ADC12IFG13
案例34:中断;//矢量34:ADC12IFG14
默认值:break;
}
}
请告诉我出错的地方。
谢谢
Mukul
您好、Mukul、
在我们开始详细了解您的代码之前、您的放大器是如何偏置的? 我的意思是、它的输出是否可以高于和低于接地电势?
我提出的原因是 MSP430 ADC 输入被限制在 VSS (接地)到+VREF、在您的情况下为1.5。 如果您尝试将 ADC 输入驱动至低于接地值、测量值将不准确。
如果是这种情况、您是否可以向放大器施加失调电压、以便其共模输出位于+VEF/2或大约0.75V? 这样、零电流将产生0.75V 的输出电压、"负"电流将在放大器输出端产生0.75至0V 的电压、而"正"电流将产生0.75至+VREF 之间的电压输出(当然取决于放大器的增益)。