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.

[参考译文] MSP430FR6047:我尝试从 P2.2 (定制板)读取 ADC 电压。 我的 ADC 值从2048 12位分辨率开始。 不会下降到低于该值。

Guru**** 2390755 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1349759/msp430fr6047-i-tried-to-read-the-adc-voltage-from-the-p2-2-customized-board-my-adc-value-starting-from-2048-12-bit-resolution-its-not-decreasing-below-that

器件型号:MSP430FR6047

#include <msp430.h>

unsigned int ADC_value;

int main(void)
{
    WDTCTL = WDTPW | WDTHOLD;   // stop watchdog timer

    P2SEL1 |= BIT2;             // Configure P2.2 for ADC
    P2SEL0 |= BIT2;

    PM5CTL0 &= ~LOCKLPM5;       // Unlock I/O pins

    // Configure internal voltage reference
    while (REFCTL0 & REFGENBUSY);   // If reference generator busy, WAIT
    REFCTL0 |= REFVSEL_0 | REFON;  // Select internal ref = 2.5V, Reference ON

    // Configure ADC
    ADC12CTL0 &= ~ADC12SHT0;
    ADC12CTL0 |= ADC12SHT0_2;  // 16 ADC12CLK cycles


    ADC12CTL0 |= ADC12ON;       // Turn on ADC12
    ADC12CTL1 |= ADC12SSEL_2 | ADC12SHP;  // SMCLK, sample-and-hold mode


    ADC12CTL2 &= ~ADC12RES_3;   // Clear resolution bits
    ADC12CTL2 |= ADC12RES_2;    // 12-bit conversion resolution


    ADC12MCTL0 |= ADC12INCH_14; // Channel A14 (P2.2)


    ADC12CTL0 &= ~ADC12VRSEL_2; // Clear previous reference voltage selection
    ADC12CTL0 |= ADC12VRSEL_2;  // Select AVCC as Vref+ and AVSS as Vref-

    ADC12IER0 |= ADC12IE0;      // Enable ADC interrupt

    __enable_interrupt();       // Enable global interrupts

    while (1)
    {
        ADC12CTL0 |= ADC12ENC | ADC12SC;  // Start conversion

        // Main application logic can be added here
    }
}

// ADC ISR
#pragma vector = ADC12_VECTOR
__interrupt void ADC12_ISR(void)
{
    ADC_value = ADC12MEM0;      // Read ADC value
    ADC12IFGR0 &= ~ADC12IFG0;   // Clear interrupt flag
}



我尝试从通道14读取我的代码。
引脚分配执行该操作。   

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

    您施加到引脚的实际电压是多少? ADC 读数在2048以上是否适当缩放?

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




    Im 应用3.3V  

    ADC 读数是否在2048以上适当缩放?

    是的、它在2048以上、而我试图减少其不降低和仅增加

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

    尊敬的 Aravind:

    SOURCE_VCC 是可调节值吗? 看起来像是硬连线到电压源值/2。  

    此外、如果您使用 SOURCE_VCC 作为器件的电压电源、并且您使用 AVCC 作为 VCC +(查看您的代码、看起来就像这样)、则施加到 P2.2的电压始终为 VREF/2、 这将导致 ADC 读数大约为2048。 如果您要测量电压、则不能使用该电压作为基准、因为产生的 ADC 值始终是源电压的倍数。

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

    那么、我现在需要做什么呢? 有什么建议吗?

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

    如果您希望使用该引脚测量电压、则需要 为 MSP 提供与所测量电压不同的基准。 必须使用一些其他稳定的基准电压。

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

    实际上我的问题是不同的  

    我设置了一些 3.6的基准电压是手动设置的、但考虑到使用3.6V 的电池、在几个月后、电压降至2.0V、但我在此手动实施了3.6V、因此它不应该发生在该范围内测量、它应该了解电源 输入电压、并进行相应的更改。

     我需要这方面的建议

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

    您需要使用分压器和1.2V 内部基准。

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

    我添加了两个100千欧的电阻器、以及如何实施1.2V 内部基准?  

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

    在用户指南中:

    查看指南的相关章节、以设置参考模块

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

    50%分压器将不起作用。 如果使用1.2V 基准、则可获得的最大测量电压为1.2V。

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

    #include <msp430.h>
    
    unsigned int ADC_value;
    
    void UART_sendData(char data) {
        while (!(UCA3IFG & UCTXIFG)); // Wait for TX buffer to be ready
        UCA3TXBUF = data;
    }
    
    void UART_sendString(char *str) {
        while (*str != '\0') {
            UART_sendData(*str++);
        }
    }
    
    int main(void)
    {
        WDTCTL = WDTPW | WDTHOLD;   // stop watchdog timer
    
        P2SEL1 |= BIT2;             // Configure P2.2 for ADC
        P2SEL0 |= BIT2;
    
        PM5CTL0 &= ~LOCKLPM5;       // Unlock I/O pins
    
        // Configure internal voltage reference
         while (REFCTL0 & REFGENBUSY);   // If reference generator busy, WAIT
        REFCTL0 |= REFVSEL_1 | REFON;  // Select internal ref = 2.5V, Reference ON
    
        // Configure ADC
        ADC12CTL0 &= ~ADC12SHT0;
        ADC12CTL0 |= ADC12SHT0_2;  // 16 ADC12CLK cycles
        ADC12CTL0 |= ADC12ON;       // Turn on ADC12
        ADC12CTL1 |= ADC12SSEL_2 | ADC12SHP;  // SMCLK, sample-and-hold mode
        ADC12CTL2 &= ~ADC12RES_2;   // Clear resolution bits
        ADC12CTL2 |= ADC12RES_2;    // 12-bit conversion resolution
        ADC12MCTL0 |= ADC12INCH_14; // Channel A14 (P2.2)
        ADC12CTL0 &= ~ADC12VRSEL_2; // Clear previous reference voltage selection
       // ADC12CTL0 |= ADC12VRSEL_2;  // Select AVCC as Vref+ and AVSS as Vref-
        ADC12IER0 |= ADC12IE0;      // Enable ADC interrupt
    
        // UART initialization
        P8SEL0 |= BIT2 | BIT3;      // Configure P8.2 and P8.3 for UART
        P8SEL1 &= ~(BIT2 | BIT3);
        UCA3CTLW0 |= UCSWRST;       // Put UART module in reset state
        UCA3CTLW0 |= UCSSEL__SMCLK; // Select SMCLK as the clock source
        UCA3BR0 = 104;               // Set Baud rate to 9600 (assuming SMCLK is 1MHz)
        UCA3MCTLW = 0x2000;          // Set modulation (UCBRSx = 4, UCBRFx = 1, UCOS16 = 0)
        UCA3BR1 = 0;
        UCA3CTLW0 &= ~UCSWRST;       // Clear UCSWRST
    
        __enable_interrupt();       // Enable global interrupts
    
        while (1)
        {
            ADC12CTL0 |= ADC12ENC | ADC12SC;  // Start conversion
        }
    }
    
    // ADC ISR
    #pragma vector = ADC12_VECTOR
    __interrupt void ADC12_ISR(void)
    {
        ADC_value = ADC12MEM0;      // Read ADC value
    
        // Convert ADC value to voltage
        float voltage = (ADC_value * ADC12VRSEL_2) / 4095.0;
    
        // Transmit voltage value via UART
        char voltage_str[10];
        int wholePart = (int)(voltage);
        int decimalPart = (int)((voltage - wholePart) * 1000);
        voltage_str[0] = (wholePart / 10) + '0';
        voltage_str[1] = (wholePart % 10) + '0';
        voltage_str[2] = '.';
        voltage_str[3] = (decimalPart / 100) + '0';
        voltage_str[4] = ((decimalPart / 10) % 10) + '0';
        voltage_str[5] = (decimalPart % 10) + '0';
        voltage_str[6] = 'V';
        voltage_str[7] = '\n';
        voltage_str[8] = '\r';
        voltage_str[9] = '\0';
    
        UART_sendString(voltage_str);
       __delay_cycles(200000);
        ADC12IFGR0 &= ~ADC12IFG0;   // Clear interrupt flag
    }
    



    我尝试过这种方法  

    包含 UART 的 Im、用于查看终端中的输出  
    当我置位时  

    浮动电压=(ADC_value * ADC12VRSEL_2)/ 4095.0;


    我得到2.75V 的读数