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.

8535 przetwornik ADC + I2C + RS232

robert_l 22 Maj 2004 22:03 2735 11
  • #1 22 Maj 2004 22:03
    robert_l
    Poziom 10  

    Czesc. Realizuje teraz mały projekcik przetwornika analogowo-cyfrowego (programuje w bascomie), wymagania systemu to duza szybkosc, a ja nie potrafie jej uzyskac. Probowalem
    - zapamietywac wyniki w pamieci I2C 24c512, ale zapis wszystkich jej komorek zajął mi 5min 8O czyli wychodzi gdzies 300 400 pomiarow na sekunde, przy zapisie nie stosuje zadnych opoznien, a i2cdelay mam =1
    - probowalem przesylac wartosci bezposrednio na RS232 za pomoca portu UART i kostki MAX232 predkosc przesylania (liczba 8bitowa=1200 pomiarow, a liczba 16 bitowa =800 pomiarow na sekunde), maksymalna predkosc z jaką procek chcial przesylac dane do kompa to 57600bodów.
    Moze o czyms zapomnialem, ale nie wydaje mi sie, ze tylko taką predkosc mozna uzyskac na tym sprzecie, pomiar przetwornikiem trwa do 260us, a zapis o niebo dluzej.
    Pytanie do szanownego forum: czy da sie poprawic parametry mojego projektu??

    0 11
  • #2 22 Maj 2004 22:15
    Krzychu ADC
    Poziom 14  

    Nie znam się na programowaniu mikroproc. ale mam pewne doświadczenie z samodzielnymi przetwornikami współpracującymi z komputerem PC. Jeżeli zależy Ci na poprawieniu tej nienajlepszej nie da sie ukryć prędkości zastosuj przetwornik z transmisją równoległą a nie szeregową (będziesz mógł zastosować proste buforowanie, temat był poruszany na Elektrodzie). Najszybszy znany mi przetw. A/C to TDA8703 ale ma on nietypowy zakres wejściowy (ok 1.33-3.2 V)

    0
  • #3 22 Maj 2004 22:21
    elektryk
    Poziom 42  

    robert_l napisał:
    - probowalem przesylac wartosci bezposrednio na RS232 za pomoca portu UART i kostki MAX232 predkosc przesylania (liczba 8bitowa=1200 pomiarow, a liczba 16 bitowa =800 pomiarow na sekunde), maksymalna predkosc z jaką procek chcial przesylac dane do kompa to 57600bodów.
    No mnie wyszło na kalkulatorze przy 57600 jakeś 7200B/s więc chyba kolega stosuje jakąś rozbudowaną ramke albo jakiś błąd w algorytmie. Przydałoby się też żeby kolega wyjaśnił co to za projekt i co ma robić.

    0
  • #4 23 Maj 2004 00:04
    robert_l
    Poziom 10  

    nie da sie ukryc ze predkosc jaka uzyskuje jest dziwnie wolna ale 65000 pomiarow zostaje przesłane przez RS232 w przeciagu 70sekund.
    Projekt z zalozenia byl banalny odczytac informacje z wbudowanego przetwornika i przeslac je do pamieci, a nastepnie po zakonczeniu odczytu przeslac (jak myslalem wczesniej wolniejszym łaczem szeregowym) do kompa, niestety pamiec na I2C okazala sie zbyt wolna wiec probowalem naprawic jakos ta sytuacje i przesylac odczytane dane bezposrednio do komputera przez RS232.
    Temat projektu to analizator sygnalów wyjsciowych w regulatorach automatyki przemyslowej ,czyli odczytaj jak najszybciej informacje analogowe przekonwertuj na cyfrowe i przeslij do kompa do dalszej obrobki- rysowanie wykresu.
    przesylanie bajtow informacji przez RS zostalo zrealizowane za pomoca wbudowanej funkcji Print (w Bascomie oczywiscie).

    0
  • #5 23 Maj 2004 00:44
    elektryk
    Poziom 42  

    robert_l napisał:
    przesylanie bajtow informacji przez RS zostalo zrealizowane za pomoca wbudowanej funkcji Print (w Bascomie oczywiscie).
    Może to wina bascoma, ałe jakoś mi się nie wydaje żeby był aż tak nie optymalny, spróbuj wysyłać same puste ramkie i nie robić nic innego w programie, być może jednak to jest przyczyną.

    0
  • #6 23 Maj 2004 09:14
    euromatic
    Poziom 21  

    Osobiście zrobiłbym 3 kroki
    1. wymieniłbym kwarc jaki kolega pewnie stosuje ( przypuszczalnie 4 Mhz) na 11059200.
    co pozwoli na bezproblemowe używanie prędkości 115200

    2. użyłbym wstawki assemblerowej do odczytywania napięcia z przetwornika

    3. zastosowałbym równoległą pamięć lub równoległy przesył danych.

    przeliczyłbym czy bardziej opłaca się pchanie danych do pamięci czy bezposrednie wysyłanie ich do kompa

    co do baskoma to wysyła on po każdym znaku dwa znaki końca transmisji !!!!! [10][13] jeżeli zatem sam dodasz jeszcze chr(13) to będą 3 znaki końca transmisji

    należy wysyłać dane w hexie i kończyć ";"
    po ostatnim bajcie należy dać "chr(13)"

    Print dane; <<<< to ";" sprawi , że baskom nie wyśle znaku [10],[13] po każdej transmisji.Pozwoli to na zwiększenie ilości przesyłanych danych.

    Swojego czasu bawiłem się z "cyfrowaniem " dzwięku przez AVR oraz baskoma i muszę powiedzieć , że jakość nie była kiepska , więc wyszło więcej jak 8k/s a może powinieneś to realizować na 1 bicie?
    tak jak to robi się np. w odtwarzaczach CD...
    ( nie liczyłem tego , oceniłem to na słuch)

    Pozdrawiam i życzę udanych pomiarów

    0
  • #7 23 Maj 2004 11:09
    robert_l
    Poziom 10  

    Faktycznie, przesylanie danych przez RS w moim projekcie odbywalo sie linijka za linijka czyli za kazda daną przesylane byly dwa znaki [10] i [13], poprawie to, a jezeli chodzi o transfer to nie moglem osiagnac predkosci 115k, teraz juz wiem dlaczego, stosowalem kwarc 8MHz, to rowniez poprawie.
    Wielkie dzieki za pomoc.

    0
  • #8 23 Maj 2004 12:45
    Rosa
    Poziom 12  

    Predkość 115200 uzskałem stosując kwarc 3.684 MHz, a mozna zastosować 1,8 MHz . Zgodnie z damymi zawartymi w instrukcji do procesora
    rejestr UBRR może przyjmować wartośco od 0-255
    Proponuję napisać kilka linii:
    $ crystal (czestotliwość)
    $ Baud 115200
    ? ubrr
    Dla kwarcu 3,6864 Ubrr=1
    " 7,2 ubrr=2 ,a poniweż ubrr może mięc wartość=0 to
    można sosować kwarc 1,8
    Proponuję zastosować wstępną selekcję danych tzn. nie przsyłać danych
    zbliżonych do siebie .
    wartość poprzednią odjąć od bieżącej i jeżeli różnica jest mniejsza od zadanej wartości danej nie wysyłać.
    Wszystko zależy od szybości zmian mierzonych przebiegów.
    Można do Atmela podłączyś USB i zapomnieć o kłopotach ,ale tego nie przerabiałem .

    0
  • #9 23 Maj 2004 19:47
    euromatic
    Poziom 21  

    Rosa napisał:
    Proponuję zastosować wstępną selekcję danych tzn. nie przsyłać danych
    zbliżonych do siebie .
    wartość poprzednią odjąć od bieżącej i jeżeli różnica jest mniejsza od zadanej wartości danej nie wysyłać.
    .


    wszystko fajnie ale jak potem zastąpić brakujące elementy?
    Skąd komputer będzie wiedział , że ma pociągnąć prostą..linię?
    o długości np. 34 próbek jeżeli nie dostanie danych że kolejne próbki są identyczne?
    nastąpi zatem sytuacja, że dane zostaną zastąpione informacją , że dane takie jak poprzednio, (może to i dobre rozwiązanie bo wystarczy do tego 1 bajt ( lub nawet 1 bit))
    tak czy inaczej zawsze trzeba wysłać do kompa dane... albo [wartość próbki] , albo [próbka taka sama]
    na jedno wychodzi a komplikuje program.
    Pozdrawiam

    0
  • #10 28 Maj 2004 10:23
    pph
    Poziom 12  

    Proponowałbym przejść na transmisję binarną ze względu na wymaganą przez Ciebie szybkość. Zastosuj Printbin w Bascomie i przez to pozbędziesz się transmisji znakowej na rzecz dużoszybszej binarnej. Proponuję kwarc 7.3728 MHz. Co do danych spróbój ustalić stałą ramkę danych np: nr_próbki, jej_wartość, kontrola_parzystości <-kontrola jako suma modulo z nr_próbki i wartości.
    Pozdrawiam.

    0
  • #11 25 Sie 2004 23:00
    sebastian11
    Poziom 16  

    Albo zastosuj konwerter równoległy na USB i wtedy szybokośc przesyłania do komputera nie będzie problemem ( tak samo szybko prwiem jak zapis do RAMu przy AVR)

    a i proponuje przejsc na ImageCraft lub gcc tam są gotowe procedury bez potrzeby domyslania się jak ona jest skonstruowana
    (widze coraz częsciej pytania czy dana proc w bascomie robi to czy tamto czy generuje bit parzystości czy nie automatycznie )

    0
  • #12 26 Sie 2004 08:42
    BoskiDialer
    Poziom 34  

    a ja bym najbardziej polecał asembler, kod można tak uprościć.. taki cykl:
    (1) inicjuj ADC aby zaczoł próbkować
    (2) pobierz dane z ADC
    (3) wpisz dane do rejestru przesówanego
    (4) pobierz dane z ADC
    (5) inicjuj ADC aby zaczoł próbkować
    (6) jeśli rejestr przesówany niepusty to czekaj
    (7) wpisz dane do rejestru przesówanego
    (8) skocz do (4)
    w ten sposób można wysyłać próbke w 1 bajcie, a próbkowanie i wysyłanie(przez sprzętowy uart) będą się wykonywać równolegle, w ten sposób powinna byc osiągnięta maksymalna prędkośc próbkowania.. na kwarcu 11,0592MHz przy prędkości 115200 bodów osiągnie sie 10472 próbki na sekunde (zakładając 2 bity stopu).

    0