Skocz do zawartości

Sipeed Tang Nano 4k z ADC - Gowin FPGA Designer


Gieneq

Pomocna odpowiedź

20 godzin temu, ethanak napisał:

ESP ma jeden ból - komunikacja po I2C czy SPI może paść, jeśli nie jest realizowana w głównej pętli Arduino.

Cześć,

ponieważ program na STM32F411 (do obsługi ADS1256) działał bardzo dobrze, a wersja biblioteki i programu dla ADS1256 działająca na ESP32, nie postanowiłem, sprawdzić sam program (ten sam co dla ESP32) dla Arduino UNO (podłączając płytkę z przetwornikiem ADS1256 do Arduino UNO) i co ciekawe działa on prawidłowo (nawet z prędkością zbierania sampli 30000sps). Tak więc ewidentnie jest coś nie tak z transmisją po SPI dla ESP32, mam zamiar przyjrzeć się jej bliżej z analizatorem protokołu SPI.

Pozdrawiam

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Daj znać co wyszło - ja podłączałem analizator i2c, jeśli wszystko szło z głownego tasku nie było problemów (eeprom, rtc, żyroskop, sterownik serwo), to samo wywołane na innym tasku niezależnie od rdzenia powodowało, że analizator widział sieczkę. Nie chciało mi się sprawdzać dlaczego...

  • Lubię! 2
Link do komentarza
Share on other sites

27 minut temu, ethanak napisał:

Daj znać co wyszło - ja podłączałem analizator i2c, jeśli wszystko szło z głownego tasku nie było problemów (eeprom, rtc, żyroskop, sterownik serwo), to samo wywołane na innym tasku niezależnie od rdzenia powodowało, że analizator widział sieczkę. Nie chciało mi się sprawdzać dlaczego...

Cześć,

dopiero późnym popołudniem będę miał czas, żeby to sprawdzić, ale na pewno napiszę co udało się ustalić. Nie ma szansy na obsługę SPI z głównej pętli programu, ponieważ wywołania funcji SPI są w bibliotece do obsługi ADS1256.

Pozdrawiam

Link do komentarza
Share on other sites

Cześć @FlyingDutch  dziękuję za informację. Daje to jakieś światełko w tunelu.

Tak się teraz zastanawiam jak to połączyć. Mam do dyspozycji kilka układów STM32: F429, F303 i L4 z kursu. Pewnie wybiorę F4 choć trochę szkoda mi tej płytki bo ma wyświetlacz... ale co mi po wyświetlaczu w szufladzie, żeby leżał kolejne kilka lat?

Jestem ciekaw czy uda się przenieść cały kod próbkowania + FFT + sterowania wyświetlaczem do STM. Teraz mam w głowie 2 opcje:

  1. Wszystko na STM: próbkowanie + FFT + sterowanie matrycą, ESP w roli układu nadrzędnego sterującego pracą STM. Komunikacja najpewniej równoległa GPIO - start/stop i wybór efektów zakodowany na 3-4 bitach. Ewentualnie komunikacja szeregowa, żeby dało się mieć informacje o... czymś. Nie wiem czym. Może BPM jakby się kiedyś w końcu udało.
  2. STM: próbkowanie + FFT, wyniki 19 pasm wysyłane do ESP szeregowo około 30-60Hz. ESP realizuje efekty i sterowanie matrycą. Wtedy kod efektów byłby przeniesiony do komponentu ESP Home. Ma to nawet swoje zalety:
  • kod ESPHome wgrywam przez OTA,
  • moduł próbkowania + FFT + konwersji na 19 pasm jest osobnym modułem, który raz napiszę i zapomnę jak działa,
  • wyznaczanie animacji nie jest krytyczne czasowo, można zostawić na ESP działającym jednocześnie z WiFi.

2 wydaje się lepsza, ale jeszcze nie za dobrze radzę sobie z pisaniem komponentów ESP Home i może wyjść że jednak się czegoś nie da. Zobaczę 🙂 

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Cześć,

dopiero dzisiaj miałem czas by obejrzeć za pomocą analizatora stanów logicznych przebiegi magistrali SPI (bezpośrednio na pinach płytki ESP32). Tutaj link do biblioteki do obsługi ADS1256 (dla Arduino IDE):

https://github.com/ADS1xxx-Series-ADC-Libraries/ADS1255-ADS1256

Ten sam program (z tą biblioteką) działa najzupełniej poprawnie z "Arduino UNO". Tutaj sam plik szkicu dla Arduino IDE:

