Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 12 gru 2024, o 15:12


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 23 ] 
Autor Wiadomość
PostNapisane: 9 mar 2016, o 00:06 
Offline
Nowy

Dołączył(a): 06 mar 2016
Posty: 19
Pomógł: 0

Mam jakieś dziwne odczyty z przetwornika ads1013 wersja 12 bit. Układ kupiłem bo chce mieć coś szybszego od ads1015, który to daje prędkość próbkowania 3.3 sps. Niestety prędkość w ads1015 dzieli się na 4 kanały.

Układ ads1013 podłączyłem do arduino Leonardo zgodnie ze schematem datasheet dla tej serii (1013/14/15) - strona 20.

Zgodnie z tym schematem łączę gnd i addr ze sobą. Żeby nie było to pamiętałem o rezystorach 10k dla i2c oraz ALERT/RDY. Użyłem też kondensator 1uf na vcc i dałem dwa dławiki 10 uF na linę zasilania.

Użyłem standardowej bilioteki stosowanej wcześniej z powodzeniem w układzie ads1015 i ads1115.

Użyłem konfiguracji dla ads1015 z github . Wykorzystuje adres 0x48.

Pin A0 dałem testowo do masy i spodziewałam się wyniku zero. Układ działa bowiem w zakresie od 2 do 5.5 V i takie napęcie powinno być inerpretowane jako zero.

Ja dostaje zmienny odczyt od 3730 do 3781.

Pytanie co mogłem przeoczyć?

Zastanawiam się czy nie przegrzałem układu jak go lutowałem. Ale odzyty jednak jakieś mam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 mar 2016, o 00:29 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Cytuj:
oraz ALERT/RDY
Ten pin nie jest dostępny w ADS1013.
Cytuj:
Pin A0 dałem testowo do masy i spodziewałam się wyniku zero.
Chodzi czy o wejście AIN0 czy ADDR0?
Cytuj:
Układ działa bowiem w zakresie od 2 do 5.5 V

To jest zakres napięcia zasilania, a nie zakres mierzonych napięć ...

Podłącz do wejścia potencjometr >10K podłączony do VCC i GND i kręcąc nim zobacz czy zmienia się mierzona wartość.
Jak nie będzie działać, to pokaż schemat oraz podaj wartości jakie odczytujesz ze wszystkich rejestrów układu.

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 mar 2016, o 08:49 
Offline
Nowy

Dołączył(a): 06 mar 2016
Posty: 19
Pomógł: 0

Cytuj:
ALERT/RDY


nie używam tego pinu dałem tylko rezystora 10k do vcc.

Cytuj:
Chodzi czy o wejście AIN0 czy ADDR0?


AIN0 - 4 noga - wejście analogowe.

Cytuj:
To jest zakres napięcia zasilania, a nie zakres mierzonych napięć ...


Wydawało mi się że to również mierzonych napięć. Skąd te przypuczenie że tak nie jest?

Układ wrzucę wieczorem teraz mam tylko mobilny dostęp. Zmnotuje jeszcze jeden taki i zobaczę czy dalej będzie źle.

Tak sobie jeszcze przypomniałem że w bibliotece zmieniłem delay na delayMicroseconds() i usawiłem tam wartość próbkowania 50 z partyzanta :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 mar 2016, o 18:24 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Cytuj:
Wydawało mi się że to również mierzonych napięć. Skąd te przypuczenie że tak nie jest?

Z dwóch powodów:
- bo byłoby to bardzo nielogicznie, niezgodne z typowymi przetwornikami ADC i nieużyteczne
- bo jest napisane w datasheetcie, że jest od GND do VCC :)
Obrazek

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 mar 2016, o 20:01 
Offline
Nowy

Dołączył(a): 06 mar 2016
Posty: 19
Pomógł: 0

No ok masz rachę niedoczytałem wczoraj. Tak czy inaczej GND = 0 na odczytach.

Tak jest na ads 1015 i ads 1115 co zweryfikowałem w testach.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 mar 2016, o 21:39 
Offline
Nowy

Dołączył(a): 06 mar 2016
Posty: 19
Pomógł: 0

Zmonitowałem drugą płytkę i wyniki mam tak samo bez sensu. Użyłem tym razem w 100% oryginalnego kodu z github dla ads1015


Jak przykładam wejście A0 przez rezystor 10k do masy to mam wyniki typu 3700,3780 a nawet 4088 - strasznie duży rozrzut pomiarów przy założeniu, że na wejściu nic się w zasadzie nie zmienia. Żeby było dziwniej jak przykładam rezystor do vcc to mam odczyty stałe 2047.


Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Załączam schemat
Obrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 mar 2016, o 21:50 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

