Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Problem z optoizolacją i DAC

danrok 18 Aug 2010 15:10 3551 31
IGE-XAO
  • #1
    danrok
    Level 13  
    Witam,

    walczę z problemem optoizolacji. Mianowicie, do płytki ewaluacyjnej
    z procesorem ARM dołączyłem sobie przetwornik DAC 7611. Napisałem
    protokół komunikacyjny i wszystko działa w porządku. Problem pojawia
    się, gdy pomiędzy procesor a DAC wepnę optotranzystory 6N136.
    Generalnie schemat dołączam w postaci obrazka. Problem przejawia
    się w takiej postaci, że jeśli do DAC wpiszę wartość np 2095, na wyjściu
    mam 0V, a jeśli wpiszę 4095 to na wyjściu mam 4.09V. Nie wiem w ogóle
    gdzie może leżeć problemem, dlatego chciałbym zapytać się Was ;)

    Dodam, że jeśli wykonuję program linijka po linijce w debuggerze, to sprawdzając
    stany logiczne na wejściu DAC wszystko jest w porządku. Wiem, że
    optotranzystor w tej konfiguracji odwraca mi stan logiczny, to zostało
    uwzglednione w programie.

    P.S. Tych buforów schmitta w układzie testowym nie ma.

    Z góry dzięki za wskazówki.
  • IGE-XAO
  • #2
    _Robak_
    Level 33  
    Quote:

    Wiem, że
    optotranzystor w tej konfiguracji odwraca mi stan logiczny, to zostało
    uwzglednione w programie.

    To chyba tu pies pogrzebany bo po optoizolatorze masz invertery które negują sygnałl więc w programie nic nie musisz uwzględniać. Poza tym zamieniłbym je na zwykłe inwertery a nie szmita.
  • #3
    danrok
    Level 13  
    Ale sprawdzałem miernikiem i jeśli na wejście tego optotranzystora podam 1, to
    na wyjściu mam 0 i odwrotnie. Poza tym według schematu w datasheecie, jest tam
    dioda nadawcza, odbiorcza i tranzystor. Gdzie miałby być inwerter?

    Tak jak napisałem, za optotranzystorem nie ma tego inwertera schmita
    zmontowanego w układzie jak na razie. Zastanawiam się właściwie czy jest mi
    on potrzebny. Układ tak czy inaczej bez niego powinien działać, po uwzględnieniu
    odwracania stanu logicznego na optotranzystorze.
  • #4
    _Robak_
    Level 33  
    Ok, p.sa nie przeczytałem;) W takim razie napisz coś więcej, jaką masz prędkość transmisji itp. To że ten transoptor jest do 1MB nie znaczy że byle jakie podłączenie zagwarantuje poprawną pracę! Jeśli masz oscyloskop to zobacz jak to wygląda na wejściu i wyjściu.
  • #5
    danrok
    Level 13  
    W Armie użyłem JTAGa, by ręcznie sprawdzić każdy wysyłany bit i wszystko by
    się zgadzało z tym, co powinien wysyłać - sprawdzam później bez transoptorów i
    dokładnie to samo przychodzi do DAC. Więc prędkość transmisji wykluczyłem
    jako problem.
    Może wyjścia procesora nie mają takiej wydajności prądowej, by zasilić kilka
    optotranzystorów na raz, może to być przyczyną?

    EDIT:
    Sprawdzałem w dokumentacji i maksymalny prąd wyjściowy z pojedyńczego
    pina to 25mA. W moim przypadku jest to (3.3-1.45)/220 = 8mA.
    Jest też parametr maksymalnego prądu wyjściowego z wszystkich pinów:

    (2) Total injected current (sum of all I/O and control pins)(4) ± 25

    Czyli pewnie następuje przeciażenie, bo CS musi być uruchomiony, CLK co pewien
    czas też no i CLR także, co już daje 24mA... pewnie jakiś jeden pin pominąłem
    i stąd ten cały problem.
  • #6
    marco47
    Level 41  
    Odwróć podłączenie diod w transoptorze na takie aby stanem aktywnym był poziom niski (L). Jeżeli nie da się tego zmienić w programie zastosuj wzmacniacze lub dwa inwertery.

    Aby transoptor nie obracał sygnału emiter podłącz do masy poprzez rezystor, a z niego pobieraj sygnał do DAC'a
  • #7
    danrok
    Level 13  
    Nie za bardzo rozumiem o czym mowa z tym odwróceniem podłączenia diod w
    transoptorze. Jak na razie katoda jest podłączona przez rezystor do masy,
    a anoda podłączona jest do mikroprocesora. Co mam inaczej więc podłączyć?

    Chyba, że mówisz, by do bazy tranzystora po stronie "wtórnej" podłączyć wyjście.
    Wtedy chyba byłoby to odwrócone, czy mylę się?
  • #8
    marco47
    Level 41  
    Nie zwróciłem uwagi że transoptor 6N136 ma fotodiodę, dlatego układ wyjściowy zastosuj taki jak masz na swoim schemacie.
  • IGE-XAO
  • #9
    danrok
    Level 13  
    Dioda od tranzystora ma wisieć w powietrzu? Nie ma być podłączona do masy
    przypadkiem?
  • #10
    marco47
    Level 41  
    To nie jest dioda tylko fotodioda dlatego musi być podłączona do plusa, aby mogła sterować wewnętrzny tranzystor.
  • #11
    danrok
    Level 13  
    Czyli nic innego nie da się wykombinować żeby to połączyć? Jedynie co mogę
    zrobić to dorzucić np. bufor?

    EDIT. OK, przerzuciłem rezystor 100 Ohmów do nóżki 2 i na stałe do +, 3 podłączę
    do procesora, a wyjście zostawie takie jak mam u siebie w schemacie i sprawdzę.
  • #12
    danrok
    Level 13  
    Witam ponownie,
    zmieniłem układ na taki jak w załączniku. Mimo wszystko układ nie działa. Faktycznie
    faza nie jest odwrócona, prąd także z procesora nie jest pobierany, bo wpływa.
    Z tego co zauważyłem, to jedynka stabilizuje się na poziomie 3.3V ( musiałem
    tak podłączyć, bo procesor na pinach daje 3.3V). Zero stabilizuje się natomiast
    na poziomie 0.06V, czyli trochę dużo. Wygląda jakby tranzystor nie otwierał
    się do końca?

    EDIT:
    Chyba jednak takie rozwiązanie także nie zadziała, bo:

    (2) Total injected current (sum of all I/O and control pins)(4) ± 25

    Czyli prąd wpływający do pinów także nie może przekraczać 25mA. Chyba
    jednak nie obejdę się bez tych buforów.
  • #13
    marco47
    Level 41  
    Walczysz z optoizolacją, a pytanie dotyczy czy musi tam być? Jaki jest powód że się na nią zdecydowałeś.
  • #14
    Tantalos
    Level 18  
    Twój problem leży chyba po stronie transmisji bitów niż optoizolacji. Może wysyłasz o 1 bit za mało lub za dużo albo w odwrotnej kolejności.
  • #15
    danrok
    Level 13  
    marco47 wrote:
    Walczysz z optoizolacją, a pytanie dotyczy czy musi tam być? Jaki jest powód że się na nią zdecydowałeś.


    Chodzi mi o bufory w sensie inverterów schmitta.

    @Tantalos: wydaje mi się, że bity wysyłam dobrze. Jak podepnę DAC bezpośrednio
    do procesora to wszystko działa w porządku.
  • #16
    marco47
    Level 41  
    Optoizolacje stosuje się gdy chcesz odizolować galwanicznie dwa układy, a w tym przypadku chcesz tylko wyczyścić przesyłany sygnał?
  • #17
    danrok
    Level 13  
    Nie. Chcę odizolować sygnały. Problem z tym, że płytka ma mieć wymiary do 5x5cm dlatego nie chciałbym stosować schmittów jeśli nie potrzebuję. A chciałem je zastosować, by wejście optotranzystorów było podłączone do tych schmittów, wtedy wyjścia procesora nie byłyby tak obciążone prądowo.
  • #18
    marco47
    Level 41  
    W przypadku optoizolacji najlepiej jakbyś jeden kanał sprawdził oscyloskopem , bo wtedy dokładnie przy pierwszym spojrzeniu będziesz wiedział co jest nie tak z tym sygnałem. Mierzenie miernikiem nic nie daje bo to trzeba obserwować przy nominalnej prędkości transmisji. Podłącz jakiś sygnał z generatora i dopasuj wartości rezystorów na wejściu i wyjściu, aby otrzymać sygnał prostokątny. Może trzeba będzie dołożyć rezystor podłączony do masy i bazy tranzystora aby zlikwidować nasycenie bazy.
  • #19
    danrok
    Level 13  
    a wykonywanie programu linia po linii za pomocą JTAga nie pozwala mi się rozeznać
    czy wszystko działa? Zaznaczam, że jeśli tak wykonuję program, dalej DAC
    wydaje się nie działać niestety. Generalnie dążę do tego, że nie mam dostępu
    do oscyloskopu niestety
  • #20
    marco47
    Level 41  
    A kartę dźwiękową masz w komputerze? Jeżeli tak to poszukaj programu oscyloskopu na kartę , to wtedy coś niecoś zobaczysz. Co prawda tylko do 20kHz, ale zawsze to coś.
  • #21
    danrok
    Level 13  
    O dzięki. Będę szukał. Zastanawiam się dlaczego przy zerze przesyłanym
    na wyjściu jest 0.08V, może dlatego jest problem, chociaż jedynka logiczna
    pewnie będzie od 0.8V lub więcej nawet (1.6). Tak jakby tranzystor się nie w pełni
    otwierał.
  • #22
    _Robak_
    Level 33  
    Tyle że karta dźwiękowa ma kondensator na wejściu więc sygnału prostokątnegot o nie zobaczysz. Napisz jaką masz mieć prędkość transmisji, może wystarczy jakiś gorszy transoptor który łatwiej będzie odpalić bez oscyloskopu. Pozatym tymi 0.06V bym się kompletnie nie przejmował;)
  • #23
    danrok
    Level 13  
    Jeśli nie używam transoptora to prędkością transmisji zbliżam się do maksymalnej
    możliwej. Najlepiej byłoby gdybym osiągnął ten 1MHz. Czyli połowę tego co może
    optotranzystor. Jeśli chciałbym użyć A/D z karty dzwiękowej, muszę chyba obniżyć napięcie wejściowe na przetwornik do 1V około?

    EDIT:
    Podliczyłem to wszystko i CLK taktuję tak, że opóźnienie pomiędzy CLK a CLK' to
    1us.

    Code:

      LD_Set;     // Transfer data to temp register in DAC
      CS_Clear;   // Select chip
      for(i = 12; i > 0; i--){
        if (data & 0x1000) {
          SDI_Set;    // When 1 is transfered SDI is high
        }
        else  {
          SDI_Clear;  // else is low
        }
        data <<= 1;
        DelayUs(1);
        CLK_Set;
        DelayUs(1);
        CLK_Clear;
        DelayUs(1);
      }


    Wychodzi mmi więc na to, że prędkość transmisji to 3*1us * 12(bitów), czyli
    około 200kHz. Powinno się to dać bez problemu osiągnąć na optotranzystorach.
  • Helpful post
    #24
    Tantalos
    Level 18  
    Spróbuj może tak:
    Code:
    LD_Set;     // Transfer data to temp register in DAC
    
      CS_Clear;   // Select chip
      for(i = 12; i > 0; i--){
        if (data & 0x800) {
          SDI_Set;    // When 1 is transfered SDI is high
        }
        else  {
          SDI_Clear;  // else is low
        }
        data <<= 1;
        DelayUs(1);
        CLK_Set;
        DelayUs(1);
        CLK_Clear;
        DelayUs(1);
      }
  • #25
    danrok
    Level 13  
    A dlaczego tak? skoro ja wysyłam 12 bitów, czyli 2^12, a chcesz robić iloczyn
    z 2^11? Wtedy nigdy nie wyślę > 2096 moim zdaniem.

    EDIT: Jeszcze raz chciałem zaznaczyć, że jeśli podepnę DAC bezpośrednio do
    procesora to cała transmisja działa dobrze. Problem pojawia się jedynie przy
    włączeniu w obwód optotranzystorów. Czy problem może być to, że wejścia
    procesora są przeciążone? (prąd wpływający do nich wynosi w ekstremalnej
    sytuacji 5*(3.3-1.45)/100 czyli 92mA, a maks to 25mA.
  • #26
    Tantalos
    Level 18  
    Jeśli wysyłasz 12 bitów (zakres 0 - 4095) to największa wartość to 0xFFF. Jeśli więc ustawiasz maskę 0x1000 to pierwszy wysłany bit jest zawsze 0.
    Co do prądu to możesz tak ustawić konfigurację transoptorów (część może być w trybie inwertera a część nie) aby zawsze tylko przez 2 płynął prąd.
    No i te transoptory mają max 1.5us czasu propagacji więc to też może mieć jakiś wpływ.
  • #27
    danrok
    Level 13  
    Aha, faktycznie.. dzięki za zwrócenie mi uwagi na ten iloczyn logiczny.
    Teraz fragment wygląda tak:

    Code:
    bool DAC_TransmitByte(int data)  {
    
      int i;
      if (data > 4096)
        return 0;
      LD_Set;     // Transfer data to temp register in DAC
      CS_Clear;   // Select chip
      for(i = 12; i > 0; i--){
        if (data & 0x800) {
          SDI_Set;    // When 1 is transfered SDI is high
        }
        else  {
          SDI_Clear;  // else is low
        }
        data <<= 1;
        DelayUs(1);
        CLK_Set;
        DelayUs(1);
        CLK_Clear;
        DelayUs(1);
      }
      LD_Clear; // End of transfer, shift temp register to output
      CS_Set;   // Deselect chip
      return 1;
    }


    z tym, że niestety DAC nie reaguje. Ma ktoś może jakąś funkcję do porównania?

    Układ podłączony na razie bez optotranzystorów.

    EDIT:
    Co dziwne, przy wysyłaniu wartości 2048 (2^11), moje porownania działają OK.
    DAC na wyjściu ma równo połowę przedziału. Jeśli zamienię wartość iloczynu
    na 0x800 to DAC nie otrzymuje nic. Dziwne..
  • Helpful post
    #28
    Tantalos
    Level 18  
    Ok przeczytałem datasheeta. Powinno być tak:
    Code:
    bool DAC_TransmitByte(int data)  {
    
      int i;
      if (data > 4096)
        return 0;
      CS_Clear;   // Select chip
      for(i = 12; i > 0; i--){
        if (data & 0x800) {
          SDI_Set;    // When 1 is transfered SDI is high
        }
        else  {
          SDI_Clear;  // else is low
        }
        data <<= 1;
        DelayUs(1);
        CLK_Clear;
        DelayUs(1);
        CLK_Set;
        DelayUs(1);
      }
      CS_Set;   // Deselect chip
      DelayUs(1);
      LD_Clear; // End of transfer, shift temp register to output
      DelayUs(1);
      LD_Set;     // Transfer data to temp register in DAC
      return 1;
    }
  • #29
    danrok
    Level 13  
    OK, DAC ruszył bez optoizolacji, ale jednak z optoizolacją jeszcze jest pewien
    problem. Dałem opóźnienia 1ms, dalej nic nie idzie. Czasem - raz na kilka uruchomień
    DAC wypuszcza sygnał na Vout, ale nie ma on wiele wspólnego z tym co chciałbym
    by tam było..
  • #30
    marco47
    Level 41  
    Więc Sam widzisz że w tego typu układacz nieodzownym jest posiadanie oscyloskopu. Teraz kombinujesz jak koń pod górkę :D a wystarczyłby jeden pomiar i wiedziałbyś na czym stoisz.