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

[AVR] [ATMEGA8] [C] - ADC przy 1 MHz i jednoczesna transmisja USART

_Antos_ 28 Maj 2014 19:57 1233 5
REKLAMA
  • #1 13642724
    _Antos_
    Poziom 10  
    Witam


    Jest to pierwszy taki szerszy mój projekt w tej dziedzinie. Mam AT8, która generuje sygnał zegarowy 1 MHz. Ten sygnał taktuje pewien układ i ten układ zwraca sygnał analogowy o częstotliwości około 1MHz (w każdym razie musiałbym próbkować co 1 us).
    Jednocześnie musiałbym te wyniki gdzieś przesyłać dalej. Mianowicie USART, dane podglądam na bieżąco w terminalu.
    Procek jest taktowany rezonatorem kwarcowym 10MHz
    Obecnie mam uruchomiony ADC w trybie free run z preskalerem 4 i włączonym przerwaniem po wykonaniu pomiaru. Gdy wystąpi przerwanie to przepisuje ADCH i ADCL do dwóch zmiennych i uruchamiam przerwanie UDRE, w którym to konwertuje sobie te dane do typu char i potem wysyłam przez USART do terminala. Problem w tym, że w terminalu pojawiają się jakieś śmieci. To znaczy moim zdaniem wywoływanie przerwania w przerwaniu to chyba nie najlepszy pomysł, ponieważ pewnie USART nie nadąża z transmisją za pomiarami i dostaję pewnie co którąś próbkę lub nic nie dostaję (ciężko stwierdzić).

    Czy ktoś mógłby mi podsunąć jakiś pomysł jak rozwiązać ten problem w inny sposób lub wskazać błędy w moim toku postępowania.
  • REKLAMA
  • #2 13642780
    BlueDraco
    Specjalista - Mikrokontrolery
    Z jaką częstotliwością chcesz mierzyć sygnał i co dalej z nim robić? Po prostu wysyłać przez UART? Z jaką szybkością? Dokąd?
  • REKLAMA
  • #3 13642816
    _Antos_
    Poziom 10  
    No tak jak napisałem sygnał jest 1MHz, w sumie wystarczy mi żeby ADC wykonywał pomiary powiedzmy przez kilka sekund po wyzwoleniu go przyciskiem, albo jakimś poleceniem (w planach napisanie aplikacji na PC-ta).
    Dane mają być przesyłane do komputera (w przyszłości odbierane przez aplikacje i obrabiane, ale na razie wystarczy podgląd przez terminal). Prędkość dowolna, na razie ustawione 9600, ale w sumie to jest nieistotne, ważne, żeby po wykonaniu pomiarów transmisja danych nie trwała zbyt długo.
  • REKLAMA
  • #4 13642853
    BlueDraco
    Specjalista - Mikrokontrolery
    No to zacznij od sprawdzenia w dokumentacji ATmega8, ile czasu zajmuje pojedyncza konwersja ADC. Potem policz, ile pamięci RAM potrzebujesz w mikrokontrolerze na składowanie próbek z kilku sekund, zanim prześlesz je do PC.
  • REKLAMA
  • #5 13643200
    _Antos_
    Poziom 10  
    Dobra, otworzyłeś mi oczy. Czytałem co prawda datasheet, ale myślałem, że... w sumie chyba nie myślałem akurat wtedy.

    Poprzednie założenia też były błędne. W sumie ostatecznie wygląda to tak. Procesor obsługuje całkiem sporą linijkę CCD. Wyplucie na zewnątrz informacji o wszystkich pikselach po kolei zajmuje 13 ms. Linijka jest RGB, więc wypluwa mi 3 takie sygnały, ale mogę je odczytywać jeden po drugim, nie muszą być w tym samym momencie.
    Problem w tym, że w tych 13ms jest ponad 5k pikseli do odczytu, czyli wychodzi jak wcześniej wspominałem, że muszę zebrać próbkę raz na 2us co najmniej. Dokumentacja atmegi twierdzi, że conversion time wynosi 13us, czyli mógłbym zebrać przy pojedynczym odczycie zaledwie 20% próbek. Chyba, że źle rozumiem pojęcie conversion time.
    Nawet jeżeli odczytywałbym te 20% próbek, to i tak potrzebuję 16 bitów na jeden pomiar. Zebranie pomiarów z jednego koloru wymaga więc 2 kilobajty pamięci żeby to przechować. Niestety do dyspozycji mam tylko 1 kilobajt, więc musiałbym olać tą młodszą połówkę tego pomiaru i wtedy bym się mieścił na styk z ilością próbek przechowywanych w pamięci.
    Z powyższych rozważań wynika, że AT8 jest za cienka na to. Co gorsza wychodzi, że druki uc jakim dysponuje (AT32) też jest za słaby. Czyli co? Musiałbym zastosować zewnętrzny ADC wraz z jakąś szybką pamięcią RAM, a potem kombinować jak to wyciągnąć poprzez SPI lub I2C.
    Proszę o jakieś podpowiedzi jak to rozgryźć, bo widzę, że nie jest to takie proste jak myślałem początkowo.
  • Pomocny post
    #6 13643222
    BlueDraco
    Specjalista - Mikrokontrolery
    Przymierz się np. do STM32F4xx
REKLAMA