Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Atmega8 - wzór na sterowanie logarytmczne

pele2 18 Gru 2013 21:16 3849 37
  • #1 18 Gru 2013 21:16
    pele2
    Poziom 9  

    piszę program (na Atmega8) do sterowania obrotami silnika.
    I chcę zrobić sterowanie logarytmiczne (czyli przesuwając potencjometr w początkowych rezystancjach mam bardzo mały przyrost prędkości silnika, a później dopiero gwałtownie silnik przyśpiesza).
    Sterowanie odbywa się długością stanu wysokiego.
    Nie bardzo wiem jakiego wzoru mam do tego użyć. Pomożecie?

    0 29
  • #2 18 Gru 2013 21:33
    tmf
    Moderator Mikrokontrolery Projektowanie

    A jak mierzysz rezystancję potencjometru? Przez ADC? To dodaj sobie tabelę do której indeks to będzie wartość ADC, a wartość danego indeksu bedzie zlogarytmowaną długością impulsu. Żeby pozycji nie było za wiele można zastosować jakąś interpolację pomiędzy indeksami.

    0
  • #3 18 Gru 2013 22:59
    kicajbas
    Poziom 25  

    Witam
    Możesz stworzyć tabelę w.g nast. wzoru:

    ((m/n)^k)*255 ( literówka moja )

    m - liczby całkowite z przedziału od 1 do n
    n - liczba komórek w tabeli
    k - współczynnik od którego zależy nachylenie krzywej ( dla 1 jest to prosta; im wyższe k tym krzywa jest bardzie krzywa :D )
    255 - rozdzielczość ( tu 8 BIT )

    np.:
    [0] (( 1 / 60 ) ^ 1,8 ) * 255
    [1] (( 2 / 60 ) ^ 1,8 ) * 255
    ......
    [ ] (( 60 / 60 ) ^ 1,8 ) * 255 ( =255)

    Oczywiście wynik zaokrąglić.
    Ja tak robię dla LED-ów.
    Pozdr.

    0
  • #4 19 Gru 2013 09:23
    eleproject

    Poziom 17  

    A że tak spytam - potencjometru podłączonego do ADC nie masz czasem o charakterystyce logarytmicznej właśnie? Jeśli tak to dodatkowo pogłębia niechciane zachowanie nastawy.

    Jeżeli masz potencjometr o charakterystyce właśnie takiej to możesz spróbować obrócić go (tak by górny zacisk trafił na dolny a dolny na górny). Możliwe że taki zabieg będzie zadowalający i nie będziesz nic musiał kombinować w programie. Ja bym przynajmniej tak zrobił z ciekawości :) Oczywiście jeśli masz potencjometr o ch-ce logarytmicznej. Tylko, że sterowanie będzie wtedy na odwrót, ale możesz to łatwo obejść odejmując pobraną wartość ADC od maksymalnej wartości ADC. Czyli ADCmax-ADC.

    0
  • #5 23 Gru 2013 06:07
    el2010tmp
    Poziom 25  

    Charakterystyki potencjometrów [ostatnia literka oznaczenia]:
    A - liniowa
    B - logarytmiczna
    C - wykładnicza

    0
  • #6 23 Gru 2013 15:41
    pele2
    Poziom 9  

    potencjometry są liniowe. Są już fabrycznie wmontowane w joystick.
    Pierwotnie było tylko sterowanie liniowe. A teraz potrzeba także logarytmiczne.

    0
  • #7 23 Gru 2013 16:02
    elektryku5
    Poziom 37  

    el2010tmp napisał:
    Charakterystyki potencjometrów [ostatnia literka oznaczenia]:
    A - liniowa
    B - logarytmiczna
    C - wykładnicza


    Gwoli wyjaśnienia, tak chyba było w Telpodach, współczesne potencjometry o oznaczeniu A, od słowa "audio" są logarytmiczne, B natomiast liniowe (przynajmniej ostatnio tak kupowałem i się sprawdziło).

    0
  • #8 12 Sty 2014 11:21
    eleproject

    Poziom 17  

    Zgadza się, też niejednokrotnie się z tym spotkałem, że często obecnie B to są liniowe a A logarytmiczne.

    0
  • #9 14 Sty 2014 14:06
    pele2
    Poziom 9  

    ((m/n)^k)*255

    Ten wzór wygląda obiecująco.
    A mógłby ktoś podpowiedzieć, jak zamiast stałej k (między 1 a 2) użyć potencjometru do nachylania krzywej?

    0
  • #10 15 Sty 2014 01:49
    kicajbas
    Poziom 25  

    Witam
    Chyba nie do końca zrozumiałeś o co w tym algorytmie chodzi.
    Mając ten wzór " na piechotę " liczysz sobie n liczb, które wstawiasz do tablicy. Powstały w ten sposób ciąg liczbowy ma różną krzywiznę, która zależy od wykładnika potęgowego k. Dla k=1 jest to odpowiednik pot. liniowego, dla k>1 - logarytmicznego, k<1 - wykładniczego. Ale jest to raz nakreślona krzywa i nie bardzo widzę robotę dla potencjometru aby dynamicznie przeliczał tą krzywą.
    Spróbuj napisać taką funkcję dla AVR-ka. Ja jestem za cienki żeby się tego podjąć.

    Pozdr.

    0
  • #11 15 Sty 2014 10:00
    pele2
    Poziom 9  

    Teraz to ja nie zrozumiałem jak mam użyć tej wyliczonej tablicy.
    Chciałem ustawić sobie potencjometr i zmieniać poziom nachylenia krzywej (od prostej do bardzo parabolicznej).

    Bo muszę na bieżąco obliczać długość opóźnienia między kolejnymi cyklami w zależności od wychylenia joysticka, więc jak mam użyć tablicy która jest stała?

    0
  • #12 15 Sty 2014 11:19
    94075
    Użytkownik usunął konto  
  • #13 16 Sty 2014 00:59
    kicajbas
    Poziom 25  

    Witam

    pele2 napisał:
    1. I chcę zrobić sterowanie logarytmiczne (czyli przesuwając potencjometr w początkowych rezystancjach mam bardzo mały przyrost prędkości silnika, a później dopiero gwałtownie silnik przyśpiesza).


    pele2 napisał:
    2. Chciałem ustawić sobie potencjometr i zmieniać poziom nachylenia krzywej (od prostej do bardzo parabolicznej).


    Teraz to ja się pogubiłem :D .
    Co do Twojego pierwszego warunku ( jeśli pozostawać przy tablicach ):
    1.Tworzysz tablicę np.: 64 elementową (im więcej tym lepiej, lecz najlepiej żeby to był podzielnik liczby 1024)
    2.Potencjometr podłączony Vcc/GND; ślizgacz na PIN AVRa
    3.Programowo mierzysz napięcie na ślizgaczu ( Vref = Vcc )
    4.Wynik ADC dzielisz przez 16 ( dla 64 el.) i to będą adresy elementów tablicy
    5.Liczba będąca pod danym adresem będzie OCRx-em dla PWMa

    Teraz w zależności od wspomnianego k kolejne liczby będą "oddalone" od siebie w inny sposób.

    0
  • #14 20 Sty 2014 14:56
    pimpuk
    Poziom 21  

    Przepraszam, że się wtrącam, ale:

    pele2 napisał:
    czyli przesuwając potencjometr w początkowych rezystancjach mam bardzo mały przyrost prędkości silnika, a później dopiero gwałtownie silnik przyśpiesza)

    Czy nie będzie to zatem sterowanie wykładnicze?
    Kicajbas to zrozumiał i nawet zakreślił prawidłowy wzór.
    kicajbas napisał:
    ((m/n)^k)*255

    Potencjometry logarytmiczne mają logarytmiczną charakterystykę rezystancji w funkcji położenia ślizgacza. Charakterystyki elektryczne, dla takich potencjometrów, są zaś funkcjami wykładniczymi.
    Swoją drogą, Atmega8 ma ADC 10bit, więc bezproblemowo można zwiększyć sobie tą rozdzielczość, będzie bardziej precyzyjnie.

    0
  • #15 23 Sty 2014 21:12
    pele2
    Poziom 9  

    kicajbas napisał:


    1.Tworzysz tablicę np.: 64 elementową (im więcej tym lepiej, lecz najlepiej żeby to był podzielnik liczby 1024)
    2.Potencjometr podłączony Vcc/GND; ślizgacz na PIN AVRa
    3.Programowo mierzysz napięcie na ślizgaczu ( Vref = Vcc )
    4.Wynik ADC dzielisz przez 16 ( dla 64 el.) i to będą adresy elementów tablicy
    5.Liczba będąca pod danym adresem będzie OCRx-em dla PWMa

    Teraz w zależności od wspomnianego k kolejne liczby będą "oddalone" od siebie w inny sposób.


    To ja wszystko rozumiem, ale nadal nie wiem jak wykładnik k zastąpić potencjometrem. Przecież nie mogę zrobić tablicy z wyliczonymi punktami dla jednej krzywej bo chcę mieć chcę mieć regulację nachylenia krzywej (od linii prostej do bardzo zakrzywionej). Dlatego punkty te trzeba obliczać dynamicznie, prawda? Bo przecież to samo wychylenie joysticka dla różnych krzywych ma dać różne wyniki.
    A jeśli nadal się mylę to niech ktoś pokaże fragment kodu jak miałbym to zrobić bez potencjometru.
    Jeśli można to fragment kodu z użyciem potencjometru też byłby mile widziany.

    0
  • #16 23 Sty 2014 22:56
    eleproject

    Poziom 17  

    Może to ja czegoś nie rozumiem, ale z tego co rozumiem, to kicajbas dał Ci gotową receptę jak to zrobić, bez żadnych wykładników itd. itp.
    Robisz tablicę, w której masz już wszystko policzone - możesz wykorzystać 512 bajtów pamięci FLASH i to Ci da 256 wartości 16-bitowych.
    Teraz odczytujesz z ADC wartość 8-bitową, która bezpośrednio będzie adresem wartości z tej tablicy w FLASH. Bierzesz tą wartość z tablicy (na którą wskazuje 8-bitowy wynik konwersji ADC) i używasz jej jako wartości dla PWM.
    To wszystko. Żadnego liczenia. Ja to tak rozumiem.

    A jak chcesz sobie zmienić czułość tej regulacji (a raczej nastawy) to mnożysz sobie lub dzielisz to co odczytałeś z tablicy przez jakiś współczynnik i to wszystko. W ten sposób osiągniesz, jak to napisałeś, "regulację nachylenia krzywej".

    Jedyne co musisz policzyć, to raz jedyny wartości komórek tej tablic. Możesz to nawet zrobić w Excelu i wrzucić do kodu programu.

    0
  • #17 23 Sty 2014 23:38
    kicajbas
    Poziom 25  

    Witam

    eleproject napisał:
    Możesz to nawet zrobić w Excelu

    ...dokładnie. Osobiście nie widzę innego sposobu na liczenie całej tablicy.
    Ja napisałem sobie takie wyliczenia
    Atmega8 - wzór na sterowanie logarytmczne
    i w komórkę B1 wpisuję to "moje" k a do komórki B2 wpisuję ilość elementów tablicy.
    Zmiana wartości k , ENTER i mamy następną krzywą.

    0
  • #18 24 Sty 2014 23:05
    pele2
    Poziom 9  

    eleproject napisał:

    A jak chcesz sobie zmienić czułość tej regulacji (a raczej nastawy) to mnożysz sobie lub dzielisz to co odczytałeś z tablicy przez jakiś współczynnik i to wszystko. W ten sposób osiągniesz, jak to napisałeś, "regulację nachylenia krzywej".



    I właśnie o to mi chodzi. Jakiś współczynnik. Ale jak mam go ustawić. Przecież cały czas mówię że to własnie ten współczynnik chcę zmieniać potencjometrem.

    A ta tablica wartości w Excelu została policzona tylko dla jednego współczynnika k = 2.1 Zgadza się?
    Czy nadal źle to rozumiem?

    Bo jak zrobię stałą listę parametrów to program zadziała tak:
    1.wychylam joystick na jakąś wartość, np x=50
    Odczytuję wartość z tablicy na pozycji 50 i przemnażam moją prędkość silnika o tą wartość z tablicy.
    2 wychylam joystick na jakąś wartość, np x=80
    Odczytuję wartość z tablicy na pozycji 80 i przemnażam moją prędkość silnika o tą wartość z tablicy.

    Za każdym razem przemnażam przez stałą wartość.
    W ten sposób liniowo reguluję prędkości obrotów silnika a nie parabolicznie.

    0
  • #19 25 Sty 2014 08:43
    eleproject

    Poziom 17  

    Tak - ustawiasz sobie współczynnik k na stałe jakiś.
    Jakiego współczynnika k użyć żeby ją wykreślić w Excelu nikt Ci nie powie bo tego nie wie - sam go musisz dobrać odpowiednio dla Twojego zastosowania.
    Ten drugi współczynnik, do regulacji czułości również musisz sam dobrać (na początek przyjmij, że on nie istnieje - czyli, że jest równy 1).

    Jest to regulowanie nieliniowe - ale w tablicy masz już właśnie tą funkcję nieliniową, z to odpowiedzialną.

    0
  • #21 25 Sty 2014 10:06
    pele2
    Poziom 9  

    eleproject napisał:
    Tak - ustawiasz sobie współczynnik k na stałe jakiś.
    Jakiego współczynnika k użyć żeby ją wykreślić w Excelu nikt Ci nie powie bo tego nie wie - sam go musisz dobrać odpowiednio dla Twojego zastosowania.
    Ten drugi współczynnik, do regulacji czułości również musisz sam dobrać (na początek przyjmij, że on nie istnieje - czyli, że jest równy 1).


    Ale cały czas mówię że nie chcę mieć jednego k, chce miec regulacje dla różnych parametrów czyli dla różnych krzywizn

    0
  • #22 25 Sty 2014 17:03
    dondu
    Moderator Mikrokontrolery Projektowanie

    Nie odpowiedziałeś na moje pytanie więc dodam kolejne a propos tego:

    pele2 napisał:
    Ale cały czas mówię że nie chcę mieć jednego k, chce miec regulacje dla różnych parametrów czyli dla różnych krzywizn

    Dlaczego nie PID, itp.?

    0
  • #23 25 Sty 2014 18:04
    pele2
    Poziom 9  

    dondu napisał:
    A co z obciążeniem?
    Zapewne nie robisz tego dla kręcenia tylko silnikiem.



    Silniki będą zasilane poprzez podwójny mostek H czyli L293D.
    Ale nie rozumiem co to ma wspólnego z moim pytaniem o wzór na sterowanie nieliniowe.

    I niech mi ktoś wreszcie wytłumaczy, dlaczego gdy pytam o regulację nachylenia krzywej to każdy mi proponuje stałą tablicę wyliczonych współczynników. Czy to ja źle rozumiem że każdy współczynnik k to jedna krzywa?

    0
  • #24 25 Sty 2014 18:21
    dondu
    Moderator Mikrokontrolery Projektowanie

    pele2 napisał:
    Ale nie rozumiem co to ma wspólnego z moim pytaniem o wzór na sterowanie nieliniowe.

    Gdybyś odpowiadał na pytania:

    dondu napisał:
    A co z obciążeniem?
    Zapewne nie robisz tego dla kręcenia tylko silnikiem.

    to łatwiej było by Ci pomóc.

    pele2 napisał:
    I niech mi ktoś wreszcie wytłumaczy, dlaczego gdy pytam o regulację nachylenia krzywej to każdy mi proponuje stałą tablicę wyliczonych współczynników.

    Ja proponuję zupełnie inne rozwiązanie:

    dondu napisał:
    Dlaczego nie PID, itp.?

    ale nie mogę się doczekać Twoich odpowiedzi.

    0
  • #25 26 Sty 2014 10:50
    pele2
    Poziom 9  

    dondu napisał:
    Dlaczego nie PID, itp.?


    Rozumiem że PID to jakiś gotowy układ, tak?
    Jak już proponujesz PID to daj jakiś konkretny bo nie wiem co w nim "siedzi" i czy będzie spełniał moje wymagania.
    Ja chciałem zrobić sam żeby mieć nad tym pełną kontrolę

    0
  • #26 26 Sty 2014 17:38
    kicajbas
    Poziom 25  

    pele2 napisał:
    Jak już proponujesz PID to daj jakiś konkretny bo nie wiem co w nim "siedzi" i czy będzie spełniał moje wymagania.

    TAKIE COŚ

    0
  • #27 26 Sty 2014 19:23
    pele2
    Poziom 9  

    "TAKIE COS" to sama teoria.
    Ja chciałem jakiś konkretne przykłady, bo z tej teorii nic nie zrozumiałem.

    0
  • #29 28 Sty 2014 21:09
    pimpuk
    Poziom 21  

    Ale kolego pele2 namotałeś, że już sam nie wiem o co Ci chodzi. Podejrzewam, że ty też pewnie nie wiesz.
    Chcesz aby obroty silnika rosły wykładniczo, potrzebujesz do tego potencjometr o charakterystyce logarytmicznej.
    Nie masz takowego, więc będziesz go emulować softwareowo.
    Krzywa obrotów zależy od charakterystyki rezystancji potencjometru, obroty zaś od położenia suwaka na tej krzywej.
    Charakterystyka rezystancji jest wielkością stałą przypisaną do danego potencjometru, zależną od opisywanego wyżej współczynnika. Nachylenia tej krzywej nie możesz zmieniać tym potencjometrem. Potencjometrem ustalasz punkt odniesienia do obliczenia obrotów.
    Zmiana nachylenia w/w krzywej jest równoznaczna z wymianą potencjometru na taki o innej charakterystyce, czyli w Twoim przypadku na wyliczeniu nowej tablicy z innym współczynnikiem i odniesieniu się do niej podczas regulacji obrotów silnika.
    Oczywiście, możesz zrobić to w programie, wykorzystując do zmiany nachylenia krzywej drugi potencjometr i przeliczać tablicę w locie.
    Ale czy Twoja Atmega8 nie wyzionie przy tym ducha (znaczy się ostatniego bita)?

    0
  • #30 28 Sty 2014 21:55
    kicajbas
    Poziom 25  

    Witam

    pele2 napisał:
    To ja wszystko rozumiem, ale nadal nie wiem jak wykładnik k zastąpić potencjometrem


    pimpuk napisał:
    Ale kolego pele2 namotałeś, że już sam nie wiem o co Ci chodzi. Podejrzewam, że ty też pewnie nie wiesz.
    Chcesz aby obroty silnika rosły wykładniczo, potrzebujesz do tego potencjometr o charakterystyce logarytmicznej.
    Nie masz takowego, więc będziesz go emulować softwareowo.

    ...no właśnie, podpowiadałem kol.pele2 jak ma to zrobić.
    W #15 sam zacytował tok postepowania a później chciał coś innego.
    W.g mnie do sterowania silnika wystarczy tablica 64 el. i wykorzystując PWM systemowy, lub budując programowy oraz wykorzystując moje wskazówki jak podłączyć potencjometr oraz jak wyliczyć OCRx jest gotowe sterowanie silnikiem.

    Pozdr.

    0