A patrzyłeś czy coś zmienia jak podłączysz AIN1 do GND? Podłącz i sprawdź, może masz włączony tryb różnicowy?

Masz w tej bibliotece możliwość odczytu wartości z rejestrów? Jak tak to odczytaj i pokaż co tam masz ustawione.

--
Pozdrawiam,
Robert

------------------------ [ Dodano po: 16 minutach ]

W nocie aplikacyjnej masz coś takiego:
Cytuj:
The ADS1013 and ADS1014 do not have a multiplexer. Either one differential or one single-ended signal may be measured with these devices. For single-ended measurements, connect the AIN1 pin to GND.

Dlatego jak wyżej sugerowałem, podłącz AIN1 do GND.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 mar 2016, o 19:55 
Offline
Nowy

Dołączył(a): 06 mar 2016
Posty: 19
Pomógł: 0

Miałeś rację. Podłączyłem A1 do GND i teraz wejście działa w trybie single-ended. Wcześniej był w trybie różnicowym.

Jedak zirytowała mnie inna rzecz:

"The ADS1013 has a fixed full-scale input range of ±2.048V" strona 9

Problem w tym że chcę mierzyć napięcie od 2.5. do 5V.
Rozumiem, że tym układam tego nie zmierzę?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 mar 2016, o 20:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Trzeba by przeczytać co piszą w datashetcie, ale może zadziała Ci na tym układzie następujący wariant:
- podłączyć AIN1 do stabilnego źródła Vref ok. 3V
- podłączyć na wejście AIN0 mierzone napięcie
Pomiar robiony jest różnicowo jako AIN0 - AIN1, przez co będzie miał zakres napięć od Vref - 2.048V do Vref + 2.048V. Czyli przy Vref=3V, będzie to od 0.9052V do 5.048V.
Oczywiście będziesz musiał przeliczyć wartości. Gorzej, że musisz dać jakieś zewnętrzne Vref, od którego jakości będzie zależała dokładność pomiaru. Ale może coś znajdziesz :)
http://cds.linear.com/docs/en/application-note/an42.pdf

--
Pozdrawiam,
Robert

------------------------ [ Dodano po: 3 minutach ]

Oczywiście zanim zaczniesz szukać źródła odniesienia, to sprawdź czy ten układ tak zadziała - podłącz do AIN1 napięcie ok 3V poprzez dzielnik rezystorowy i zobacz czy ograniczenie jest na różnicę napięć (AIN0-AIN1) czy na pojedyncze napięcia AIN0 oraz AIN1.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 mar 2016, o 22:58 
Offline
Nowy

Dołączył(a): 06 mar 2016
Posty: 19
Pomógł: 0

Hmm właśnie tak kombinowałem zrobić :) Ale też obawiam się o jakość napięcia referencyjnego. oczywiście nie byłoby problemem kupienie innego układu np ads1014, ale jest coś jeszcze.

Podkręciłem rejestry na 3300 sps ustawiłem z domyślnego "ADS1015_REG_CONFIG_DR_1600SPS" na "ADS1015_REG_CONFIG_DR_3300SPS "

Dodatkowo wprowadziłem drobną zmianę w kodzie zmieniając delay(m_conversionDelay) na delayMicroseconds(m_conversionDelay) dzięki czemu powinienem wykorzystać pełną moc tego przetwornika.

Niestety mam odczyty max 24 próbki na okres przebiegu mierzonego prądu 50 Hz. W datasheet piszą, że ten układ daje radę odczytywać próbki z częstotliwością 3,3k sps. Tymczasem jest to jakaś bzdura chyba. Miałem nadzieję, że dla ads1013 nie będzie tego problemu. Sądziłem, że spowolniony pomiar dla ads 1015 i ads1115 wynika z podziału na 4 kanały, a producent tak to sobie sumuje. Teraz sam już nie wiem jak oni to podają i ile faktycznie ten układ może wyciągać.

------------------------ [ Dodano po: 8 minutach ]

Zastanawiam się nad przeniesieniem projektu na układ MCP3208. Nie wiem tylko na ile on się nadaje do zastosowań pomiarowych. Potrzebuję rozdzielczości przynajmniej 0.003 V



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 mar 2016, o 23:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Według dokumentacji w najszybszym trybie pomiar trwa 0.3ms.
Może masz jeszcze gdzieś w bibliotece jakieś ograniczenia - może I2C jest wolno taktowane, lub coś w tym stylu.
Z tego co widzę, to korzystasz z arduino, więc może ono wnosi dodatkowe opóźnienia?

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 mar 2016, o 17:31 
Offline
Nowy

Dołączył(a): 06 mar 2016
Posty: 19
Pomógł: 0

Sprawdzę jeszcze prędkość szyny danych I2C. Może to o to chodzi.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 mar 2016, o 13:45 
Offline
Nowy