#include <SPI.h>

// Arudino Sample Code to use ADS1256 library
// http://www.ti.com/lit/ds/symlink/ads1256.pdf

// Reads channel 0 continuously

// Written by Axel Sepulveda, May 2020

#include <ADS1256.h>

float clockMHZ = 7.68; // crystal frequency used on ADS1256
float vRef = 2.5; // voltage reference

// Construct and init ADS1256 object
ADS1256 adc(clockMHZ,vRef,false); // RESETPIN is permanently tied to 3.3v

float sensor1;

void setup()
{
  Serial.begin(250000);
  
  Serial.println("Starting ADC");

  // start the ADS1256 with data rate of 15 SPS and gain x1
  adc.begin(ADS1256_DRATE_100SPS,ADS1256_GAIN_1,false); 
    
  // other data rates: 
  // ADS1256_DRATE_30000SPS
  // ADS1256_DRATE_15000SPS
  // ADS1256_DRATE_7500SPS
  // ADS1256_DRATE_3750SPS
  // ADS1256_DRATE_2000SPS
  // ADS1256_DRATE_1000SPS
  // ADS1256_DRATE_500SPS
  // ADS1256_DRATE_100SPS
  // ADS1256_DRATE_60SPS
  // ADS1256_DRATE_50SPS
  // ADS1256_DRATE_30SPS
  // ADS1256_DRATE_25SPS
  // ADS1256_DRATE_15SPS
  // ADS1256_DRATE_10SPS
  // ADS1256_DRATE_5SPS
  // ADS1256_DRATE_2_5SPS
  // 
  // NOTE : Data Rate vary depending on crystal frequency. Data rates listed below assumes the crystal frequency is 7.68Mhz
  //        for other frequency consult the datasheet.
  //Posible Gains 
  //ADS1256_GAIN_1 
  //ADS1256_GAIN_2 
  //ADS1256_GAIN_4 
  //ADS1256_GAIN_8 
  //ADS1256_GAIN_16 
  //ADS1256_GAIN_32 
  //ADS1256_GAIN_64 
  
  Serial.println("ADC Started");
  
  // Set MUX Register to AINO so it start doing the ADC conversion
  Serial.println("Channel set to Single end ch0");
  adc.setChannel(0);
}

void loop()
{ 
  adc.waitDRDY(); // wait for DRDY to go low before next register read
  sensor1 = adc.readCurrentChannel(); // read as voltage according to gain and vref
  
  Serial.println(sensor1 , 10); // Print as decimal, 10 decimal places
}

A tutaj wynik działania programu (Serial Monitor):

Arduino01_.thumb.png.4289ccfb98e34479f7d841ceb913a9b9.png

Jak widać na zrzucie ekranu sczytywane są same zera z przetwornika ADC. Płytka z przetwornikiem ADS1256 jest podłączona do ESP32 tak jak to opisano w linku do biblioteki (patrz wyżej). A tutaj wyniki zebrane analizatorem stanów logicznych (na pinach ESP32) dla magistrali SPI:

LogicAnalyzer01.thumb.png.5a3367c3ce50d052e5f75c6a287a6ff1.png

jak widać żaden z sygnałów magistrali SPI (SCK, MISO,MOSI, DRDY) nie jest generowany (jedyny sygnał jest na pinie CS - kanał 6).

Podłączenie do płytki ESP32 wykonałem tak jak opisano w linku - patrz obrazek z pinout ESP32 poniżej:

ESP32-DOIT-DEVKIT-V1-Board-Pinout.thumb.png.ce262fbe122235d10537e8f387e0425f.png

Jak sprawdziłem w bibliotece SPI dla płytki ESP32 (w Arduino ISE) użyte są piny , które podłączyłem do ESP32 - patrz fragment kodu z SPI.h:

void SPIClass::begin(int8_t sck, int8_t miso, int8_t mosi, int8_t ss)
{
    if(_spi) {
        return;
    }

    if(!_div) {
        _div = spiFrequencyToClockDiv(_freq);
    }

    _spi = spiStartBus(_spi_num, _div, SPI_MODE0, SPI_MSBFIRST);
    if(!_spi) {
        return;
    }

    if(sck == -1 && miso == -1 && mosi == -1 && ss == -1) {
        _sck = (_spi_num == VSPI) ? SCK : 14;
        _miso = (_spi_num == VSPI) ? MISO : 12;
        _mosi = (_spi_num == VSPI) ? MOSI : 13;
        _ss = (_spi_num == VSPI) ? SS : 15;
    } else {
        _sck = sck;
        _miso = miso;
        _mosi = mosi;
        _ss = ss;
    }

    spiAttachSCK(_spi, _sck);
    spiAttachMISO(_spi, _miso);
    spiAttachMOSI(_spi, _mosi);

}

