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

[ATMEGA328p-pu] - Nieprawidłowy pomiar ADC w programie BLDC_mega328p

apollo1412 16 Lis 2014 18:09 1953 17
  • #1 14137564
    apollo1412
    Poziom 11  
    Korzystam w swoim projekcie z przetwornika ADC. Jednak mam taki problem że źle mierzy wartości. Przekręcę potencjometr maksymalnie w lewo program wskazuje wartość 255, gdy przekręcę na połowę zakresu - 248. Przy kręceniu maksymalnie w prawo wartości spadają lawinowo do zera.
    Natomiast w innym programie wszystko działa poprawnie. Kopiowałem te same linijki kodu więc nie wiem co jest źle.
    Poprawne działanie w programie ADC238p, natomiast nie poprawne w BLDC_mega328p. W tym drugim pomiar jest przeprowadzony w bldc.c w przerwaniu.
  • #2 14137794
    yokoon
    Poziom 29  
    Witam.
    Czy ten potencjometr jest liniowy ?
  • #3 14137916
    apollo1412
    Poziom 11  
    Cytat:
    Natomiast w innym programie wszystko działa poprawnie.

    Napisałem wyżej, tzn. jest linowy a zachowuje się jak logarytmiczny w tym właśnie programie BLCD. W programie ADC zachowuję się jak liniowy.
  • #5 14140025
    apollo1412
    Poziom 11  
    Konkretnie co?
    Bo cały projekt opiera się właśnie o tę stronę, ale sam potencjometr to już moja inwencja.
  • #6 14143418
    apollo1412
    Poziom 11  
    Dobra. Kod prezentuje się następująco:

    to jest program w którym wszystko działa jak potrzeba:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Teraz drugi program i w nim jest problem z działaniem potencjometru. Tutaj program główny:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    tutaj program bldc.c gdzie wykonuje pomiar ADC (w przerwaniu na samym końcu - case komut_7)
    Kod: text
    Zaloguj się, aby zobaczyć kod


    no i biblioteka do programu
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #7 14144498
    szymon0147
    Poziom 10  
    Witam

    Spróbuj zmienić volatile int wynik=0 na volatile uint16_t wynik=0 w pliku bldc.c.
  • #8 14144578
    apollo1412
    Poziom 11  
    Poprawiłem, niestety nie w tym błąd.

    Czy na taki niepoprawny błąd pomiaru wpływa to że pomiar jest realizowany w przerwaniu?
  • #9 14144962
    dondu
    Moderator na urlopie...
    W przerwaniu dodałeś funkcję:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    która zmienia ustawienia ADC, którego multiplekser używany jest do sterowania silnikiem. W którym miejscu kodu zadbałeś o ponowne przywrócenie właściwego ustawienia miltipleksera?

    To ma być to?:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Pomijam już uart_putlong() w przerwaniu, która zapewne ma pętle oczekujące itp.
    Uporządkuj kod i pokaż go po poprawkach. Monitoring wykonuj w pętli głównej, a w przerwaniu ustawiaj tylko jakąś zmienną globalną, którą monitoring wyśle uartem.

    Dopiero wtedy możemy próbować rozwiązać Twój problem.
  • #10 14145764
    apollo1412
    Poziom 11  
    Funkcja
    Kod: text
    Zaloguj się, aby zobaczyć kod

    zapewnia jednokkrotny pomiar ADC.
    ponowne przywrócenie multipleksera było zrealizowane za pomocą
    Kod: text
    Zaloguj się, aby zobaczyć kod

    silnik się kręcił dalej, więc przerwania działały dobrze.

    No dobrze, poprawiłem kod i zmieniłem trochę koncepcję. Teraz pomiar nie będzie realizowany w przerwaniu, ale w pętli głównej, zaraz po tym jak nastąpi przerwanie od pierwszej komutacji o czym inforumuje
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Tera program main w którym odbywa się pomiar:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Program bldc.c gdzie są przerwania
    Kod: text
    Zaloguj się, aby zobaczyć kod


    i biblioteka bldc.h
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Bibliotek do UARTA nie wrzucam do są na pewno dobrze, robione ze stronki mirekk36.blogspot.com, tam wszystko działa.
    No i na koniec program o który się opierwałem z pomiarem ADC który DZIAŁA
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #11 14146482
    apollo1412
    Poziom 11  
    coś znalazłem:
    zamieniłem te dwie linijki:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    na te:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    i pomiar jest ok. Pod PC5 mam potencjomert właśnie.
    Ale pojawił się inny. Silnik działa dobrze pomiędzy wartościami 130-255, poniżej takich się nie kręci, ale uwaga ! nawet jak nie używam zmiennej wynik jako wypełnienie PWM (!)
    Do tego jest teraz nieco głośniejszy - troszkę piszczy, można temu zaradzić?
  • #12 14146544
    michalko12
    Specjalista - Mikrokontrolery
    apollo1412 napisał:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Chyba nie panujesz nad tym co robisz.

    W pierwszej linii zerujesz bit PC5
    Druga linia powoduje, że tylko PC4 jest wyjściem i kompletnie zamazuje wszystkie wcześniejsze ustawienia rejestru DDRC.

    Doczytaj dobrze o operacjach bitowych w C i operatorach &=, |=, ~.
  • #13 14146623
    apollo1412
    Poziom 11  
    Pin PC5 ustawiam jako wejście bez podciągniętego rezystora, a PC4 jako wyjście z podciągniętym z rezystorem.
    Może się nie zrozumięliśmy - PC5 ma być wyjściem dla potencjometru, ale wejściem do uC
  • #14 14146738
    michalko12
    Specjalista - Mikrokontrolery
    apollo1412 napisał:
    Może się nie zrozumięliśmy - PC5 ma być wyjściem dla potencjometru, ale wejściem do uC

    Ja wiem dobrze co chcesz osiągnąć.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Jeszcze raz zastanów się nad poprawnością tych 4 linijek kodu! Zwłaszcza linii 2 i 4, przy takim zastosowaniu tych linii, linie 1 i 3 są zbędne i jeśli gdzieś wcześniej w programie już używałeś tego portu to ten zapis wszystko niszczy.

    W liniach 2 i 4 zwróć uwagę na znak "=" powinno być "|="
  • #15 14146830
    apollo1412
    Poziom 11  
    Aha, tu widzisz problem, na razie tego wyjścia nie używam, korzystam z niego jako synlalizacyjne, ale nie w tej chwili, w takim razie napiszę po prostu
    Kod: text
    Zaloguj się, aby zobaczyć kod


    ale silnik dalej przestaje się kręcić przy małych wartościach adc, np. przy 50, ale kiedy podam sztywno wartość PWM_akt=50 to działa.
  • #16 14149721
    apollo1412
    Poziom 11  
    Silnik przestaje się kręcić jeżeli skręcę potencjometr do zera
  • #18 14158443
    apollo1412
    Poziom 11  
    Przepraszam, źle się wyraziłem. Silnik przestaję się kręcić przy poniżej wypełnienia 150 przy pomiarze z potencjometru, natomiast przy ustawieniu na sztywno PWM_akt = 30 kręci się. Dodatkowo jeżeli wyniki pomiarów podzielę np. nie na 4 jak tu:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    a na 16 tak aby wynik był z przedziału 0-63 to silnik przestaje działać przy wartości 12.
    Może sposób pomiaru jest jednak nie właściwy? Nie zależnie jak ustawię skalowanie wyniku potencjometru, silnik przestaje się kręcić jeżeli skręcę potencjometr mniej więcej od 1/3 zakresu w dół.
REKLAMA