Dołączył(a): 06 mar 2016
Posty: 19
Pomógł: 0

Wydaje mi się, że biblioteka Wire.h dla Arduino jest domyślnie ustawiona na 100k, ale pewności nie mam.

W module Adafruit ads1015, jak również w Adafruit ads1115 są rezystory pull up o wartości 10k co umożliwia max prędkość i2c do 100k. Dla uzyskania prędkości magistrali i2c do 400k zalecane są rezystory o wartości 2k.

Pytanie czy te 100k wystarczy i czy faktycznie tle jest na Arduino Leonardo lub Uno?

Użyłem w skrypcie:

Kod:
Wire.setClock(400000) ;


nie widzę, żadnej równicy.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 mar 2016, o 15:53 
Offline
Nowy

Dołączył(a): 06 mar 2016
Posty: 19
Pomógł: 0

Dziś zmieniłem częstotliwość i2c i udało się przyspieszyć te odczyty, ale nadal nie jest tak jak być powinno. Teraz na Adafruit ads1015 mam 54 odczyty na okres w przebiegu prądu 50hz.
Nadal czuję niedosyt.

Kod:
#include <Wire.h>
#include <Adafruit_ADS1015.h>
int lo = 300;
int array[300];

Adafruit_ADS1015 ads(0x48);


void setup(void)
{
  Serial.begin(9600); 
  ads.begin();

 twi_setClock(600000); // i2c dla esp8266-12 600KHz
 //twi_setClock(400000); // i2c dla esp8266-12 400KHz
//TWBR = ((F_CPU /400000l) - 16) / 2; // Change the i2c clock to 400KHz for Arduino UNO
}

void loop(void)
{
  int16_t adc0;  // we read from the ADC, we have a sixteen bit integer as a result



 
 for(int i=1;  i<=lo; i++){
  adc0 = ads.readADC_SingleEnded(0);
  array[i] = adc0;
   delayMicroseconds(50);
  }

for(int i=1;  i<=lo; i++){

  Serial.println(array[i]);
  delay(10);
  }
 
 delay(20000);
}



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 mar 2016, o 22:50 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Teoretycznie nie ma znaczenie jak szybko mierzy Ci układ, bo biblioteka nie czeka na żaden wskaźnik końca pomiaru tylko czeka zadany czas:
Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Dla wersji ADS1015 wartość m_conversionDelay jest ustawiana na 1 ms:
Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Co powoduje, że możesz mierzyć max. 1000 pomiarów/s. Oczywiście jeżeli szybkość wszystkich innych operacji będzie pomijalna.
Jeżeli masz znacznie mniej pomiarów, to wina szybkości działania programu na procesorze.

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 mar 2016, o 22:08 
Offline
Nowy

Dołączył(a): 06 mar 2016
Posty: 19
Pomógł: 0

Tak tylko pisałem wcześniej, że zmieniłem ten delay() na delayMicroseconds() co w efekcie powinno powodawać że biblioteka nie stanowi już problemu. Dlatego operuje na mikro sekundach, a nie mili sekundach. Teoretycznie w bibliotece powinna być ustawiona wartość 300 mikro sekund ale u mnie ustawiłem na 10 bo w testach słabo to wypadało. Zwóć też uwagę że zmodyfikowałem rejestr z domyślnego 1600 sps na 3300.

W kodzie w Arduino daje czas również delayMicroseconds() , ale wartość ustawiona jest na 50 do 25 żeby biblioteka dała radę odpowiadać dla skryptu.

------------------------ [ Dodano po: 23 minutach ]

Układ powinien dać 66 odczytów - 3300 sps / 50 hz = 66 pomiarów na sekundę. Ja uzyskuje 54 na sekundę .
Na tą chwilę stawiam dwie hipoteczny do testów, że to:
- kwestia tych rezystorów 10k - dla i2c powyżej 400 khz zaleca się rezystory pull up ookoło 2k,
- zbyt niska częstotliwość magistrali i2c. Ten układ może pracować z magistralą pod 1 mhz.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 mar 2016, o 23:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Dorzuć jakiś timer mierzący czas i odczytaj ile czasu zajmuje Ci pojedyncza operacja pomiaru.

Cytuj:
Zwróć też uwagę że zmodyfikowałem rejestr z domyślnego 1600 sps na 3300
Zmiana nie ma wpływu na ilość odczytów. To zmienia tylko szybkość próbkowania. Oczywiście jak nie zmienisz i będziesz szybciej odczytywał, to odczytasz rejestr jeszcze przed pojawieniem się tam nowej wartości.

