uint32_t uid1 = ((uint32_t *)UID_BASE)[0];
uint32_t uid2 = ((uint32_t *)UID_BASE)[1];
uint16_t flashSizeInkB = ((uint16_t *)FLASHSIZE_BASE)[0];
uint16_t cpuSignature = ((DBGMCU->IDCODE >> 16) & 0x0000FFFF);
strona prywatna
Mikroprocesory, tranzystory, wysokie napięcie, zdalne sterowanie, pomiary – to jest to!
uint32_t uid1 = ((uint32_t *)UID_BASE)[0];
uint32_t uid2 = ((uint32_t *)UID_BASE)[1];
uint16_t flashSizeInkB = ((uint16_t *)FLASHSIZE_BASE)[0];
uint16_t cpuSignature = ((DBGMCU->IDCODE >> 16) & 0x0000FFFF);
Przetwornica MCP16251/2 pozwala na realizację zasilania z jednego ogniwa AA/AAA, ponieważ zaczyna pracować już przy napięciu 0.9 V. Zrealizowałem układ dający na wyjściu 3,3 V:
Karta katalogowa deklaruje pobór prądu bez obciążenia nie większy niż 25 uA (typowo 14 uA).
Uzyskane przeze mnie wyniki:
Vin = 1,328 V | I = 17,8 uA |
Vin = 1,610 V | I = 14,0 uA |
Wyniki zgadzają się z dokumentacją, co oznacza że nie kłamie ona oraz że nie popełniłem znaczących błędów w wykonaniu prototypu.
Pobór prądu na poziomie 25 uA oznacza, iż jedno ogniwo alkaliczne R6/AA o pojemności 2500 mAh (przyjęte na podstawie karty katalogowej Duracell MN1500) wystarczy do podtrzymania życia przetwornicy przez teoretycznie 11 lat (4 lata dla ogniwa AAA o pojemności 1000 mAh). Ponieważ inne procesy, takie jak samorozładowanie ogniwa i korozja skrócą ten czas znaczniej, takim poborem prądu nie trzeba się przejmować.
Wykonałem pomiar impedancji przetwornika piezoakustycznego PCA-4B wykorzystując następujący układ:
Pomiar był wykonywany dla częstotliwości ok. 3,5 KHz, ponieważ taką deklaruje producent jako rezonansową. Ustawiałem potencjometr tak, aby amplituda sygnału na kanale CH2 była równa połowie amplitudy na kanale CH1 (wejściowej). Następnie rozłączyłem układ i odczytałem wartość potencjometru. Wyszło 750 Ω. Przesunięcie fazowe wyniosło 53 stopnie (napięcie na CH2 „opóźnione”). Pomiar multimetrem pojemności membrany dał wynik 90 nF – tak jak w dokumentacji.
Reaktancja kondensatora 90 nF dla częstotliwości 3,5 kHz to 500 Ω. To oznaczałoby, że układ można modelować jako szeregowo połączony kondensator 90 nF oraz rezystor 560 Ω. Dlaczego 560? Bo moduł impedancji to 750 Ω, a reaktancja to 500 Ω. Więc rezystancję należy policzyć z równania pitagorasa sqrt(750^2 – 500^2) = 560? Chyba, już nie pamiętam z teorii obwodów.
Układ logiczny zabezpiecza przed aktywacją obydwu wyjść. Jedynie jedno wyjście jest możliwe do pobudzenia w danym momencie. Stan wysoki na obydwu wejściach zeruje obydwa wyjścia.
Układ można rozbudować dla n wejść i m wyjść stosując m bramek AND n-wejściowych.
Nie trzeba używać bramek AND gdy dane wyjścia nie są potrzebne.
Przykład zastosowania: sterowanie stycznikami silnika przyciskami przód/tył – zabezpieczenie przed jednoczesnym naciśnięciem dwóch przycisków naraz.
Szum rezystora 1kΩ to 4 nV/√Hz. Dla rezystorów o innej wartości wyliczamy pierwiastek rezystancji i odnosimy do tego. Np. dla 100kΩ to będzie √100 = 10 ⋅ 4 nV/√Hz = 40 nV/√Hz. To oczywiście przybliżenie dla normalnej temperatury itp.
Szumy dodaje się nie bezpośrednio, a dodając ich kwadraty i pierwiastkując całość (jak moduł wektora).
Wzmacniacz operacyjny w konfiguracji nieodwracającej / odwracającej.
Szum rezystora w pętli sprzężenia (podłączonego do wyjścia wzm. op.) wchodzi bezpośrednio w skład szumu wyjściowego. Szum drugiego rezystora (podłączonego do masy i wejścia wzm. op.) musimy pomnożyć przez wzmocnienie układu.
Szum napięciowy wzmacniacza z karty katalogowej mnoży się przez wzmocnienie układu.
Szum prądowy wzmacniacza przeliczamy na napięcie odłożone na równoległych obu rezystorach, następnie mnożymy przez wzmocnienie układu.
(https://www.researchgate.net/figure/Example-non-inverting-Op-Amp-circuit_fig3_283082955)
Dane:
Składowe szumu wyjściowego:
Suma: √(40²+404²+2828²+0.06²) = 2857 nV/√Hz. Wyznaczyliśmy szum wyjściowy. Szum wejściowy wyznaczymy dzieląc przez wzmocnienie, czyli 2857 nV/√Hz / 101 = 28.3 nV/√Hz.
Jak widać, na poziom szumu w tym układzie główny wpływ ma szum napięciowy wzmacniacza. MCP6002 nie jest wzmacniaczem niskoszumnym, a low-power. Możnaby jeszcze dwukrotnie zwiększyć rezystory R1 i R2, co niewiele pogorszy charakterystykę szumową, a zmniejszy pobór prądu. Przy projektowaniu wzmacniaczy niskoszumnych należy wybrać odpowiednie układy, oraz stosować mniejsze rezystancje w układzie, aby nie pogarszać parametrów wzmacniacza.
Czujnik temperatury TC77 z interfejsem SPI.
https://www.microchip.com/wwwproducts/en/TC77
https://ww1.microchip.com/downloads/en/DeviceDoc/20092B.pdf
1. Odczytujemy 2 bajty po SPI w mode 0, MSB first.
Dla STM32 zrealizuje to taki kod:
uint8_t data[2]; HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, GPIO_PIN_RESET); HAL_SPI_Receive(&hspi1, data, 2, 100); HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, GPIO_PIN_SET);
2. Ponieważ w 16 bitach danych temperatura jest zakodowana na 13 bitach w kodzie U2, musimy inaczej postąpić dla wartości ujemnych oraz dodatnich. Użyjemy zmiennej pomocniczej t, która przechowa wartość całkowitą.
uint8_t sign = data[1] & 0x80; int t; if(sign == 0) t = (((data[1]<<8)|data[0]) >> 3); else t = (((data[1] & 0x7f)<<8 | data[0]) >> 3) - 4096;
Konwersja odczytanej liczby na rzeczywistą wartość temperatury:
float temperatura = 0.0; if(data[0] & (1<<2)) temperatura = 0.0625 * t ; printf("T = %.1f *C \r\n", temperatura);
Drugi najmłodszy bit (licząc od zera) wskazuje, czy odczytana wartość jest po prawidłowej konwersji temperatury.
Uwaga! Program na mikrokontrolerze nie będzie pracował poza sesją debugowania!
1.w main.c
/* USER CODE BEGIN Includes */ #include <string.h> #include <stdio.h> /* USER CODE END Includes */
2.w main.c
/* USER CODE BEGIN PFP */ extern void initialise_monitor_handles(void);
3. Project -> Properties -> C/C++ General -> Paths and Symbols -> Source Location -> /[nazwa projektu]/Core -> Edit Filter -> Src/syscalls.c
4. Project -> Properties -> C/C++ Build -> Settings -> Tool Settings -> MCU GCC Linker -> Libraries
Libraries: rdimon
5. Project -> Properties -> C/C++ Build -> Settings -> Tool Settings -> MCU GCC Linker -> Miscellaneous
Other flags: -specs=rdimon.specs
6. Run -> Debug Configurations… -> Debugger
7. Run -> Debug Configurations… -> Startup
Initialization Commands: monitor arm semihosting enable
8. w main.c w main():
/* USER CODE BEGIN 1 */ initialise_monitor_handles();
Gotowe. Teraz umieszczając w kodzie printf() wyjście pojawi się w konsoli debuggera.
Źródło: https://www.youtube.com/watch?v=V16v9O5USF4
Moduł zakupiony na Aliexpress: D1 mini ESP32 ESP-32 WiFi+Bluetooth Internet of Things development board based ESP8266 Fully functional
Proste programy działały, aż do momentu użycia Bluetooth / Wifi – następował reset Brownout detector:
Po krótkich poszukiwaniach w internecie, okazało się że podejrzanym może być regulator napięcia: https://www.reddit.com/r/esp8266/comments/9itox8/survey_did_you_get_a_150ma_regulator_on_your/
Strona https://www.esp32.com/viewtopic.php?t=2662 podaje, jaki jest pobór prądu przez ESP32:
SCENARIO—————————CPU80MHz—-CPU160MHz—-CPU240MHz
– CPU + ELECTRONICS + BT———–113mA——-123mA——–141mA
– CPU + ELECTRONICS—————-38mA——–51mA ——–73mA
– CPU (deep sleep) + ELECTRONICS—3.5mA——-3.5mA——–3.5mA
Na płytce znajdował się układ w obudowie SOT23-5 i oznaczeniu 4B2X.
Jeżeli jego wydajność prądowa to 150mA, to można postawić tezę, iż nie daje on rady. Wykonany został zatem pomiar napięcia wyjściowego stabilizatora w układzie z ESP32, który próbował uruchomić Wifi:
Widać spadek napięcia z 3,3 V do ok. 2,4 V, czyli o 0, 7 V. Ponowny wzrost napięcia spowodowany jest resetem ESP32.
Stabilizator został wymieniony na MIC5504-3.3YM5, o gwarantowanej wydajności prądowej 300 mA. Układ wyprowadzeń zgadzał się.
Po wymianie układu resety nie następowały. Tak prezentuje się pomiar po:
Tutaj również widać spadki napięć, jednak nigdy nie są poniżej 2,8 V. Możliwe, że brakuje kondensatora na wejściu układu. Mimo wszystko, problem wydaje się być rozwiązany.