logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Rozwiązano] Nie mogę poprawnie odczytać wartości ADC ze wzmacniacza operacyjnego

eskulapa555 08 Wrz 2020 12:01 666 5
REKLAMA
  • #1 18913152
    eskulapa555
    Poziom 6  
    Posty: 31
    Cześć,
    Zbudowałem układ badający napięcie na celi baterii litowo jonowej. Zrobiłem to za pomocą wzmacniacza operacyjnego odejmującego i mikrokontrolera. Pierwszy wzmacniacz odejmuje a drugi jest jakby buforem, zrobiłem tak żeby pozbyć się problemu gdy bateria jest uszkodzona i na jednym styku mamy np 5.2V a na drugim 1V (nie chcialem zeby watosc roznicowa byla wieksza jak 3.3V).

    Gdy przykladam miernik bezposrednio do drugiego wzmacniacza (bufora) to na wyjsciu mam zawsze 1.74V a gdy robie pomiar ADC to dostaje wyniki w zakresie od 0.8V - 2.2V i co pomiar losowo ta wartość z tego przedziału się zmienia. Co robię źle, że mikrokontorler nie pokazuje stalej wartości?

    Dodam, że także mierze napięcie na potencjometrze i ono oscyluje w granicy 1.60-1.62V więc ADC na potencjometrze działa poprawnie.

    Poniżej wstawiam kod programu a w zalaczniku schemat.



    float adc_read(uint32_t channel) {
    ADC_ChannelConfTypeDef adc_ch;
    adc_ch.Channel = channel;
    adc_ch.Rank = ADC_REGULAR_RANK_1;
    adc_ch.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
    HAL_ADC_ConfigChannel(&hadc1, &adc_ch);

    HAL_ADC_Start(&hadc1);
    HAL_ADC_PollForConversion(&hadc1, 100);
    return HAL_ADC_GetValue(&hadc1);
    }


    int main(void) {
    /* USER CODE BEGIN 1 */

    /* USER CODE END 1 */

    /* MCU Configuration--------------------------------------------------------*/

    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    HAL_Init();

    /* USER CODE BEGIN Init */

    /* USER CODE END Init */

    /* Configure the system clock */
    SystemClock_Config();

    /* USER CODE BEGIN SysInit */

    /* USER CODE END SysInit */

    /* Initialize all configured peripherals */
    MX_GPIO_Init();
    MX_ADC1_Init();
    /* USER CODE BEGIN 2 */

    /* USER CODE END 2 */

    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
    while (1) {
    /* USER CODE END WHILE */
    HAL_GPIO_WritePin(led1_GPIO_Port, led1_Pin, GPIO_PIN_SET);
    HAL_Delay(1000);

    cela1 = adc_read(ADC_CHANNEL_1);
    cela11 = cela1 * 3.3 / 4096.0;
    HAL_Delay(200);

    potencjometr = adc_read(ADC_CHANNEL_7);
    potencjometr1 = potencjometr * 3.3 / 4096.0;
    HAL_Delay(200);


    HAL_GPIO_WritePin(led1_GPIO_Port, led1_Pin, GPIO_PIN_RESET);
    HAL_Delay(1000);

    /* USER CODE BEGIN 3 */
    }
    /* USER CODE END 3 */
    }
    Załączniki:
    • Nie mogę poprawnie odczytać wartości ADC ze wzmacniacza operacyjnego wzmacniacze.png (78.43 KB) Musisz być zalogowany, aby pobrać ten załącznik.
    • Nie mogę poprawnie odczytać wartości ADC ze wzmacniacza operacyjnego potencjometr.png (16.56 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #2 18913201
    viayner
    Poziom 43  
    Posty: 10632
    Pomógł: 1563
    Ocena: 2052
    Witam,
    nie bardzo rozumiem te zalaczone schematy, gdzie jest ten bufor na drugim OA? czy te napiecia 3.7V i 7.2V to napiecia wejsciowe ? Czy one nie sa "ciut" wyzsze od Ucc ? - jak wtedy bedzie sie zachowywal twoj wzm. operacyjny ?
    Pozdrawiam
  • REKLAMA
  • #3 18913211
    eskulapa555
    Poziom 6  
    Posty: 31
    viayner napisał:
    Witam,
    nie bardzo rozumiem te zalaczone schematy, gdzie jest ten bufor na drugim OA? czy te napiecia 3.7V i 7.2V to napiecia wejsciowe ? Czy one nie sa "ciut" wyzsze od Ucc ? - jak wtedy bedzie sie zachowywal twoj wzm. operacyjny ?
    Pozdrawiam



    Na tym wzmacniaczu po prawej jest ten bufor. On nie robi nic innego jak kopiuje napiecie ktore dostanie na wejsciu i przerzuca je na wyjście. Chodziło mi o to że jeżeli ten wzmacniacz dostanie napiecie powyzej 3.3V np 4.2V to ze wzgledu na to że jest zasilany 3.3V to nie przekaże napięcia 4.2V a wyjście czyli do mikrokontrolera.

    Tak napiecie 3.7 i 7.2V to napiecia wejsciowe. Wszystko jest na wspolnej masie.

    Mikrokontroler dziala na 3.3V, to stm32f103cbt6

    Ale w moim problemie chodzi mi o to ze jak czytam ADC z wyjść wzmacniacza (tego po prawej, bufora) to dostaje losowe wyniki gdzie jak mierze multimetrem ręcznie to caly czas ta sama wartość jest ok 1.7V

    Te ADC zachowuje sie mniej wiecej tak jakbym gdzieś masy nie podłączył a sprawdziłem wszystko dokładnie i całość "przepikałem" multimetrem, wszedzie masa jest. Co jeszcze może być nie tak ?
  • REKLAMA
  • #4 18913321
    viayner
    Poziom 43  
    Posty: 10632
    Pomógł: 1563
    Ocena: 2052
    Witam,
    no nie zgadzalo mi sie bo oba maja konfiguracje wzm roznicowych a bufor to poprostu (-) do wyjscia.
    Jezeli masz plywajace napiecie to albo jak wspomniales masz problem z masa lub wejscie "wisi w powietrzu" i zbiera "smieci". Widze tu jeszcze jeden problem zauwazyles ze masz obciazenie OA w postaci kondensatora nawet sporego?
    https://www.analog.com/en/analog-dialogue/articles/ask-the-applications-engineer-25.html
    https://www.analog.com/en/analog-dialogue/art...-to-avoid-instability-capacitive-loading.html
    zastosuj na probe:
    - bardzo uproszczony program tylko czytajacy ADC na ktore masz podane poprawne napiecie
    - podaj na wejscie twojego ukladu poprawne napiecia <Ucc
    - zastosuj uklad kompensujacy wplyw pojemnosci na wyjsciu, powiedzmy wyjscie-rezystor kilkaset ohm i dopiero te 100n i teraz czytaj napiecie na nim.
    LM358 nie jest ukladem typu mogacym pracowac z napieciami wejsciowymi takimi a zwlaszcza wiekszymi od napiecia zasilania.
    Pozdrawiam
  • REKLAMA
  • #5 18913392
    eskulapa555
    Poziom 6  
    Posty: 31
    viayner napisał:
    Witam,
    no nie zgadzalo mi sie bo oba maja konfiguracje wzm roznicowych a bufor to poprostu (-) do wyjscia.
    Jezeli masz plywajace napiecie to albo jak wspomniales masz problem z masa lub wejscie "wisi w powietrzu" i zbiera "smieci". Widze tu jeszcze jeden problem zauwazyles ze masz obciazenie OA w postaci kondensatora nawet sporego?
    https://www.analog.com/en/analog-dialogue/articles/ask-the-applications-engineer-25.html
    https://www.analog.com/en/analog-dialogue/art...-to-avoid-instability-capacitive-loading.html
    zastosuj na probe:
    - bardzo uproszczony program tylko czytajacy ADC na ktore masz podane poprawne napiecie
    - podaj na wejscie twojego ukladu poprawne napiecia <Ucc
    - zastosuj uklad kompensujacy wplyw pojemnosci na wyjsciu, powiedzmy wyjscie-rezystor kilkaset ohm i dopiero te 100n i teraz czytaj napiecie na nim.
    LM358 nie jest ukladem typu mogacym pracowac z napieciami wejsciowymi takimi a zwlaszcza wiekszymi od napiecia zasilania.
    Pozdrawiam



    Temat uwazam za zamknięty.
    Tak jak wspomniałeś na wyjściu dałem za duże kondensotory. Po ich całkowitym usunięciu wszystko gra jak nalezy
REKLAMA