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.

[参考译文] MSP430F5529:对负值进行采样并将其存储在存储器中

Guru**** 2811905 points

Other Parts Discussed in Thread: MSP430F5529, LMP7721

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/824123/msp430f5529-sample-and-store-negative-values-in-memory

器件型号:MSP430F5529
主题中讨论的其他器件: LMP7721

大家好、

我已经使用连接到我的传感器的 MSP430F5529系统构建了一个数据采集系统。 我的传感器同时产生正值和负值。 我能够存储正值、但无法存储负值。 有人可以建议我如何操作?  

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

    您好、Mukul、

    哪种类型的传感器会产生正负值?

    听起来整数值是"无符号"的、因此始终为正。  您可以将变量声明为"已签名"、编译器将为您处理其余的变量。

    示例: int16_t var1;

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

    您好 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 之间的电压输出(当然取决于放大器的增益)。

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

    尊敬的 Dennis:

    我将使用 IC LMP7721、这是一个运算放大器。 它用于跨阻模式。 它可以采用饱和限制内的任何正值和负值。 我知道 MSP430f5529 ADC 不能像您说的那样取零以下的值。

    但是、我给出了一个适当的直流偏移值、我的工作正如您提到的那样完成。 非常感谢。  

    Mukul