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

Wyświetlacz widmowy - stablizacja obrazu

daras87 19 Paź 2011 20:08 2456 17
REKLAMA
  • #1 10044509
    daras87
    Poziom 9  
    Witam,

    Jestem na etapie tworzenia wyświetlacza widmowego jednak mam problem z uzyskaniem stabilnego obrazu. Próbuje aktualnie wyświetlić tarczę zegara z kreskami co 15 minut. Jednak w aktualnej wersji przy niskich obrotach uzyskuje zwielokrotnienie obrazu (około 10 kresek co 15 minut zamiast 4). Natomiast przy maksymalnych obrotach wyświetlają się tylko 2 kreski (czyli tylko połowa przewidzianego obrazu). Regulując prędkość obrotu jestem w stanie uzyskać prawidłowy obraz - czyli pełną tarczę z 4 kreskami jednak chciałbym mieć program działający niezależnie od prędkości obrotowej (tak jak to jest opisane w tym temacie: https://www.elektroda.pl/rtvforum/topic944484.html). Poniżej kod do wglądu:

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


    Proszę o rady co robię źle i co powinienem poprawić aby uzyskać zadowalający efekt.
  • REKLAMA
  • #2 10046982
    Slkkk
    Poziom 14  
    Zapewne "przekręca się" licznik 1. Może kolega podać jaka jest częstotliwość zegara procesora oraz ile obrotów na sekundę rozumie jako "niskie obroty", a jakie są maksymalne? Proponowałbym dodać obsługę przerwania przepełnienia licznika 1 -- jeśli takie nastąpi to zegar jest wyłączany do momentu, aż pomiar czasu pomiędzy dwoma INT0 uda się bez przepełnienia.
  • #3 10048306
    daras87
    Poziom 9  
    Układ taktowany zegarem 14,745MHz. Liczniki działają na preskalerze 8. Licznik 16-bitowy zlicza pomiędzy 20000 a 60000 w zależności od prędkości obrotowej. Funkcja odpowiedzialna za przepełnienie była zrobiona jednak nie dochodziło do przepełnienia.
  • #4 10048412
    Slkkk
    Poziom 14  
    To oznacza, że licznik 0 przepełnia się nawet co około 630 cykli zegara. Obsługa przerwania jego przepełnienia (w szczególności z powodu operacji modulo) trwa zapewne kilkadziesiąt cykli. Licznik zacznie odliczać kolejny krok dopiero po policzeniu wszystkiego i ustawieniu TCNT0. Może to powoduje błąd i można go naprawić poprzez przeniesienie przypisania na TCNT0 na początek?
  • #5 10048669
    daras87
    Poziom 9  
    Myślę, że nie jest to chyba efekt zbyt długiego wykonywania się obsługi przerwania gdyż zadeklarowałem sobie tablicę w którą wpisałem poszczególne wartości dla portu które mają się wykonywać w danym kroku. A więc teraz w przerwaniu wyświetlam tylko odpowiedni element z tablicy bez dzielenia modulo.
  • REKLAMA
  • #6 10048703
    piotrva
    VIP Zasłużony dla elektroda
    Taki układ uniezaleznia się od prędkości w prosty sposób - wystarczy jak rzucę hasło magnes + czujnik halla lub kontaktron? I masz zarówno wyzwalanie (punkt zerowy) jak i pomiar prędkości na podstawie którego możesz kalibrować zależności czasowe.
  • REKLAMA
  • #7 10048729
    daras87
    Poziom 9  
    Punkt zerowy generowany jest gdy dioda IR umieszczona przy silniku oświeci fototrazystor umieszony na smigle.
  • #8 10048734
    Slkkk
    Poziom 14  
    Zamieszczony kod sugeruje zastosowanie dokładnie tego, co kolega piotrva napisał :)
  • #9 10048744
    daras87
    Poziom 9  
    A co układ na diodzie IR i fototranzystorze nie bedzie działał??
  • Pomocny post
    #10 10048826
    Slkkk
    Poziom 14  
    Będzie działał, mój post zacząłem pisać 2 minuty przed wysłaniem go, więc trochę się pomieszała kolejność :). Ale może przy dużych obrotach fototranzystor jednak nie zdąży załapać i stąd błąd? Powinien zareagować przy czasach oświetlania diodą rzędu 20 mikrosekund, co raczej jest wystarczające, jednak może warto sprawdzić?

    Dodano po 1 [godziny] 53 [minuty]:

    A co to?:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Błąd jest spowodowany prawdopodobnie tym, że przerwanie (w aktualnej wersji wyzwalane stanem niskim) wywoływane było kilka razy z rzędu w czasie jednego kontaktu diody z fototranzystorem, w wyniku czego TNCT0 = 256 - 0 = 0 :). Należy zmienić przerwanie INT0 na wyzwalane zmianą stanu z wysokiego na niski (albo z niskiego na wysoki, jeśli tak jest podłączone), czyli:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Dodatkowo w funkcji obsługi przerwania INT0 warto upewniać się, że minęło sporo czasu od ostatniego wywołania tego przerwania, czyli na przykład TCNT1 > 5000. Krótsze odstępy można zignorować, są zapewne spowodowane powtórnym wywołaniem przerwania przy jednym przejściu przez punkt zerowy.
  • REKLAMA
  • #11 10049233
    daras87
    Poziom 9  
    Miałeś rację - zmiana sposobu wyzwalania przerwania rozwiązała problem. Obraz już jest pełny nic nie ucina itp. Jedynie co to lekko "drga" cała tarcza. Czy jakiś pomysł aby ustabilizować te drgania?
  • #12 10050078
    Slkkk
    Poziom 14  
    Może warto jakoś uśredniać odczyty z TCNT1 w przerwaniu INT0? Na przykład brać średni czas z ostatnich 16 obrotów.
  • #13 10050289
    daras87
    Poziom 9  
    Skoro początek obrotu jest w tym samym miejscu nie powinno być efektu przesuwania punktu startowego a jednak jest. Wydaje mi się że uśrednienie obrotu chyba nic nie zmieni.
  • #14 10050300
    Slkkk
    Poziom 14  
    Może niech kolega spróbuje tak zmienić obsługę przerwania:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Wygląda trochę nie po kolei, ale wyrównuje trochę punkt startowy. Czy taka zmiana coś poprawia?

    Dodano po 16 [minuty]:

    Warto też upewnić się, że przerwanie od timera 0 jest maksymalnie zoptymalizowane. Jeśli wykonują się w nim obliczenia pochłaniające kilkaset cykli zegara, to mogą one opóźnić zresetowanie punktu startowego o ten czas, a przy maksymalnych obrotach podczas 400 cykli zegara wskazówka obróci się o jeden stopień.
  • #15 10051585
    daras87
    Poziom 9  
    Zmiana obsługi przerwania nic nie zmieniła. Obsługa przerwania timera0 wygląda tak a więc chyba nie stanowi problemu:

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


    Tak w ramach wyjaśnienia tablica 'tarcza' zawiera 240 wartości (punktów tarczy) które są wyświetlane w odpowiednim kroku.
  • #16 10088120
    daras87
    Poziom 9  
    Problem stabilnego obrazu juz się rozwiązał. Teraz natomiast mam inne pytanie bo wyświetlam sobie obrazki na moim wyświetlaczu jednak obraz na zewnątrz jest trochę rozciągnięty w stosunku do tego wewnątrz tarczy. Czy da się coś z tym zrobić aby obraz nie był rozciągniety na krańcu tarczy?
  • #17 10089068
    piotrva
    VIP Zasłużony dla elektroda
    No wystarczy odpowiednio matematycznie wyliczyć różnice prędkości liniowych danych diod o odległości R od środka obrotu i w zależności do tej prędkości (a nie prędkości kątowej) starać się wyprostować obraz. Choć w 100% możliwe to nie będzie - wyświetlacz nie jest przecież wyobrażoną tablicą prostokątną, ale okręgiem.
  • #18 10090684
    daras87
    Poziom 9  
    A jakies szczegoly??
REKLAMA