Ktoś ma jakiś pomysł dlaczego sygnały magistrali SPI w ESP32 nie są generowane (błędów kompilacji programu ani wykonania nie ma). Może jakieś podejrzenie co może być nie tak.

Pozdrawiam

 

  • Pomogłeś! 1
Link do komentarza
Share on other sites

11 minut temu, FlyingDutch napisał:

Ktoś ma jakiś pomysł dlaczego sygnały magistrali SPI w ESP32 nie są generowane

O ile pamiętam, jeśli nie podasz explicite z którego SPI korzystasz domyślnie jest VSPI a nie HSPI... sprawdź na pinach VSPI albo po prostu podaj piny z których chcesz korzystać (SPI, I2C, I2S, zdaje się że też UART idą przez multiplekser i możesz podłączyć prawie każdy pin).

  • Pomogłeś! 1
Link do komentarza
Share on other sites

1 godzinę temu, ethanak napisał:

O ile pamiętam, jeśli nie podasz explicite z którego SPI korzystasz domyślnie jest VSPI a nie HSPI... sprawdź na pinach VSPI albo po prostu podaj piny z których chcesz korzystać (SPI, I2C, I2S, zdaje się że też UART idą przez multiplekser i możesz podłączyć prawie każdy pin).

Cześć @ethanak,

dzięki za pomoc 😄. Nie mam dużego doświadczenia z ESP32, przełączyłem piny na VSPI (z HSPI) i działa poprawnie (musiałem też przenieść PIN DRDY z 17 na 22). Fajnie, że się udało bo ESP32 ma około 600 DMIPS (podczas gdy STM32F4 około 150 DMIPS), no i ma dwa rdzenie. Na jednym rdzeniu chciałbym zbierać sample z szybkością 30Ksps, a na drugim liczyć FFT (256 punktów). Jak z ArduinoIDE się uruchamia funkcję/metodę na konkretnym rdzeniu ESP32?

BTW: teraz będę próbował policzyć FFT dla 256 punktów za pomocą tego kodu:

https://medium.com/swlh/how-to-perform-fft-onboard-esp32-and-get-both-frequency-and-amplitude-45ec5712d7da#9ebf

 Autor podaje, że 256 punktowa FFT liczy się w 1,5 ms (na ESP32), a zebranie 256 sampli z ADC (prędkość 30Ksps) zajmie 85 ms. Może dam radę wymyśleć jakiś pipeline, aby wyniki z FFT wyskakiwały częściej niż 10 razy na sekundę.

Hej @Gieneq ile razy na sekundę potrzebujesz wyniki obliczonej FFT (minimalnie)? Bo problemem nie będzie czas liczenia FFT, ale czas zbierania odpowiedniej liczby sampli (z prędkością 30Ksps) z ADC.

Pozdrawiam

Edytowano przez FlyingDutch
  • Lubię! 1
Link do komentarza
Share on other sites

5 godzin temu, Gieneq napisał:

Cześć @FlyingDutch  dziękuję za informację. Daje to jakieś światełko w tunelu.

Tak się teraz zastanawiam jak to połączyć. Mam do dyspozycji kilka układów STM32: F429, F303 i L4 z kursu. Pewnie wybiorę F4 choć trochę szkoda mi tej płytki bo ma wyświetlacz... ale co mi po wyświetlaczu w szufladzie, żeby leżał kolejne kilka lat?

Jestem ciekaw czy uda się przenieść cały kod próbkowania + FFT + sterowania wyświetlaczem do STM. Teraz mam w głowie 2 opcje:

  1. Wszystko na STM: próbkowanie + FFT + sterowanie matrycą, ESP w roli układu nadrzędnego sterującego pracą STM. Komunikacja najpewniej równoległa GPIO - start/stop i wybór efektów zakodowany na 3-4 bitach. Ewentualnie komunikacja szeregowa, żeby dało się mieć informacje o... czymś. Nie wiem czym. Może BPM jakby się kiedyś w końcu udało.
  2. STM: próbkowanie + FFT, wyniki 19 pasm wysyłane do ESP szeregowo około 30-60Hz. ESP realizuje efekty i sterowanie matrycą. Wtedy kod efektów byłby przeniesiony do komponentu ESP Home. Ma to nawet swoje zalety:
  • kod ESPHome wgrywam przez OTA,
  • moduł próbkowania + FFT + konwersji na 19 pasm jest osobnym modułem, który raz napiszę i zapomnę jak działa,
  • wyznaczanie animacji nie jest krytyczne czasowo, można zostawić na ESP działającym jednocześnie z WiFi.

2 wydaje się lepsza, ale jeszcze nie za dobrze radzę sobie z pisaniem komponentów ESP Home i może wyjść że jednak się czegoś nie da. Zobaczę 🙂 

Cześć @Gieneq,

nie wiem ile pinów razem potrzebujesz, ale najtaniej by wyszło, żeby zrobić wszystko na ESP32, który ma moc obliczeniową 600DMIPS (Stm32F4 około 140 DMIPS, a STM32F303 90DMIPS) i dwa rdzenie. Ja dzisiaj będę prawdopodobnie wiedział, ile czasu liczy się FFT na ESP32. Zbieranie próbek z płytką ADS1256 podłączoną ESP32, dzięki pomocy @ethanak'a działa już prawidłowo. Ile pinów potrzebujesz do sterowania matrycą?

Pozdrawiam

Link do komentarza
Share on other sites

21 minut temu, ethanak napisał:

A tak przy okazji - nie lepiej użyć przetwornika na i2s zamiast spi? ESP łyka to lepiej niż Zenek piwo pod sklepem... tyle że trzeba trochę programu napisać 😞

Hej @ethanak

taki przetwornik też kupiłem - tutaj link do niego:

https://pl.aliexpress.com/item/32830812025.html?gatewayAdapt=glo2pol&spm=a2g0o.9042311.0.0.84a45c0fSajyJM

Tylko trzeba by robić konwersję z I2S (szeregowy) na równoległy, tak aby na tych próbkach policzyć FFT. Nie mówię, że nie, ale najpierw chcę zakończyć próby z ADS1256.

Pozdrawiam

Link do komentarza
Share on other sites

No ale esp ma sprzętowy driver i2s, i problem jest tylko taki, żeby driver pchał dane do dma, a fft na drugim rdzeniu spokojnie sobie te dane pobierał... przecież nie będziesz robił ręcznie konwersji, a driver powinien łyknąć 2 x 24bit x 64kHz bez czkawki...

Tyle że pod Arduino nie ma gotowca - ale jak mniemam to nie powinno być problemem 😉

Link do komentarza
Share on other sites

Przed chwilą, ethanak napisał:

No ale esp ma sprzętowy driver i2s, i problem jest tylko taki, żeby driver pchał dane do dma, a fft na drugim rdzeniu spokojnie sobie te dane pobierał... przecież nie będziesz robił ręcznie konwersji, a driver powinien łyknąć 2 x 24bit x 64kHz bez czkawki...

Tyle że pod Arduino nie ma gotowca - ale jak mniemam to nie powinno być problemem 😉

Pomysł bardzo ciekawy, z chęcią spróbuje, ale najpierw muszę skończyć próby z ADS1256 😉

Pozdrawiam

Link do komentarza
Share on other sites

Tylko jeden drobny drobiazg: chcesz mieć 30k próbek na sekundę - zagwarantujesz, że przetwornik będzie pobierał dane dokładnie co 1/30 milisekundy? Bo jeśli nie, to równie dobrze możesz użyć wbudowanego adc i ograniczyć się do 8 bitów.

Przetwornik i2s to gwarantuje.

Link do komentarza
Share on other sites

9 minut temu, ethanak napisał:

Tylko jeden drobny drobiazg: chcesz mieć 30k próbek na sekundę - zagwarantujesz, że przetwornik będzie pobierał dane dokładnie co 1/30 milisekundy? Bo jeśli nie, to równie dobrze możesz użyć wbudowanego adc i ograniczyć się do 8 bitów.

Przetwornik i2s to gwarantuje.

8 bitów to trochę za mało na dynamikę sygnału audio. I tak będę ograniczał liczbę bitów z przetwornika do 16 bitów (ADS1256). Jeśli będzie potrzeba to dodam jakieś FIFO pomiędzy przetwornikiem a wejściem FFT.

BTW: sygnał DRDY z ADC mówi, że kolejna próbka jest gotowa - trzeba by obejrzeć jak ten przebieg wygląda dla prędkości 30Ksps na analizatorze stanów.

Pozdrawiam

Edytowano przez FlyingDutch
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.