Ustawiając delay-a na 10us możesz mieć problem z odczytami poprawnych wartości, bo to za krótki czas.
Ile udaje się Ci odczytać razy na sekundę jak ustawisz w bibliotece wartość delay(m_conversionDelay) na 300us a ile jak na 10us?

Czy nie masz w programie jakich dodatkowych elementów / bibliotek, mogących wpływać na szybkość działania programu (np. bardzo częstych przerwań)?
Jakie masz taktowanie procesora?

Masz dostęp do jakiegoś analizatora aby obejrzeć ruch na I2C?

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 mar 2016, o 22:56 
Offline
Nowy

Dołączył(a): 06 mar 2016
Posty: 19
Pomógł: 0

Nie korzystałem z takich analizatorów. Poszukam czegoś. Będę wdzięczny za jakieś namiary ewentualnie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 mar 2016, o 19:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Najtańszy i działający to klon analizatora stanów logicznych Saleae 8CH 24MHz.
Na aledrogo kupisz już od 30 zł (40 z przesyłką). Nie spodziewaj się tych podawanych 24MHz, ale do takich zastosowań jak powyższe sprawdzenie wystarczy.
Działa z nimi oficjalne oprogramowanie Saleae Logic (https://www.saleae.com/).

Zanim kupisz coś zewnętrznego do testowania, to tak jak wcześniej sugerowałem, sprawdź na timerze jak wyglądają czasowo operacje - uruchom licznik timera (najlepiej 16 bitowego) z np. krokiem 1us i odczytuj jego wartości przed i po poszczególnych operacjach. Dzięki temu będzie można określić ile czasu zajmują poszczególne działania.

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 mar 2016, o 00:05 
Offline
Nowy

Dołączył(a): 06 mar 2016
Posty: 19
Pomógł: 0

W czym to jest lepsze od oscyloskopu cyfrowego? Tam teź mogę zgrać wyniki pomiarów na Flash i przeanalizować. Nie



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 mar 2016, o 09:02 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Oscyloskop cyfrowy kosztuje znacznie więcej i masz typowo 2 kanały. Dla I2C to jeszcze wystarczy ale już dla SPI trzeba więcej :( A analizatory mają typowo 8 a często nawet do 16 kanałów. Dodatkowo analizator dokonuje analizy przebiegu i podaje nie tylko przebiegi ale także dekoduje wartości dla danego protokołu.
Ogólnie to jest tak jak ze sztućcami. Drugie danie zjesz łyżką a niektóre zupy nawet da się zjeść widelcem. Ale po to wymyślona tyle rodzajów sztućców by było łatwiej i wygodniej. Tak samo jest z narzędziami do analizy przebiegów. Jest wiele rodzajów by było łatwiej, ale nie znaczy to że tym dedykowanym do jednych zadań nie zrobisz drugiego.

Jak masz dostęp do oscyloskopu cyfrowego, to na nim możesz sprawdzić jak wygląda timing dla komunikacji z układem.

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 mar 2016, o 09:11 
Offline
Nowy

Dołączył(a): 06 mar 2016
Posty: 19
Pomógł: 0

No włanie mam od niedawna :) Pytanie jak w ogóle podejść do tego pomiaru?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 mar 2016, o 14:15 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Cytuj:
No włanie mam od niedawna :) Pytanie jak w ogóle podejść do tego pomiaru?
Ustaw w programie na początek tylko jeden odczyt ADC wykonywany co kilka sekund. Do oscyloskopu podłącz linie SCL i SDA - jak masz min. dwu kanałowy. Ustaw poziomy napięć wejściowych odpowiednie, tak by ładnie było widać sygnały (zależne od wielkości ekranu i podziału - ale tak 1..2V/działkę). Dobierz podstawę czasu by móc widzieć przynajmniej część przebiegu odczytu. Ustaw odpowiednie trigerowanie dla łapanego sygnały (chyba na początek najlepiej coś w stylu one shot - czyli wytrigerowanie jednokrotne przebiegu). I masz na ekranie odczytany przebieg.
Jak nie wiesz jak działa protokół I2C, to jeszcze będzie musiał się z jego zasadami działania zapoznać, bo teraz Ty będzie musisz zrobić co standardowo robi analizator logiczny. Będziesz musiał przerobić zera i jedynki na odpowiednie sekwencje i popatrzeć się jak one rozkładają się w czasie.

--
Pozdrawiam,
Robert

------------------------ [ Dodano po: 5 minutach ]

Ale możesz na początek zrobić prościej. Dodaj w programie zmiany na dodatkowym pinie i jego stan oglądaj na oscyloskopie. Będziesz mógł zobaczyć ile czasu zajmują kolejne operacje (coś jak z debugerem z migającą diodą, tylko że migasz szybciej więc używasz oscyloskopu a nie oka :)).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 23 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO