Skocz do zawartości

Przeszukaj forum

Pokazywanie wyników dla tagów 'ADC'.

  • Szukaj wg tagów

    Wpisz tagi, oddzielając przecinkami.
  • Szukaj wg autora

Typ zawartości


Kategorie forum

  • Elektronika i programowanie
    • Elektronika
    • Arduino i ESP
    • Mikrokontrolery
    • Raspberry Pi
    • Inne komputery jednopłytkowe
    • Układy programowalne
    • Programowanie
    • Zasilanie
  • Artykuły, projekty, DIY
    • Artykuły redakcji (blog)
    • Artykuły użytkowników
    • Projekty - DIY
    • Projekty - DIY roboty
    • Projekty - DIY (mini)
    • Projekty - DIY (początkujący)
    • Projekty - DIY w budowie (worklogi)
    • Wiadomości
  • Pozostałe
    • Oprogramowanie CAD
    • Druk 3D
    • Napędy
    • Mechanika
    • Zawody/Konkursy/Wydarzenia
    • Sprzedam/Kupię/Zamienię/Praca
    • Inne
  • Ogólne
    • Ogłoszenia organizacyjne
    • Dyskusje o FORBOT.pl
    • Na luzie

Kategorie

  • Quizy o elektronice
  • Quizy do kursu elektroniki I
  • Quizy do kursu elektroniki II
  • Quizy do kursów Arduino
  • Quizy do kursu STM32L4
  • Quizy do pozostałych kursów

Szukaj wyników w...

Znajdź wyniki, które zawierają...


Data utworzenia

  • Rozpocznij

    Koniec


Ostatnia aktualizacja

  • Rozpocznij

    Koniec


Filtruj po ilości...

Data dołączenia

  • Rozpocznij

    Koniec


Grupa


Imię


Strona

Znaleziono 13 wyników

  1. Witam, przymierzam się do rozpoczęcia budowy urządzenia które mam zamiar przedstawić w pracy inżynierskiej. Z założenia ma to być chłodzenie szaf sterowniczych za pomocą modułu Peltiera. Projekt wydaje się prosty, natomiast posiadam Raspberry Pi 2B i pomyślałem, że projekt sobie utrudnie 🙂 Mój pomysł wygląda następująco, chciałbym odczytywać temperature z wnętrza obudowy, jeżeli ta przekroczy dopuszczalną wartość, na moduł Peltiera jak i wentylatory dostarczane jest napięcie do momentu uzyskania porządanej temperatury wnętrza szafy. Na ten moment te kwestie są dla mnie niejsane: czy jest możliwośc podłączenia bezpośrednio miernika temperatury do maliny, czy potrzebny jest przetwornik ADC? w jaki sposób kontrolować Peltiera z maliny? Gdybym nie używał maliny zrobiłbym to za pomocą kontrolera PWM, ale jak wygląda to w tym przypadku Proszę również o rady, spostrzerzenia odnośnie projektu, jestem osobą a bardzo nikłym doświadczeniu z mikrokontrolerami i dosłownie wszystko w tym temacie będzie dla mnie wartościowe
  2. Cześć. Może ktoś mi podpowie w czym jest problem, że nie mogę uruchomić odczytu z ADC z zastosowaniem DMA. Jeśli czytam jeden pomiar to nie ma problemu, ale gdy chce uruchomić ich kilka w trybie ciągłym to nie dostaję wogóle przerwania od zakończonego pomiaru. Procesor STM32H743. Poniżej zrzuty ekranu pokazujące fragment kodu oraz ustawienia w CubeMX
  3. Hej Wspomniałem w wątku o aktualnych projektach na tapecie, że zmontowałem prosty układ, który ma za zadanie siedzieć w aucie, monitorować napięcie akumulatora i wysyłać dane po sieci. Wykorzystałem do tego WeMos D1 mini i wszystko śmiga poza dokładnością pomiaru napięcia. Wemos bazuje na ESP8266, którego ADC ma zakres 1V. Płytka ma wbudowany podzielnik 100kΩ : 220kΩ by rozszerzyć ten zakres do 3,3V. Do tego podzielnika dorzuciłem szeregowo dwa rezystory o łącznej rezystancji ok. 1,2MΩ by mieć zakres ~16V. To niestety daje dość sporą impedancję. Wolałem nie zmieniać wbudowanych rezystorów, jeśli to nie będzie bardzo konieczne. Niestety, precyzja pomiaru okazała się na tyle słaba, że postanowiłem poszukać lepszego sposobu. Wystarczyło lekko chuchnąć na płytkę, by natychmiast pomiar zmienił się o ~0,2V. Przy zmianie temperatury również zauważyłem jeszcze większe różnice. Do tego po skalibrowaniu pomiaru dla 12V, dla np. 10V zmierzył 9,6V. Niestety, ESP3266 nie pozwala na podłączenie napięcia odniesienia dlatego pomyślałem o zewnętrznym ADC i tu zaczyna się w końcu pytanie 😉 Czy taki zewnętrzny ADC będzie sensownym podejściem? Jaki układ byście polecili? Przyznam, że nie sprawdzałem jakby poradził sobie AVR z napięciem odniesienia, ale mam tylko 5V pod ręką. Zasilanie biorę z przetwornicy i tu jest ekstremalnie stabilne 3,3V, więc to właśnie zasilanie chciałbym wykorzystać jako napięcie odniesienia. Gdyby ESP miał 2 ADC, to mógłbym tak zrobić. Ewentualnie może jakiś prosty multiplekser na 2 tranzystorach zamiast ADC? Chociaż nie wiem, czy mierzenie swojego Vcc ma tu sens i coś da. Cały kod mam w funkcji setup(), więc pomiar napięcia jest zaraz po wybudzeniu ESP z głębokiego snu (ale przed włączeniem WiFi, bo na to bardzo zwracano uwagę, że po włączeniu WiFi ADC szaleje). Może to też wina i powinienem dać mu czas na rozruch? Generalnie nie zależy mi na rozdzielczości pomiaru (0,1V spokojnie wystarczy) co na jego dokładności (by mieć pewność, że jak zmierzył 10,3V to dokładnie tyle jest - powiedzmy +/-0,05V? nie za dokładnie?), więc więcej bitów w ADC nie będzie tu miało kluczowego znaczenia.
  4. Czesc, udalo mi sie ostatnio napisac na blue pillu prosty voice recorder, ale przy odtwarzaniu nagrania slyszalem mase stukow (mimo to glos jest calkiem rozpoznawalny). Myslalem ze to moze byc problem z zasilaniem czy cos, ale zrzucilem sobie nagranie na program ala audacity i podejrzenie o stuki padlo na SPI. Jezeli chodzi o kod to uzywam ADC z czestotliwoscia 16kHz i wypelniam bufor o rozmiarze 512. Jak bufor jest pelny robie zapis do karty SD za pomoca biblioteki FATFS( ktorej nie jestem pewien czy uzywam poprawnie), wszystko wygenerowane w CUBEMX i zbudowane na plytce stykowej. x = ~32ms ; y = ~64ms | 512/16kHz = 0.032 s = 32 ms Nagrałem dzwiek fali sinus z glosnikow i zauwazylem ze te zaklocenia troche oddaja to co sie dzieje u mnie w kodzie, tam gdzie jest 1 na SS wyglada na to ze to jest moment gdy robie f_write do SD, a tam gdzie jest 2, dzieje sie znow f_write z kolejnym pelnym buforem + f_sync, ktory jak rozumiem robi flush danych (danych zapisanych wczesniej za pomoca f_write() ) do karty. I teraz pytanko o FATFS. Z tego co probowalem wyczytac z dokumentacji (http://elm-chan.org/fsw/ff/doc/write.html), for i wydebugowac, ta biblioteka tworzy w RAM mcu takie wirtualne odzwierciedlenie tego co jest w pliku na karcie SD w postaci struktury FILE, i teraz jak robie f_write(bufor), to to sie nie przeklada na fizyczny zapis danych do karty za pomoca SPI, tylko na przeniesienie mojego bufora do bufora struktury FILE (czyli kopia z RAM do RAM), a fizyczny zapis do SD nastepuje dopiero po wywolaniu funkcji f_sync(). Wtedy to co jest w FILE.data[] leci po SPI do karty. Dobrze to rozumiem? Czy moze f_sync() uzywac co 10 albo 100 zapis zamiast co 2? Z analizy obrazka z drugiej strony by wynikalo ze jezeli to zeczywiscie SPI tam tak miesza, to f_write() jednak dokonuje zapisu po SPI do karty SD, tylko wtedy nie rozumiem czemu w 2 dzieje sie taki meksyk, f_sync() nie powinno miec nic do wypchniecia i zaklocenia nie powinny tam trwac dwa razy to co sie dzieje w 1. Ostatecznie pytanko, czy da sie te zaklocenia ogolnie jakos wyeliminowac sprzetowo? Piąteczka
  5. Cześć! Zbudowałem na płytce stykowej taką przetwornicę typu Buck jak na zdjęciu i mam problem z regulacją napięcia. Równolegle z obciążeniem jakim jest rezystor 100om dołożyłem dzielnik napięcia z rezystora 51k i 10k do pomiaru napięcia wyjściowego. Dzielnik jest podpięty do wejścia ADC3 (PC3). Zadaję napięcie wyjściowe przetwornicy za pomocą potencjometru podpiętego do wyjścia ADC1 (PC1). I wszytko ładnie śmiga, napięcie na dzielniku jest równe zawsze napięciu na potencjometrze do czasu gdy nie włączę równolegle do opornika 100om drugi opornik 10om. Napięcie na wyjściu z zadanych 9V spada do 8V i napięcia na dzielniku i potencjometrze się nie zgadzają. Ale gdy zwiększę napięcie zadane na powiedzmy 10V to napięcie na wyjściu wynosi z powrotem 9V. Więc uważam że to jest problem ze złym sterowaniem PWMem Problemem raczej nie jest niedostatek mocy. Przetwornica jest zasilana z prostownika a prostownik ze 100W transformatora (12V, 8A). Gdy dokładam ten opornik 10om to napięcie na wyjściu prostownika wynosi ok 13V więc jest zapas mocy. Parametry przetwornicy L=3mH 2A Cwyj=2000uF Mosfet= IRF630 Cbootstrap=2,2uF Najbardziej mnie interesuje to czy uważacie że kod jest poprawny i tak zaprogramowana atmega może regulować napięcie #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> volatile uint8_t napiecie,pwm, kanal=3, zadane; int main(void){ //ADC ADMUX|=(1<<REFS1)|(1<<REFS0)|(1<<MUX1)|(1<<MUX0)|(1<<ADLAR); ADCSRA|=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); // //TIMER DDRB|=(1<<PB3); TCCR2|=(1<<WGM21)|(1<<WGM20)|(1<<COM21)|(1<<CS20); TIMSK|=(1<<TOIE2); //OCR2=100; // sei(); while(1){ //pomiar napiecia na wyjsciu ADCSRA|=(1<<ADSC); while (ADCSRA&(1<<ADSC)); napiecie=ADCH; kanal=1;// zmiana kanalu napomiar napiecia z potenncjometru ADMUX&=(0xE0); ADMUX|=(kanal & 0x0F); //pomiar napiecia zadanego ADCSRA|=(1<<ADSC); while (ADCSRA&(1<<ADSC)); zadane=ADCH; kanal=3;//zmiana kanalu na wyjscie przetwornicy ADMUX&=(0xE0); ADMUX|=(kanal& 0x0F); } } ISR(TIMER2_OVF_vect){ // regulacja pwm // mosfet jest sterowany przez tranzystor bipolarny // gdy na wyjsciu pwm atmegi jest stan niski na bramce //jest stan wysoki if(napiecie>zadane){ if(pwm<255) pwm++; } if(napiecie<zadane){ if(pwm>0) pwm--; } OCR2=pwm; }
  6. Witam, jak osiągnąć maksymalny sampling rate na ADC + DMA? SysClock ustawiony na 72Mhz. APB2CLKDivider i APB1CLKDivider ustawione na 1. ADC leci w ContinuousConvMode = ENABLE i ExternalTrigConv = ADC_SOFTWARE_START; SamplingTime = ADC_SAMPLETIME_13CYCLES_5; DMA zapisuje do bufora[128] z jednego kanału ADC i wysyłam sobie to na ekran co jakiś czas. Oczekuję zapisu badania sygnału do 20kHz, jak na razie nie łapie mi poprawnie nawet sygnału 9kHz, Co tu zrobić, dać zewnętrzny trigger z jakiegoś timera ustawionego na przerwanie co 44.1kHz? Jest to szybsze?
  7. Przetworniki analogowo-cyfrowe i cyfrowo-analgowe, Budujemy własny przetwornik ADC, metoda sukcesywnej aproksymacji - Część 3 W tym artykule poznasz najprostszy przetwornik analogow-cyfrowy, który jest bardzo szybki, ale daje wyniki o dość sporym błędzie, ale o tym w dalszej części artykułu. Ten wpis brał udział konkursie na najlepszy artykuł o elektronice lub programowaniu. Sprawdź wyniki oraz listę wszystkich prac » Partnerem tej edycji konkursu (marzec 2020) był popularny producent obwodów drukowanych, firma PCBWay. Spis treści serii artykułów: Wstęp Budujemy przetwornik cyfrowo-analogowy Budujemy przetwornik analogowo-cyfrowy, metoda sukcesywnej aproksymacji (ten artykuł) 1. Wstęp Przetwornik analogow-cyfrowy (zwany również ADC – Analog Digital Converter) jest układem który zamienia określone napięcie mierzone na ciąg 0 i 1 zwanych postacią binarną / liczbę (wartość cyfrową), proporcjonalną do napięcia mierzonego. W tym artykule poznasz przetwornik ADC który wykonuje pomiary za pomocą metody sukcesywnej aproksymacji (lub inaczej zwana metodą kompensacji wagowej). Wykonuje on odwrotną konwersję w stosunku do przetwornika cyfrowo-analogowego. Nie bez powodu 1 artykułem na temat przetworników był przetwornik cyfrowo-analogowy, gdyż jest on wykorzystywany w przetwornikach analogowo-cyfrowych jako źródło odniesienia. 2. Działanie przetwornika analogowo-cyfrowego. Działanie tego przetwornika polega na równoważeniu napięcia wejściowego z napięciem generowanym za pomocą przetwornika cyfrowo-analogowego, który próbuje kompensować/równoważyć napięcie mierzone. Układ dąży do jak najmniejszej różnicy pomiędzy napięciem mierzonym a generowanym (przez przetworonik cyfrowo-analogowy), tak by różnica Um – Ug = 0. W praktyce nie da się osiągnąć wartości 0 ze względu na skończoną rozdzielczość przetwornika. Schemat blokowy takiego układu wygląda następująco: W tym przetworniku napięcie mierzone jest porównywane z napięciem odniesienia, generowanego przez DAC, zwiększanym kolejno o wartości wagowe Um/2, Um/4, Um/8 itd. Um/n. Jeżeli napięcie wejściowe Uwe jest większe od kolejnych wartości wagowych to dany bit ustawiany jest na 1, w przeciwnym wypadku, gdy napięcie mierzone jest mniejsze od generowanego, to bit ustawiany jest na 0. Poniżej schemat przebiegu procesu przetwarzania. Przykład przebiegu przetwornica przetwornika ADC z sukcesywną aproksymacją. Pozioma linia oznacza poziom napięcia mierzonego. Układ dąży do zrównania się obu lini. 3. Budujemy przetwornik analogowo-cyfrowy z sukcesywną aproksymacją. Jak zostało wspomniane w poprzedniej części kursu, do budowy tego przetwornika wykorzystamy budowany poprzednio przetwornik cyfrowo-analogowy (DAC), do wyjścia którego podłączamy komparator, który będzie porównywał napięcie generowane przez DAC z napięciem mierzonym. W naszym przypadku napięcie mierzone możemy płynnie regulować potencjometrem (zamiast potencjometru możemy podłączyć dowolne źródło napięcia, np. baterię). By zbudować przetwornik ADC 8 bitowy potrzebujemy przetwornika DAC również 8-bitowego. Schemat układu, drabinka rezystorów do układ DAC z poprzedniej części kursu. Po prawej stronie główna część przetwornika ADC. Do komparatora należy podłączyć również zasilanie. Wygląd układu po złożeniu, komparator to LM393N (można zastąpić dowolnym), prezentuje się następująco: Przyszła pora na kod program, który wygląda następująco (nie zapomnij zmierzyć napięcia pomiędzy 5V a GND, tz. Uref i wstawić odpowiedni pin do którego podłączyłeś komparator oraz zmierzone napięcie): #define Uref 4.91 /* napięcie referencyjne/zasilania, należy zmierzyć i zmienić by otrzymać prawidłowe wyniki */ #define komparatorPin 12 /* Przy podłączeniu do innego pinu wyjścia komparatora, należy tu zmienić numer pinu na odpowiedni (nie zalecam pinu 13). */ void setup() { // Zastępuj instrukcje pinMode(An, OUTPUT);, ustawia piny na porcie F jako wyjściowe DDRF = B11111111; // Ustawia wszystkie piny portu F na 0, odpowiada digitalWrite(An, 0); PORTF = B000000; // ustawiamy pin komparatora jako wejście pinMode(komparatorPin, INPUT_PULLUP); Serial.begin(9600); } void loop() { // Czekamy aż zostanie przesłane żądanie z komputera. while (Serial.available() > 0) { Serial.read(); uint8_t wynik = pomiar(); // Wykonujemy pomiar i zapisujemy wynik do zmiennej 8-bitowej Serial.println("Wynik:"); Serial.print("BIN: B"); Serial.println(wynik, BIN); Serial.print("DEC: "); float napiecie = (wynik / 255.0) * Uref; // Wyliczamy napięcie Serial.print(napiecie, 3); // i wypisujemy je na port szeregowy. Serial.println("V \n"); } } uint8_t pomiar(){ uint8_t rejestr = 0; for(int i = 7; i >= 0; i--){ // 8 iteracji petli, przetwornik 8-bitowy rejestr |= (1<<i); // Wstawiamy jedynkę na i-te miejsce. PORTF = rejestr; /* ustawiamy wartość na port F, przez co wszystkie piny zmienią stan w zależności od liczby 8-bitowej, port F to piny od A0 do A7 (A7 najbardziej znaczący bit)*/ delay(2); // Czekamy na ustawienie się napiecia, na przetworniku DAC // Jeżeli wyjście komparatora jest w stanie niskim, if(digitalRead(komparatorPin) == LOW){ rejestr &= ~(1<<i); // to zerujemy wstawioną poprzednio jedynkę na odpowiednim bicie. } } PORTF = rejestr; return rejestr; } 4. Przetestujmy naszym przetwornikiem analogowo-cyfrowym By dokonać pomiaru należy otworzyć monitor portu szeregowego i wysłać dowolny znak do mikrokontrolera, następnie zostanie wyświetlony wynik pomiaru. Wysyłając kilka znaków zostanie wykonane kilka pomiarów, np. wysyłając 3 znaki otrzymamy 3 wyniki. Kod lekko poprawiony, teraz pokazują się 3 miejsca po przecinku, co zwiększa dokładność. Przykład otrzymanych wiadomości, pionowa linia oznacza kilka pomiarów pod rząd (wysłane kilka znaków), Uz to napięcie rzeczywiste zmierzone za pomocą multimetru Pomiar napięcia 2,76V ustawionego za pomocą potencjometru, w wiadomościach wyżej program pokazał napięcie 2,78V. Pomiar napięcia na akumulatorku, podłączamy go do masy (-) i zamiast potencjometru (+). Program pokazał napięcie 1,33V, jednak zachęcam do samodzielnego testu i sprawdzanie wyników z większą liczbą miejsc po przecinku. 5. Zastosowania Przetwornik tego typu jest używany w układach gdzie wymagana jest wysoka szybkość wykonywania pomiarów, ale przez co są one niższej rozdzielczości. Używany w układach gdzie sygnał wejściowy się nie zmienia podczas procesu próbkowania (n cyklowego, n to ilość bitów, tz. rozdzielczość). Można go wykorzystać do budowy układów, gdzie będzie wykonywał wiele pomiarów na sekundę, jednak będą one obarczone dużym błędem. Przetwornik zbudowany na podstawie metody sukcesywnej aproksymacji wykorzystuje się do budowy podstawowych wolnych oscyloskopów, Układ nie nadaje się do budowy typowego oscyloskopu który można kupić w sklepach (przy tego typu konstrukcjach wykorzystuje się przetwornik typu FLASH, który jest niezależny od zmian napięcia mierzonego). 6. Podsumowanie Przetwornik zbudowany na podstawie metody kompensacji wagowej (sukcesywnej aproksymacji) jest prostym do wykonania przetwornikiem który daje w miarę dobre wyniki przy dużej szybkości działać, może wykonywać wiele pomiarów na sekundę. W przetworniku tego typu, należy pilnować by napięcie wejściowe nie uległo zmianie przez cały okres przetwarzania sygnału. Układ nie jest odporny na zmiany napięcia wejściowego i daje błędne wyniki przy tego typu zmianach. W załączniku kod programu wraz ze schematami. plikiADC_sa.rar Spis treści serii artykułów: Wstęp Budujemy przetwornik cyfrowo-analogowy Budujemy przetwornik analogowo-cyfrowy, metoda sukcesywnej aproksymacji (ten artykuł)
  8. Przetworniki analogowo-cyfrowe i cyfrowo-analogowe. Wstęp Ten artykuł jest wstępem teoretycznym do następnych, praktycznych już artykułów na temat przetworników. Tą serię artykułów, należy brać jako ciekawostkę, gdyż układy którymi się posługujemy (mikrokontrolery AVR, Arduino, ARM) posiadają w swojej budowie przetworniki ADC i bardziej rozbudowane modele posiadają również przetwornik DAC. Ta seria ma za zadanie pokazania budowy wewnętrznej przetworników i ich zasady działania. Ten wpis brał udział konkursie na najlepszy artykuł o elektronice lub programowaniu. Sprawdź wyniki oraz listę wszystkich prac » Partnerem tej edycji konkursu (marzec 2020) był popularny producent obwodów drukowanych, firma PCBWay. Spis treści serii artykułów: Wstęp (ten artykuł) Budujemy przetwornik cyfrowo-analogowy Budujemy przetwornik analogowo-cyfrowy, metoda sukcesywnej aproksymacji 1. Czym właściwie jest przetwarzanie sygnałów? W świecie rzeczywistym (analogowy) występuje wiele różnych wielkości fizycznych, takich jak temperatura, wilgotność, napięcie, natężenie prądu, natężenie światła i wiele więcej, natomiast w świecie komputerów (cyfrowym) występują tylko liczby. Do konwersji tych wielkości pomiędzy 2 światami służą przetworniki, odpowiednio: analogowo-cyfrowy (napięcie jest zamieniane na liczbę, w przypadku gdy chcemy zamienić inną wielkość to musimy najpierw ją przekonwertować w napięcie o odpowiednich proporcjach) cyfrowo-analogowy (zamienia liczby w napięcia, a później można zamienić napięcie w inną wielkość fizyczną) Odwrotnością przetwornika analogowo-cyfrowego jest przetwornik cyfrowo-analogowy, który dokonuje odwrotnej konwersji. 2. Rodzaje przetworników. przetwornik analgowo-cyfrowy – zwany ADC (Analog Digital Converter), zamienia sygnały analogowe w ich reprezentację liczbową (cyfrową). przetwornik cyfrowo-analogowy – zwany również DAC (Digital Analog Converter) – zamienia liczby (reprezentacja cyfrowa) w sygnały analogowe (napięcie). Jedyną metodą przetwarzania jest precyzyjna drabinka rezystorów o proporcjach R:2R. (szerzej opisany w artykule nr. 1) Główne metody przetwarzania sygnałów przez przetwornika ADC: porównanie bezpośrednie (zwany również flash) przetwornik z sukcesywną aproksymacją (metoda zwana również jako metoda kompensacji wagowej) – porównuje napięcie z kolejnymi wagami napięcia generowanym przez przetwornik DAC (dokładniej opisany w artykule nr. 2), nie odporny na zmianę napięcia mierzonego (daje błędne wyniki). przetwornik z podwójnym całkowaniem – mierzy czas ładowania kondensatora, napięciem mierzony i rozładowywania napięciem referencyjnym (niestety z powodu braku elementów nie byłem w stanie go szybko zbudować), uśrednia napięcie mierzone (jeżeli się zmienia). Przetwornik ADC w postaci układu scalonego, do budowy oscyloskopu, wykorzystuje metodę sukcesywnej aproksymacji (układ AD7492) Tabela porównująca właściwości przetworników analogowo-cyfrowych: Zależność pomiędzy szybkością wykonywania pomiarów (w samplach na sekundę) a ich rozdzielczością (w bitach). Elipsami oznaczone poszczególne główne metody dla przetworników ADC. Sygnał wejściowy nie jest idealnie przekształcany na sygnał cyfrowy z powodu skończonej ilości porównań sygnału. Porównanie sygnału wejściowego (siwego), z sygnałem cyfrowym (czerwonym). Jak widać sygnał cyfrowy nie pokrywają się idealnie z sygnałem analogowym, ale w miarę możliwości przybliża go. 3. Zastosowania w praktyce przetworników. Oscyloskop, przetwornik ADC z sukcesywną aproksymacją i generator DAC. Mierniki uniwersalne, przetwornik ADC, metoda podwójnego całkowania. Uśrednia wyniki przy zmieniającym się sygnale wejściowym. Przykład wykorzystania w cyfrowym systemach audio, gdzie sygnał analogowy (z mikrofonów i instrumentów) trafia do przetwornika ADC, który przetwarza sygnał wejściowy i przekształca na wersję bitową (cyfrową), na którą można nakładać efekty (jak w komputerze). Następnie sygnał trafia do przetwornika DAC, który generuje sygnał audio z liczb i przez wzmacniacz trafia on do głośników. 4. Podsumowanie Był to krótki wstęp do poszczególnych artykułów pokazujący zależności pomiędzy różnymi metodami przetwarzania przez przetworniki. Do budowy wszystkich przetworników użyję Arduino Mega. Zaznaczam że tą serię należy traktować jako ciekawostkę, gdyż większość mikrokontrolerów posiada wbudowany przetwornik ADC, a przetwornik DAC jest wbudowany w większe układy i jest rzadko używany (głównie do audio). Spis treści serii artykułów: Wstęp (ten artykuł) Budujemy przetwornik cyfrowo-analogowy Budujemy przetwornik analogowo-cyfrowy, metoda sukcesywnej aproksymacji
  9. Jest to mój pierwszy post więc witam wszystkich forumowiczów i proszę o pomoc bo jestem już mocno zdesperowany. Przeszukałem forum i internet ale nie natknąłem się na rozwiązanie mojego problemu. Zbudowałem w oparciu o podróbę Arduino Uno czujnik kąta obrotu zaginarki. Sprawa ma się następująco potencjometr wieloobrotowy, na ekranowanym przewodzie o długości 50cm, w roli dzielnika napięcia za pomocą kół zębatych odczytuje aktualną pozycję i na wyświetlaczu 7segmentowym wyświetla przyporządkowaną wartość kąta. Program się zgadza wszystko działa tak jak zaplanowałem. Problem polega na wartościach przetwornika ADC. Przy podpiętym zasilaniu po USB z laptopa czy komputera wartości przetwornika są w miarę stałe. Natomiast gdy podpinam zasilanie zewnętrzne z zasilacza impulsowego wartości wachają się +/- 4 co sprawia olbrzymi problem. Wykluczam ułożenie kabli ponieważ: przewód USB podpięty pod laptop - wszystko OK, ten sam przewód USB tak samo ułożony podpięty pod zasilacz 5v/power bank daje już spore zakłócenia. Objawy są te same przy wykorzystywaniu regulatora napięcia z płytki czyli podając zasilanie +9v na Arduino. Czy ktoś jest mnie wstanie naprowadzić jak rozwiązać problem a raczej jak stworzyć te same warunki zasilania zewnętrznego co przy zasilaniu z laptopa? Czyżby napięcie zasilania zasilaczy impulsowych +/-5% w ten sposób by się objawiało? Płytka nie jest oryginalna to fakt ale czy oryginalne Arduino w czymś by tu pomogło jeśli po zasilaniu z laptopa wszystko jest OK? W sumie to jestem trochę zdesperowany i jestem wstanie zasilać urządzenie przy pomocy uśpionego laptopa co raczej mija się z celem. 🤣 A może po prostu zamiast zasilacza impulsowego zastosować trafo i wyprostować napięcie? Dziękuje za zainteresowanie i proszę o jakieś podpowiedzi rozwiązania problemu.
  10. Witam, Po inicjacji Timera, ADC przestaje działać. Przed, oraz w trakcie inicjacji wszystko działa jak należy, co sprawdziłem pułapkami programowymi w postaci funkcji LED() (na piny ADC0-2 podpięte są przez przyciski dzielniki napięć które na wyjściu dają połowę napięcia). Wszystko przestaje działać po włączeniu przerwania Compare Match Timera 1. Początkowo myślałem, że problem tkwi w tym, że program wychodząc z jednego przerwania wchodzi od razu w drugie, jednak dioda po zainicjowanym timerze wciąż świeci połową jasności, po prostu już nie gaśnie. Czy przerwania ADC i timera się w jakiś sposób gryzą? Lub ma ktoś jakiś inny pomysł w czym może tkwić problem? Kod: #include <stdlib.h> #include <avr/io.h> #include <avr/interrupt.h> #include <avr/pgmspace.h> #include <util/atomic.h> #include <util/delay.h> volatile int adc; volatile int MUX_tmp; volatile char adc_arr[3]; void ADC_init(void) { ADMUX|= ( _BV(REFS0) ); ADCSRA|= ( _BV(ADEN) | _BV(ADIE) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0)); DIDR0 |= 0x3F; } void LED(void) { while(adc<=300) { PORTB|=_BV(PB0); PORTB=0; } while(adc>=500){}; PORTB=0; } void Timer_init(void) { TCCR0A|= (_BV(COM0A1) | _BV(COM0B1) | _BV(WGM00) | _BV(WGM01)); LED(); _delay_ms(32); TCCR0B|= (_BV(CS00)); LED(); _delay_ms(32); TCCR1B|= (_BV(WGM12) | _BV(CS10)); LED(); _delay_ms(32); OCR1AH|= 0b1001000; LED(); _delay_ms(32); TIMSK1|= _BV(OCIE1A); LED(); _delay_ms(32); } ISR(ADC_vect) { adc=ADC; MUX_tmp=ADMUX & 0xF; adc_arr[MUX_tmp]=adc; if(MUX_tmp <= 3) { ADMUX=(MUX_tmp+1) | _BV(REFS0); MUX_tmp= ADMUX & 0xF; } else { ADMUX=_BV(REFS0); } ADCSRA|= _BV(ADSC); } volatile int Flag=0; ISR(TIMER1_COMPA_vect) { Flag=1; } int main(void) { sei(); ADC_init(); ADCSRA|= _BV(ADSC); DDRB|= _BV(PB0); LED(); _delay_ms(32); LED(); _delay_ms(32); Timer_init(); LED(); _delay_ms(32); while(1); { LED(); _delay_ms(32); } } Nie widzę potrzeby w wrzucaniu schematu, do PB0 podłączona jest dioda, do pinów ADC wspomniałem wcześniej a reszta mikrokontrolera podłączona jest prawidłowo. Z góry dziękuję za odpowiedź 🙂 Pozdrawiam Ps: Jest to wycinek programu, więc niektóre zmienne mogą zdawać się bezużyteczne (jak np int Flag)
  11. Dzień dobry, Pojawił się u mnie niedawno problem, uruchomiłem dwa wejścia ADC z pomocą DMA - podłączyłem do nich zwykłe potencjometry, działały one poprawnie lecz przy grzebaniu w hardware mogłem podpiąć napięcie wyższe niż 3,3 V i nagle przetworniki pokazują jedynie maksymalną wartość, a gdy zamienię kable zasilające potencjometr to pokazują wartość minimalną. Czy jest to możliwe, że załatwiłem tym sposobem przetwornik ADC? napięcie mogło wynosić około 3,5 V, potencjometry działają poprawnie. Korzystam z płytki rozwojowej STM32F103C8T6, załączam dodatkowo rysunek z połączeniem potencjometrów oraz projekt CubeIDE asdas.rar
  12. Dzień dobry, Korzystam z STM32F103C8, oprogramowanie CUBEIDE, debugowanie st-link v2. Problem polega na tym, że dobrze działające DMA w circular mode zawiesza program gdy dodaję do niego 4 linie obliczeń (sinusy, cosinusy, arcusy), #include <math.h> wpisałem. obliczenia z wyłączoną konwersją również wykonują się poprawnie /* USER CODE BEGIN 0 */ void set_coordinate (void) { ST=hour+(4*(18-15)); D = 23.45f*sinf(360*((284.f+day_of_year)/365)*rad)*rad;//////////////////////////////////blad Height = asinf(sinf(D)*sinf(W)+cosf(D)*cosf(W)*cosf((15*(hour-12))*rad))*rad;// nie dochodzi do tych obliczen A = acosf((sinf(D)-sinf(Height)*sinf(W))/(cosf(Height)*cosf(W)))*deg; H=Height*deg; } /* USER CODE BEGIN 2 */ HAL_ADC_Start_DMA(&hadc1, adc_val, 4); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ // set_coordinate(); motor_rad_1 = adc_val[0]/13.65;//podzielic przez zakres 4095/300 stopni motor_rad_2 = adc_val[1]/13.65; } /* USER CODE END 3 */ } hadc1.Instance = ADC1; hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE; hadc1.Init.ContinuousConvMode = ENABLE; hadc1.Init.DiscontinuousConvMode = DISABLE; hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc1.Init.NbrOfConversion = 4; if (HAL_ADC_Init(&hadc1) != HAL_OK) { Error_Handler(); } /** Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_1; sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN ADC1_Init 2 */ /* USER CODE END ADC1_Init 2 */ } /* Enable DMA controller clock */ static void MX_DMA_Init(void) { /* DMA controller clock enable */ __HAL_RCC_DMA1_CLK_ENABLE(); /* DMA interrupt init */ /* DMA1_Channel1_IRQn interrupt configuration */ HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); } Z kodu wyciąłem tylko najważniejsze rzeczy, mogę zamieścić dodatkowo screeny z konfiguracji ADC,DMA Nie wyskakuje żaden błąd, tylko program zawiesza się na liniach obliczeń. Dlaczego obliczenia zawieszają program? Czy to nie jest tak, że DMA nie korzysta z procesora? Moim pomysłem byłoby zastosowanie wyzwalania konwersji przez licznik, wykonywanie jej co 200 ms, ale nie wiem, czy ma to sens, drugim pomysłem jest odczyt ADC zaraz po obliczeniach, ale nie mam pojęcia jak się do tego zabrać. z góry dziękuję za odpowiedź
  13. Aktualnie pracuję nad tym kursem: https://forbot.pl/blog/kurs-stm32-f4-5-pomiar-napiecia-adc-dma-stmstudio-id13099 tylko na plytce stm32f303re Znalazłem w dokumentacji mikrokontrolera dane do przeliczania wyniku na stopnie celsjusza, nie wiem czy błąd jest w danych czy w czymś innym ale temperatura znacznie odbiega od tej jaka powinna wyjść według kursu. U mnie jest 40 stopni zas wedlug kursu powinna byc chyba zblizona do temperatury otoczenia. Czy ktos moze mi sprawdzic czy znalazlem poprawne dane i napisalem dobrze kod? Największe wątpliwości mam co do maksymalnego napiecia zasilania. Poniżej zamieszczam screeny ze znalezionymi danymi oraz kod.
×
×
  • 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.