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

[Atmega32]+czujnik przyśpieszenia+obsluga PWM / ADC

Skoren_19 29 Wrz 2011 22:07 3542 27
REKLAMA
  • #1 9977314
    Skoren_19
    Poziom 16  
    Witam:

    A wiec tak:

    Odczyt z czujnika--->porownanie z tablicą--> wysłanie na PWM

    Podlączenia:

    PWM PORTD 4,5
    Czujnik MMA7341 PORTA 0,1,2

    Beda dwie tablice:
    Tablica1
    Tablica2

    Bede upuszczać pewien obiekt z wysokosci do 0,5m, w tym czasie wartość z czujnika bedzie calkowana aby uzyskac predkość, a nastepnie wartość ta bedzie porownywana z tablicy1 I 2. Gdy odczyty bedzie sie zawieral w tablicy1 ma nie wystepowac sygnał PWM, a gdy w tablicy2 sygnał PWM ma sie pojawic. Sygnał PWM zostaje podawanay na tr MOSFET i tak jest generowany aby wytworzyc prąd wartości od 1 - 5 A

    I tu moje pytanie od czego musze zaczać pisanie programu w C aby obslużyć poprawnie PWM / ADC i przerwania? jestem poczatkujący w C ale nie oporny na wiedze. Obsluge przycisków, LCD, petle opoznien juz mam zrobione.

    Pozdrawiam
  • REKLAMA
  • #2 9977685
    janbernat
    Poziom 38  
    No od danych katalogowych Atmega32 i czujnika.
    Trzeba to dokładnie przeczytać.
    Potem od jakiejś książki- są dwie i warto obie kupić i przeczytać.
    To wcale nie są złośliwości.
    Potem zacząć pisać program po kawałku.
    Może najpierw PWM- ile jest trybów PWM, które Timery to obsługują- a może programowy?
    Potem może ADC- jak się to ustawia, czy pomiar ciągły czy co ściśle określony czas- zwłaszcza przy całkowaniu może to drugie.
    Potem to zacząć próbować "sklejać" razem.
    A na końcu- tablice, algorytm itd.
    Istnieje też druga szkoła- najpierw program jako "szkielet" a funkcje niskopoziomowe- zakładamy że możemy zrobić bo wiemy jak.
  • REKLAMA
  • #3 9977863
    dondu
    Moderator na urlopie...
    Skoren_19 napisał:
    I tu moje pytanie od czego musze zaczać pisanie programu w C aby obslużyć poprawnie PWM / ADC i przerwania? jestem poczatkujący w C ale nie oporny na wiedze. Obsluge przycisków, LCD, petle opoznien juz mam zrobione.

    Rzuć okiem tutaj: http://mikrokontrolery.blogspot.com/2011/03/drzaskowy-pamietnik-wstep.html


    janbernat napisał:
    Potem od jakiejś książki- są dwie i warto obie kupić i przeczytać.
    To wcale nie są złośliwości.

    Jan miał na myśli tegoroczne dwie: http://mikrokontrolery.blogspot.com/p/ksiazki-dla-ciebie.html
  • #4 9978185
    Skoren_19
    Poziom 16  
    To tak wykorzystuje timer1, wstepnie PWM iADC mam juz ustawiony na wartosci ktore mnie interesuja. Teraz opisze jak chce to dokladnie zrobic:

    ISR(ADC..)
    uruchomienie ADC,
    Odczyt,
    calkowanie wartości
    porownanie z tablicą
    if(prawda)
    PWM();
    if(falsz)
    sprawdza dalej

    Jesli chodzi o ksiażke to kiedys polecono mi wlasnie Kardaś M. i mysle ze to jest jedna z lepszych pozycji?
  • #5 9978219
    dondu
    Moderator na urlopie...
    Pokaż może co już napisałeś, i napisz wstępną wersję tego pseudokodu, to będzie łatwiej Ci podpowiedzieć.

    Skoren_19 napisał:
    Jesli chodzi o ksiażke to kiedys polecono mi wlasnie Kardaś M. i mysle ze to jest jedna z lepszych pozycji?

    Tak, jedna z dwóch najlepszych, w dodatku najnowszych (2011): http://mikrokontrolery.blogspot.com/p/ksiazki-dla-ciebie.html
  • REKLAMA
  • #6 9978299
    Skoren_19
    Poziom 16  
    Ponizej zamieszczam to co mam do tej pory napisane nie jest tego duzo, duzy nacisk jest kladziony na odpowiedni interfejs wyswietlany na LCD i obsluga przycisków. Pozostala mi kalibracja i ADC i PWM. Zamieszczony w poprzednim poscie pseudokod postaram sie niebawem dodac.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #8 9979842
    Skoren_19
    Poziom 16  
    Zakupilem Pozycje T. Francuz bardzo przystepna dla poczatkujących i zaawansowanych. Jesli chodzi o funkcje goto została zmieniona, lecz tu mam pytanie czy while(1); ma zawierac cala funckje main czy moze byc zrobiona tak jak przedstawilem to ponieżej

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #10 9982327
    Skoren_19
    Poziom 16  
    Witam zrobilem funkcję ADC_init i PWM_init i mam pewien problem, a mianowicie w ktorym miejscu w głownym programie wywolac funkcję PWM? jak to robie na poczatku to program dalej nie rusza tzn nie wyswietla sie dalej treść na LCD:/, sytuacja nie ma miejsca wtedy kiedy wrzuce go w petli while po funkcji przyciski();

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #12 9982414
    Skoren_19
    Poziom 16  
    Wlasnie piszę ISR(ADC_vect) i czytam o calkowaniu wiec mysle że za niedlugo wrzucę częśc kodu.

    Dodano po 59 [minuty]:

    Napisalem początek przerwania dla ADC przy 128 probkach + calkowanie. Czy dobry kierunek obrałem?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dodano po 2 [godziny] 31 [minuty]:

    Dodaje calość tego co wykonalem

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


    ISR(ADC_vect).c

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


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



    Kolejne pytanie mam odnosnie przerwania ISR(ADC-vect) jak w jego strukturze odwolac sie do poszczegolnych wartosci w tablicy zadeklarowanej w funkcji main()? czy jest to wogole wykonalne i sensowne? Pytam gdyż wartość uzyskana na drodze calkowania chce teraz przyrownywac do wartosci w tablicach.

    Zmienne uzywane w przerwaniach zmieniliem na volatile :)
  • REKLAMA
  • #13 9986052
    Skoren_19
    Poziom 16  
    Zredukowalem trochę program tylko do odczytu z ADC bez przyciskow i wyswietlacza.

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

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


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


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


    Problem jest w tym iż mam funkcje rekurencyjna podana ponizej obliczającą mi wartość ADCval. odwoluje sie do niej poprzez #include"... .h" i wyskakuja mi bledy ze nie mam zdefiniowanych ADCval a sa one w głównym programie jako volatile. W czym jest problem?

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #14 9986500
    sulfur
    Poziom 24  
    Skoro zakupiłeś pozycję Pana Francuza to polecam się zapoznać z podrozdziałem traktującym o extern, strona 130.
    Która funkcja jest rekurencyjna ?
  • #15 9987092
    Skoren_19
    Poziom 16  
    Jakim najlatwiejszym kodem odczytac wartość z przetwornika ADC, następnie ja scalkowac i wynik porownać do wartości w tablicy i dac odpowieni sygnal PWM, nawet Francuz T. nie pomaga :/
  • #16 9987213
    sulfur
    Poziom 24  
    W całkowaniu najistotniejsza jest interpretacja geometryczna całki. W skrócie dla całki pojedynczej jest to pole powierzchni pod funkcją. Z metod numerycznych najprostszą jest metoda prostokątów. Aha, i całkowanie w metodach numerycznych zawsze odbywa się w jakimś przedziale.
    Co do w/w pozycji, to oczywiście nie zawiera ona gotowego rozwiązania na zadany w temacie problem. Zawiera natomiast solidną dawkę wiedzy na temat zasad poprawnego programowania, której autorowi wątku brakuje.
    Przerwanie przepełnienia Timera 1 jest błędnie napisane. Wszystkie warunki są do kosza.
    Przerwanie ADC nie zawiera żadnego całkowania, nie mówiąc już o tym, że nie mogę się doszukać odczytywania wyniku konwersji.
    Innymi słowy. Polecam zacząć od początku, bo teraz to wygląda, jakby autor tematu wylądował nie wiadomo jak, nie wiadomo po co w środku dużego bałaganu.
  • #17 9987464
    janbernat
    Poziom 38  
    Będzie to chyba lewitron albo coś w tym rodzaju.
    Do tego co napisał sulfur dodam że przy całkowaniu oś X- w tym wypadku oś czasu- powinna być liniowa(żeby sobie nie komplikować życia).
    To oznacza że odczyt ADC powinien być wykonywany co taki sam czas- to implikuje wykorzystanie timera- i to w przerwaniu od timera powinien nastąpić odczyt ADC.
    Wyniki pomiarów można zapisywać i jak juz przedmiot spadnie to wyświetlić na LCD.
    Nie w trakcie spadania a dopiero potem- żeby w ogóle coś zobaczyć na wyświetlaczu no i żeby obsługa wyświetlacza nie blokowała odczytów.
    A na razie zapomnieć o PWM.
    Jak to zacznie działać- to zabrać się za PWM.
    W dodatku jeśli moje podejrzenia są słuszne to dopiero przy sterowaniu cewki elektromagnesu przez PWM zaczną się problemy.
  • #18 9987512
    Skoren_19
    Poziom 16  
    To moze inaczej:
    czy o cos takiego chodzi ?

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

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


    main.c
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #19 9989112
    sulfur
    Poziom 24  
    Totalnie źle. Proszę zacząć od poznania różnicy pomiędzy | a ||, & a &&. Proszę zapoznać się z różnicą pomiędzy ADCH, ADCW oraz ADC.
    Funkcja read_adc jest do wyrzucenia bo nie nadaje się do niczego. W przerwaniu od ADC uruchamiasz konwersję.
    Określ najpierw, co chcesz osiągnąć, bo takie zgadywanie szybko się nudzi. W "zgadnij co autor miał na myśli" nikt tutaj bawił się nie będzie.
  • #20 9989509
    Skoren_19
    Poziom 16  
    W takim razie zaczynam wszytsko od poczatku bede wrzucać programy z kompletnymi komentarzami do tego co bede ustawiac i jak.

    Pozdrawiam i dziekuje za wytrwalość :)

    Dodano po 2 [godziny] 36 [minuty]:

    A wiec zaczelem od ustawiania portów I/O, następnie funkcja inicjująca ADC_init i Timer0_init, zostala ustawiona tak jak to widać w kodzie. W ADC dalem tryb compare match od timera0 w celu odmierzania stalych interwalów czasowych, a Timer ustawiony na prace normalna z pomiarem co 1ms. Mam nadzieje ze jest to dobry początek. Bede jeszcze uzywać timera1 do sygnałów pwm a SFIOR kasuje zarowno prescaler timera0 i 1 bedzie to mialo jakis negatywny skutek w otrzymaniu prawidlowych sygnałów PWM?

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


    Timer0_init
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #21 9990571
    sulfur
    Poziom 24  
    Teraz jest dużo lepiej.
    Wypada jednak, abyś uruchomił ADC po skonfigurowaniu wszystkich opcji odpowiedzialnych za przetwornik. Czyli bit ADEN powinien być ustawiany na samym końcu ADC_ini.
    To samo dotyczy timera, przy czym za start timera odpowiada ustawienie jego preskalera.
    Moim zdaniem zerowanie preskalera i tak jest jednorazowe, więc traktuje je jako zbędne.
    Jeśli nie jest jednorazowe, ma szanse mieć negatywny skutek.

    Dodano po 3 [minuty]:

    Prawdopodobnie zbędnie ustawiasz bity COM01 i COM00 w TCCR0. Sprawdź to jeszcze raz.
  • #22 9990746
    Skoren_19
    Poziom 16  
    Zrobilem tak jak mnie pokierowaleś. wylaczajac COMn wylaczam rowniez OCRn, mimo wszytsko czas zliczania pozostanie 1ms zgodnie ze wzorem
    F_cu/( prescaler*255) (F_CU=16MHz) zgadza sie ? na razie jeszcze zostawilem zerowanie.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #23 9990794
    Piotr Piechota
    Poziom 22  
    Skoren_19 napisał:
    (...)
    Bede upuszczać pewien obiekt z wysokosci do 0,5m, w tym czasie wartość z czujnika bedzie calkowana aby uzyskac predkość, a nastepnie wartość ta bedzie porownywana z tablicy1 I 2. Gdy odczyty bedzie sie zawieral w tablicy1 ma nie wystepowac sygnał PWM, a gdy w tablicy2 sygnał PWM ma sie pojawic. Sygnał PWM zostaje podawanay na tr MOSFET i tak jest generowany aby wytworzyc prąd wartości od 1 - 5 A(...)


    Witam Jeżeli to coś ma swobodnie lewitować to bez żyroskopu się nie uda.
    Pozdrawiam
  • #24 9990801
    Skoren_19
    Poziom 16  
    Piotr Piechota napisał:
    Skoren_19 napisał:
    (...)
    Bede upuszczać pewien obiekt z wysokosci do 0,5m, w tym czasie wartość z czujnika bedzie calkowana aby uzyskac predkość, a nastepnie wartość ta bedzie porownywana z tablicy1 I 2. Gdy odczyty bedzie sie zawieral w tablicy1 ma nie wystepowac sygnał PWM, a gdy w tablicy2 sygnał PWM ma sie pojawic. Sygnał PWM zostaje podawanay na tr MOSFET i tak jest generowany aby wytworzyc prąd wartości od 1 - 5 A(...)


    Witam Jeżeli to coś ma swobodnie lewitować to bez żyroskopu się nie uda.
    Pozdrawiam


    Nie to nie jest lewitron:D, jest to poprostu obiekt upuszczany na podloże.
  • #25 9990856
    Piotr Piechota
    Poziom 22  
    A możesz zdradzić więcej. Sam walczyłem kiedyś z nawigacją inercyjną gdzie musiałem dwa razy całkować przyspieszenia stąd moje zainteresowanie tematem.
  • #26 9990858
    Skoren_19
    Poziom 16  
    Jest to uklad do tlumienia upadku a dokladnie, stopa robota z poduszkami z ciecza magnetoreologiczna. Zdradzilbys jak wykonywales calkowanie?

    Pozdrawiam
  • #27 9990891
    Piotr Piechota
    Poziom 22  
    Całkowanie zrobiłem metodą trapezów ale błędy podwójnego całkowania + dryft żyroskopu były nie do zaakceptowania. Miała to być kosiarka autonomiczna. Później użyłem GPS'ów - jeden stacjonarny drugi ruchomy (metoda RTK z http://www.rtklib.com ). Na razie projekt leży i czeka na lepsze czasy.

    Pozdrawiam
  • #28 9998997
    Skoren_19
    Poziom 16  
    Temat mozna uznac za zakonczony. Problem zostal rozwiazany w bardzo blachy i prosty sposob, chcialem go rozgryźć od zlej strony bez wiedzy jak dokladnie dziala czujnik :D i co mozna z niego odczytac i w jaki sposob .

    Pozdrawiam
    i Dziekuje, za zainteresowanie tematem
REKLAMA