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.

Jaki wybarć uC i jaki programator do niego

mezcook 19 Sty 2010 21:30 3136 24
  • #1 19 Sty 2010 21:30
    mezcook
    Poziom 12  

    Witam. Jestem zielony. Nie napisałem jeszcze żadnego programu, ani nie posiadam programatora.
    Znalazłem jak krok po kroku zbudować programator ISP AVR.
    Link

    Układ który mam zamiar w przyszłości zbudować ma wypełniać następujące zadanie.
    Na wejściach programatora będzie podany sygnał częstotliwościowy z dwóch źródeł (prędkość obrotowa - zrobiłem już tarczę, a fotokomórka wysyła piękny sygnał TTL :D maksymalna częstotliwość na wejściu góra 3kHz). Układ ma porównywać prędkości obrotowe. Na wyjściu dwa sygnały PWM o częstotliwości 50 Hz i długości impulsów między 0.5 , a 1.5ms. Długość impulsów ma być zależna od wyniku porównania prędkości obrotowej.
    Przykładowo:
    gdy n1=n2 to Pwm1=Pwm2=1ms
    gdy n1<n2 to Pwm1=1 ms, a Pwm2=0.7ms
    gdy n1>n2 to Pwm1=0.7 ms, a Pwm2=1ms
    Wartość 0.7 ms w tej chwili z głowy, ale ma być proporcionalna do różnicy prędkości.

    Czy uC ATTiny2312 czy tez 2313, ma wystarczająco dużo wy/we do realizacji tego zadania ?

    0 24
  • #2 20 Sty 2010 01:07
    atom1477
    Poziom 43  

    Tak. Ma wystarczająco dużo pinów, w końcu potrzeba Ci tylko 4.
    Ma też 2 wejścia INTx i 4 PWMy czyli nadaje się idealnie.
    Przy odrobienie szczęścia nawet na ATTiny13 by się to dało zrobić, ale to już wymagało by dłubaniny.

    0
  • #3 20 Sty 2010 15:52
    mezcook
    Poziom 12  

    Jaki wybarć uC i jaki programator do niego
    Czy jako wejścia mają posłużyć nóżki 6 i 7 ?

    Które nóżki jako wyjścia sygnału PWM?
    Czy jeśli jako generator PWM zostanie zastosowany timer0 - 8 bit.
    To czy dobrze rozumiem że jeśli jest 8 bit, to znaczy że jeśli sygnał będzie wysyłany co 20ms to będe mógł zmieniać wartość wypełnienia z rozdzielczością

    20ms/256=0,0781ms ?

    0
  • #4 20 Sty 2010 15:59
    atom1477
    Poziom 43  

    No tak. Ale można też zrobić generowanie sygnału programowo i z 10us rozdzielczości da się uzyskać.
    Wyjścia to OC0A, OC0B albo OC1A, OC1B.
    A jak będzie się to generowało programowo to wyjściami mogą być dowolne piny.

    0
  • #5 20 Sty 2010 16:08
    mezcook
    Poziom 12  

    Czy "programowo" oznacza że traktujemy dowolny pin jako przełącznik i ręcznie ustalamy z jaką częstotliwością i na jak długo ma się załączać ?

    Przykładowo.

    do

    waitms 19
    pind.0=1
    waitms 1
    pind.0=0

    loop

    Nic jeszcze nie programowałem więc to powyżej to traktować z przymróżeniem oka.

    czyli pind.0 załączy się co 19ms na czas 1ms ?

    0
  • #6 20 Sty 2010 17:39
    atom1477
    Poziom 43  

    No mniej więcej tak, tyle że obsługę włączania i wyłączania pinów trzeba by raczej walnąć do jakiegoś przerwania. Dzięki temu będzie większa dokładność.
    W jakim języku chcesz to napisać?

    0
  • #7 20 Sty 2010 17:55
    mezcook
    Poziom 12  

    Mam zamiar użyć BASCOMA i programatora z linka w pierwszym poście.
    Przerwania znaczy się interupts ?
    Jak działają przerywania ?

    0
  • #8 20 Sty 2010 18:22
    atom1477
    Poziom 43  

    No to jeżeli to ma być BASCOM to nawet nie potrzebujesz przerwań bo BASCOM ma wbudowaną obsługę Serw. Ma to zrobione na przerwaniach, ale tak jak mówię to już jest zrobione i Ty tylko walisz komendę że chcesz mieć serwa i na jakich pinach i BASCOM sam to załatwia. Impulsy będą co 20ms a ich czas można ustawić zna jedną z 256-ciu wartości i można tez wybrać ile ma mieś jeden krok.
    Na przykład dla kroku 10us maxymalny czas jaki sie da ustawić to 2,55ms.
    Interupts to oczywiście przerwania. Widzę że potrzeba CI jakiś solidny kurs ;)
    No w sumie przerwania to będą Ci potrzebne do zmierzenia częstotliwości jeszcze.
    Przerwanie to taki kawałek programu który sie wykona jak coś się stanie. Na przykład jak będzie impuls na pinie INT0.

    0
  • #9 27 Sty 2010 15:10
    mezcook
    Poziom 12  

    Zmontowałem Programator i Adapter wedle linka z pierwszego postu, lecz coś nie działa z procesorem ATTiny2313
    Link

    Adapter:
    VCC mam pod nózką Nr 20
    MOSI pod 17 PB5 (MOSI/DI/SDA/PCINT5)
    RST pod 1
    SCK pod 19 PB7 (UCSK/SCL/PCINT7
    MISO pod 18 PB6 (MISO/DO/PCINT6)
    GND pod 10

    W BASCOM-AVR mam:
    PROGRAMMER - STK200/300, LPT adress 378, delay 0

    Gdy klikam PROGRAM (F4) - to wyskakuje mi :
    Could not identify chip with ID: FFFFFF
    A LED w adapterze błyska 1 raz.

    0
  • #10 27 Sty 2010 15:31
    atom1477
    Poziom 43  

    Ale zasilanie do ATTiny podłączyłeś?

    0
  • #11 27 Sty 2010 17:31
    mezcook
    Poziom 12  

    Tak. Programator jest zasilany z baterii 9V puszczonej przez dwa stabilizatory jeden 9V i drugi 5V, lecz bez żadnych kondensatorów.

    0
  • #12 27 Sty 2010 17:51
    Balu
    Poziom 38  

    9v na baterii 9v nie dziala...
    ile ma na wyjsciu nie wiem, a potem dajesz jeszcze 5v ktory w tym momencie też już ma sznase nie działać...
    Po kiego dwa staby?

    0
  • #13 27 Sty 2010 17:53
    atom1477
    Poziom 43  

    No i dodaj kondensatory bo to podstawa.

    0
  • #14 27 Sty 2010 18:20
    mezcook
    Poziom 12  

    no na wyjściu jest 4.98 V. Dwa staby bo w przyszłości będzie zasilanie z 12V, a słyszałem że nie dobrze jest odrazu z 12V na 5V. Usunąłem stab 9 V ... napięcie to samo a programator dalej nie chodzi

    0
  • #15 27 Sty 2010 19:08
    atom1477
    Poziom 43  

    Przy małym poborze prądu i z 20V możesz śmiało zmniejszać jednym stabilizatorem do 5V.
    Dodaj te kondensatory.

    0
  • #16 27 Sty 2010 19:29
    mezcook
    Poziom 12  

    ok działa... Miałem źle złożony kabel łączący programator z adapterem... Zastosowałem te złącza żeńskie zaciskane bezpośrednio na taśmę i dwa piny nie przewodziły :D



    Ok. Poczytałem trochę. Napisałem i przetestowałem kilka prostych programów.
    Sprawdziłem instrukcję "config servos" i działa. Tzn po podłączeniu wyjścia z uC pod oscyloskop na PC wyszło że impulsy są co 28ms, ale to jest najprawdopodobniej wina tego że korzystam z wewnętrznego kwarca 8MHz. Gdzieś przeczytałem że obsługa serw powinna być na kwarcu 10MHz więc będe musiał sobie taki sprawić.
    Sprawdziło się także to żeby ta instrukcja działa ponad wszystkim, tzn że będzie generować PWM mimo wykonywania innych instrukcji.
    Napisałem i przetestowałem prosty program, gdzie na początku zdefiniowane jest konkretne położenie serwa, a dopiero później jest pentla która sprawia że dioda podpięta pod uC mryga. Okazało się że PWM (poza pętlą) generowany jest także podczas działania pętli od mrygania diody.
    Teraz martwi mnie inna kwestia - pomiar prędkości. Z tego co jest napisane w helpie o instrukcji "config servos" wynika że gdy jej użyjemy to nie można już korzystać z Timera 0.
    Jak pisałem wcześniej - program musi zbadać prędkość pierwszego, a następnie drugiego silnika, a do dyspozycji został tylko timer 1. Czy możliwe jest określenie prędkości obrotowej każdego silnika z osobna za pomocą tylko Timera 1 ?



    inventco.eu - posty scaliłem - proszę zapoznać się z regulaminem forum.

    0
  • #17 29 Sty 2010 13:15
    atom1477
    Poziom 43  

    W takim razie możesz obsługę serw napisać sam. A dokładniej to ja mogę ;p
    Wtedy przerwanie od Timera0 będzie służyło jednocześnie do sterowania serwami i do pomiaru czasu.
    Przy okazji uzyskamy okres powtarzania równy dokładnie 20ms.

    0
  • #18 29 Sty 2010 14:44
    mezcook
    Poziom 12  

    No właśnie zrobiłem coś takiego.

    DO
    Timer 0 i 1 zliczają impulsy przez 20ms
    następnie
    na nóżce B.0 jest generowany puls o szerokości zależnej od zliczenia timera 0
    na nóżce B.1 jest generowany puls o szerokości zależnej od zliczenia timera 1
    LOOP
    END

    Niestety mam tylko jeden generator zrobiony na ne555 i kabel do oscyloskopu tylko na jeden kanał i nie mogę wszystkiego sprawdzić jednocześnie, ale chyba działa.

    Wartość czasu zliczania impulsów będe musiał dobrać doświadczalnie, bo operacja porównania T0 i T1 też zajmie trochę czasu. Więc tak naprawdę dokładność z jaką będe mierzył prędkości obrotowe silników jest z góry ustalona bo cała pętla musi trwać te 20ms. Docelowo układ będzie działał w samochodzie więc będe się musiał jeszcze zatroszczyć dobre ekranowanie wszystkiego, żeby układ zapłonowy nie wpływał na działanie uC.
    Tak swoją drogą to nie zdradziłem jeszcze konkretnego zastosowania:
    Moją i trzech kumpli pracą magisterską jest zbudowanie samochodu napędzanego dwoma silnikami. Mamy dwa golfy 2 z silnikiem 1.8 RP 90KM. Jeden silnik będzie napędzał oś przednią czyli tu nic nie trzeba zmienić, natomiast drugi silnik będzie z tyłu, tam też będzie sie znajdowało takie same zawieszenie jak z przodu, tyle że wywalimy i zblokujemy mechanizm skrętu tylnych kół.
    Układ będzie miał za zadanie utrzymywanie stałych prędkości obrotowych obu silników.
    Przepustnice będą sterowane mechanicznie - linką, czyli tak jak to się normalnie odbywa lecz z taką różnicą że pomiędzy dźwignię przepustnicy, a samą przepustnicę dołoże serwo modelarskie które będzie działać jako trymer. Przykładowo jeśli np. przyśpieszamy i koła przednie zaczną buksować a tylne będą miały przyczepność to obroty przedniego silnika będą wyższe niż tylnego. Tą różnicę obrotów wykryje uC i zmniejszy wychylenie przepustnicy przedniego silnika na tyle mocno by prędkości te zrównały się.

    0
  • #19 29 Sty 2010 15:25
    atom1477
    Poziom 43  

    Do takiego sterowania to potrzeba raczej regulator PID a nie taki prosty program.
    Po za tym to bardzo odpowiedzialne zadanie dla uC. Ja bym się bał tak sterować silnikami.
    Ekranowanie nic Ci nie da. Albo niewiele da. Najwięcej do powiedzenia ma odpowiednie prowadzenie masy, dobre filtrowanie zasilania zabezpieczenia na pinie RESET.


    PS. Ja nie mam żadnego kabla a do oscyloskopu podłączam dwa przebiegi ;)

    0
  • #20 29 Sty 2010 15:36
    mezcook
    Poziom 12  

    Wiem że bardzo odpowiedzialne, ale muszę to zrobić niskim kosztem, bo cały projekt i tak nas mega wyniesie. Naszczęście to tylko steruje przyspieszeniem... to i tak będzie dzika maszyna i w dodatku eksperymentalna więc jak coś nie będzie działać to się z biegiem czasu usprawni. W końcu coś nie będzie działać to też będzie wnioskiem do pracy magisterskiej :p Zaraz się wybieram do sklepu po wyświetlacz lcd. czy takie coś będzie się nadawać do uC Link ?

    0
  • #21 29 Sty 2010 15:43
    atom1477
    Poziom 43  

    To wiesz co? Może przejdź na ATMega8. Cena praktycznie taka sama, a będziesz miał więcej Timerów i nie trzeba będzie dłubać żeby uruchomić pomiar okresu przebiegu.
    Do tego może tutaj by potrzebne mnożenie i duża ilość pamięci jak zastosowanie regulatora PID okaże sie konieczne. W ATTiny2313 tego raczej za łatwo nie zmieścisz.
    A w ATMega8 już tak.

    0
  • #22 29 Sty 2010 15:48
    mezcook
    Poziom 12  

    W sumie to narazie eksperymentuje żeby się zapoznać z tematem. Jak będzie trzeba to wezmę inny uC, jeśli tylko programuje się tak samo. ponawiam pytanie czy ten lcd będzie działał :D


    Udało mi sie napisać i przetestować układ z procesorem attiny2313. Jak już mówiono wcześniej, ograniczeniem są 2 timery. Kupiłem atmega8, ale w datasheecie nie mogę znaleźć opisanego wejścia timera 2. Timer 0 musi być wykorzystany do obsługi serw, timer 1 zliczał by impulsy z jednego czujnika, a timer 2 miał by zczytywac impulsy z drugiego, lecz nie mogę się doczytać na którą nóżkę trzeba podać sygnał żeby timer 2 zliczał.


    inventco.eu- posty scaliłem. Proszę zapoznać się z regulaminem forum. Proszę uzywać przycisku "zmień". Następnym razem będzie ostrzeżenie.

    0
  • #23 03 Lut 2010 12:22
    atom1477
    Poziom 43  

    Tylko że impulsy masz podawać na wejścia INTx a nie na wejścia Timerów.
    Po za tym to Timer2 nie ma wejścia w ATMega8.

    0
  • #24 03 Lut 2010 14:15
    mezcook
    Poziom 12  

    Czyli wychodzi na to że nie mogę zliczać impulsów, za pomocą T1 i T2. Jeśli dobrze rozumiem to To pozostaje mi w jakiś magiczny sposób zliczać impulsy z jednego silnik za pomocą T1, a za pomocą T2 mieczyć czas np 25 impulsów. Ale w związku z tym muszę w ten sam sposób zliczyć impulsy z drugiego silnika mając tylko jedno wejście T1. Czy istnieje możliwość zastosowania czegoś co działało by jako przekaźnik i podłączało T1 raz do jednego czujnika, raz do drugiego, a sygnałem przełączającym był by stan na którejś z nóżek uC?
    Z tego co widzę to dopiero atmega128 ma wejścia wszytkich timerów, które obsługuje.

    0
  • #25 03 Lut 2010 15:11
    atom1477
    Poziom 43  

    No ale nie musisz zliczać impulsów. Mierz czas pomiędzy impulsami (czyli mierz okres).
    Potem zrób funkcję 1/x i z tego wyjdzie Ci częstotliwość.
    Dla małych częstotliwości (a tutaj są takie) tak właśnie się robi. "Tak" czyli mierzy się okres a nie częstotliwość.

    0