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

[Rozwiązano] AVR attiny2313A - błędne odczyty impulsów z czujników indukcyjnych

irbis12 05 Lip 2018 14:02 1017 23
  • #1 17313482
    irbis12
    Poziom 6  
    Witam, nie wiem czy trafiłem w dobrą zakładkę, jeśli nie to przepraszam, przechodząc do rzeczy, mam problem z programem w attiny 2313A. Program ma działać na zasadzie zbierania impulsów z 4 czujników indukcyjnych na obracających się kołach pasowych (czyli wykrycie ramienia koła daje impuls do uC). Kiedy impulsy docierają do uC na wyświetlaczu wyświetlają się zera, kiedy impulsy ustaną lub koło pasowe zatrzyma się na ramieniu koła dając stały sygnał, na wyświetlaczu zera zmieniają się na jedynki i włącza się buzzer. Oczywiście wszystkie czujniki mają działać niezależnie czyli, zatrzymanie się jednego z kół, zmienia na wyświetlaczu jedno z zer na jedynkę i włącza się buzzer. Koła nie kręcą się jakoś zabójczo szybko i program reaguje na nie tak jakby stały, a nie wiem już co zmienić, żeby zwolnić jego reakcje. Kombinowałem z inkrementacją która na zdj wynosi 200 lecz wtedy przy reakcjach na wolniejsze obroty długo reagował na to iż sygnał jest ciągły czyli ramię koła stoi na polu widzenia czujnika. Ogółem program działa, lecz niestabilnie, prosiłbym o jakieś sugestie bądź małą przeróbkę, bo niestety z programowania jestem zielony.

    https://obrazki.elektroda.pl/6412541200_1530791835.jpg
    https://obrazki.elektroda.pl/9716255700_1530791835.jpg[/align]
  • #2 17313531
    pawlik118
    Poziom 32  
    każde waitms(300) to 300ms w których program nic nie robi (stoi).
  • #3 17313537
    Kuniarz
    Moderator Projektowanie
    Wklej poprawnie cały program, to będzie można się pochylić nad nim. Generalnie, tak jak pisze Kolega pawlik118, "wait" w pętli głównej to zły pomysł, trzeba to usunąć.
    Pomogłem? Kup mi kawę.
  • #4 17313538
    irbis12
    Poziom 6  
    Tak, to prawda, natomiast te 300ms jeśli dobrze rozumuję mają uchronić przed tym, by program nie włączał alarmu za każdym razem gdy dostanie sygnał z czujnika? Dobrze już wklejam

    Moderowany przez Kuniarz:

    Proszę wkleić jako kod ze znacznikami SYNTAX, wówczas po pierwsze łatwiej się to przegląda, a po drugie można sobie skopiować i przeanalizować na własnym kompilatorze.

    [/mod]
  • #5 17313605
    irbis12
    Poziom 6  
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod
  • #6 17313651
    pawlik118
    Poziom 32  
    Każda pętla DO - LOOP wykonuje się ponad 100ms (Waitms 100)
    czyli, aby We1 > 1000 musi minąć ponad 100 sekund.
    Jeśli w tym czasie We1 zostanie wyzerowane, to startujemy znów od początku.
  • #8 17313662
    irbis12
    Poziom 6  
    Tak tak, ruszyłem czas pętli, zmieniłem na 25ms i w sumie się polepszyło, jeszcze troche pokombinuję, dzięki !
    xury niestety nie wiem o czym mówisz, pownieważ nie znam się na programowaniu :(
  • Pomocny post
    #9 17313673
    Kuniarz
    Moderator Projektowanie
    Dobrze jest, dla czytelności programu, używać aliasów, wówczas w kodzie używasz "wejscie_1" zamiast PIND.0 . Niby taka pierdoła, ale znacznie ułatwia analizę.

    Ja bym to zrobił tak, że w pętli głównej zliczał "przestoje", czyli:

    - jeśli pojawi się impuls to zeruj licznik
    - jeśli nie, to dodaj 1 do licznika

    - jeśli licznik = 100 (na przykład), to włącz alarm, bo impulsy nie pojawiły się przez 100 cykli.
    Pomogłem? Kup mi kawę.
  • #10 17313893
    Konto nie istnieje
    Konto nie istnieje  
  • #11 17313926
    Kuniarz
    Moderator Projektowanie
    nowyARM napisał:
    Ma byc zero. Z takim podejściem jak kolega (wait) to nawet procesor 10e6GHz będzie "zabity" i coś mu może umknąć (znaki z USART, USB, itp).


    Nie musi być zero, ten program liczy w miarę wolne impulsy i nigdy nie będzie nic wysyłał po UART, a tym bardziej po USB.
    Proszę się powstrzymać od takich wywodów.
    Pomogłem? Kup mi kawę.
  • #12 17314093
    irbis12
    Poziom 6  
    Może troszkę sprecyzuje, sygnał nie będzie z żadnych portów typu USB, z czujników wchodzi bezpośrednio na nóżki uC. Ma on poprostu określić czy koło się kręci czy też nie. Układ ma działać na kombajnie zbożowym. Wait 25 ms ma na celu ustabilizowanie ale nie wiem czy dobrze rozumuje.
  • #13 17314142
    Konto nie istnieje
    Konto nie istnieje  
  • #14 17314165
    irbis12
    Poziom 6  
    100 ms kończy pętlę główną, wydaje mi się że ustawiłem sporo za dużo(o ile to opóźnienie jest wgl potrzebne) a koła kręcą się z Max prędkością obrotową 500 obr/min.
  • #15 17314234
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #16 17314255
    Kuniarz
    Moderator Projektowanie
    Proszę autora tematu o przejrzenie tego kodu, dodałem aliasy, zrobiłem zliczanie czasu bezczynności i obsługę alarmów.
    Nie wnikałem w sterowanie buzzerem i licznikiem dystansu, to już pozostawiam twórcy.

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod
    Pomogłem? Kup mi kawę.
  • #17 17315016
    irbis12
    Poziom 6  
    Witam
    Przepraszam was, że znów zatruwam życie, ale dzisiaj sprawdziłem jeszcze raz działanie przerobionego powyższego programu od Kuniarz i jest taki mały problem. Kiedy uC dostaje zmienny sygnał, wtedy jest dobrze, kiedy nie dostaje sygnału wgl, wtedy po ok 10 sek na ekranie ustawia się jedynka, czyli też jest dobrze, jednak kiedy dostaje ciągły sygnał (ramie ustawione w polu widzenia czujnika), to nic się nie dzieje, na ekranie 0 nie zmienia się na 1 czyli dla układu koło dalej się obraca. Bardzo bym prosił o pomoc jeszcze tylko w tym aspekcie.

    Pozdrawiam
  • #18 17316779
    Konto nie istnieje
    Poziom 1  
  • #19 17316837
    irbis12
    Poziom 6  
    Dziękuję za radę i zainteresowanie, natomiast muszę pozostać przy poprzedniej koncepcji z racji tego, że płytka ze ścieżkami została już wytrawiona i złożona a nie mam już gdzie stworzyć nowej. Kolejną rzeczą jest to, że został mi jeden wolny pin który zamierzam wykorzystać do pomiaru prędkości obrotowej wentylatora w maszynie (ale to wydaje się być łatwe więc nawet nie wspominam) więc z pinami jest deficyt. Jedyną bolączką w tym momencie jest to, że układ nie reaguje na zatrzymane ramię koła w polu widzenia czujnika. Siedzę nad przerobionym programem od Kuniarz cały dzień i nic nie mogę zdziałać ponieważ dopiero uczę się programować i jestem w tym słaby a tu max tydzień i maszyna wyjedzie pracować...
  • Pomocny post
    #20 17316856
    Kuniarz
    Moderator Projektowanie
    Musisz zmodyfikować program tak, żeby zliczał czas jednego i drugiego stanu. Tak mniej więcej:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Czyli - jeśli na czujniku będzie 0 to będzie się zwiększał licznik_2, a jeśli będzie tam 1, to będzie się zwiększał licznik_1. Jeśli nastąpi zmiana stanu to wyzeruje się przeciwny licznik.
    Jeśli bezczynność będzie w stanie 1 lub 0 to któryś licznik się nazbiera aż do limitu i wyskoczy alarm.
    Pomogłem? Kup mi kawę.
  • #21 17316868
    irbis12
    Poziom 6  
    Super! dzięki za radę, zabieram się do roboty.
  • #22 17316893
    Konto nie istnieje
    Konto nie istnieje  
  • #23 17316933
    irbis12
    Poziom 6  
    Koledze Kuniarzowi niezmiernie dziękuję za pomoc i wyrozumiałość, wszystko gra ;)

    Co do Pana nowyARM, od samego początku się człowieku czepiasz, fajnie że wszystko umiesz i wgl, ale ten mały projekcik jest mi potrzebny tylko i wyłącznie do własnych domowych potrzeb. Skoro coś Panu się nie podoba to nie musi Pan przeglądać tego postu i rzucać jakichś niepotrzebnych komentarzy. Dla Pana to biznes, dla mnie ułatwienie w ciężkiej pracy. Dziękuję.
  • #24 17316938
    irbis12
    Poziom 6  
    Koledze Kuniarzowi niezmiernie dziękuję za pomoc i wyrozumiałość, wszystko gra ;)

    Co do Pana nowyARM, od samego początku się człowieku czepiasz, fajnie że wszystko umiesz i wgl, ale ten mały projekcik jest mi potrzebny tylko i wyłącznie do własnych domowych potrzeb. Skoro coś Panu się nie podoba to nie musi Pan przeglądać tego postu i rzucać jakichś niepotrzebnych komentarzy. Dla Pana to biznes, dla mnie ułatwienie w ciężkiej pracy. Dziękuję.

    Dodano po 2 [minuty]:

    Problem rozwiązany dzięki pomocy Kuniarz.
REKLAMA