Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

stm32f103 pomiar napięcia zasilania, detekcja wyłączenia

norbis15 10 Lut 2018 19:12 735 14
  • #1 10 Lut 2018 19:12
    norbis15
    Poziom 14  

    Witam,
    Stanąłem pod sianą . Muszę dorobić do urządzenia coś takiego jak monitor zasilania, tak by zapisywać flash tylko w momencie wyłączania urządzenia. Do tej pory zapis flash wykonywał się w pętli, ale pamięć flash ma ograniczoną ilość cykli zapisu. Nie mogę już nic zmienić w hardware, podłączenie czegokolwiek do ADC-ka nie jest już możliwe. Czy można jakoś wyłuskać z procesora informację, że napięcie zasilania spadło poniżej np 3V? Vref podłączony jest bezpośrednio do napięcia zasilania procesora.

    Na zdjęciu podłączenie nóżek zasilających:
    stm32f103 pomiar napięcia zasilania, detekcja wyłączenia

    0 14
  • #2 10 Lut 2018 19:21
    BlueDraco
    Specjalista - Mikrokontrolery

    Z F103 trochę trudno, ale jeśli wymienisz uC na nowszy (a nogami na ogół są zgodne, więc często da się to zrobić bez modyfikacji płytki), to masz na to przynajmniej dwa sposoby - PVD lub pomiar wewnętrznego napięcia odniesienia.

    0
  • #3 10 Lut 2018 19:35
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Poradę powyżej zignoruj.

    Możesz mierzyć wartość VREFINT, który jest dostępny na kanale 17. Jest to wewnętrzne napięcie odniesienia o wartości 1.2 V. Możesz go użyć do określenia że napięcie zasilania układu spada. Jeśli układ jest zasilany normalnie z 3.3 V, to powinieneś na tym kanale zmierzyć wartość około 1490 (4095 * 1.2 / 3.3). Jeśli napięcie zasilania zacznie spadać, to wartość którą tam mierzysz zacznie rosnąć - np. dla 3 V będziesz miał już ~1640. Jeśli dodasz do tego funkcjonalność "analog watchdog", to nawet będziesz miał przerwanie dopiero jak to napięcie zacznie spadać, bez potrzeby ciągłego sprawdzania.

    Możesz również użyć PVD, które oczywiście w STM32F103 również jest dostępne i generuje przerwanie gdy napięcie spadnie poniżej ustalonego poziomu.

    1
  • #4 10 Lut 2018 20:33
    BlueDraco
    Specjalista - Mikrokontrolery

    Ano racja, nawet F103 ma REFINT, chociaż poza jednym akapitem w RefMan o nim zapomnieli. Zapomnieli zresztą również napomknąć, że istnieją kanały 16 i 17. Ciekawostka.

    0
  • #5 10 Lut 2018 21:03
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Taaaaak...

    Pierwszy akapit of ADC:

    Cytat:
    It has up to 18 multiplexed channels allowing it measure signals from 16 external and two internal sources.


    VREFINT i czujnik temperatury widoczne na każdym obrazku pokazującym całe ADC lub multiplexer.

    Dwie strony dalej:
    Cytat:
    Temperature sensor/V REFINT internal channels
    The Temperature sensor is connected to channel ADCx_IN16 and the internal reference
    voltage V REFINT is connected to ADCx_IN17. These two internal channels can be selected
    and converted as injected or regular channels.


    Opis rejestrów SQR:
    Cytat:
    Bits 19:15 SQ16[4:0]: 16th conversion in regular sequence
    These bits are written by software with the channel number (0..17) assigned as the 16th in
    the conversion sequence.


    Tak więc faktycznie - istnienie 18 kanałów i VREFINT to najpilniej strzeżony sekret rodziny STM32F1.

    0
  • #6 10 Lut 2018 22:49
    BlueDraco
    Specjalista - Mikrokontrolery

    Table 65
    ADCx_IN[15:0]

    11.3.3
    There are 16 multiplexed channels.

    Dopiero na następnej stronie nieśmiała wzmianka, że jednak nie 16, a 18. Przyznasz, że ciut się to różni od tego, co mamy w RefMan do innych modeli?

    0
  • #7 10 Lut 2018 23:05
    Freddie Chopin
    Specjalista - Mikrokontrolery

    OK, pogrążaj się dalej.

    BlueDraco napisał:
    Table 65
    ADCx_IN[15:0]

    Opis nad tabelką, który (przypadkiem?) pominąłeś - "ADC pins". Chyba logiczne, że wewnętrzne sygnały nie będą opisane w tabelce z zewnętrznymi pinami?

    BlueDraco napisał:
    11.3.3
    There are 16 multiplexed channels.

    Ponownie wszystko się zgadza - fizyczny ADC który jest w środku ma jedynie 16 kanałów. Do tych 16 kanałów możesz sobie zmultiplexować, w dowolnej kolejności i dowolną ilość razy - dowolne z 18tu sygnałów podłączonych do multiplexera. Polecam obejrzenie i zrozumienie obrazka "Figure 22. Single ADC block diagram".

    BlueDraco napisał:
    Przyznasz, że ciut się to różni od tego, co mamy w RefMan do innych modeli?

    W ogóle się nie różni. Te dwa fragmenty do których się odniosłeś w takim manualu do STM32F407 są wręcz identyczne:

    Table 65. ADC pins
    ADCx_IN[15:0] Analog input signals 16 analog input channels

    13.3.3
    Channel selection
    There are 16 multiplexed channels.

    Identycznie jest też dla STM32F7.

    Dla STM32F0 opis jest inny w tym drugim przypadku, a mianowicie:

    12.4.5
    Channel selection (CHSEL, SCANDIR)
    There are up to 18 multiplexed channels

    Powody są co najmniej dwa:
    1. Przetwornik który jest w STM32F0 po prostu ma 18 kanałów (te z STM32F1 i F4 mają ich 16).
    2. W STM32F0 jest zupełnie inna implementacja ADC niż w F1 i F4.

    0
  • #8 10 Lut 2018 23:41
    BlueDraco
    Specjalista - Mikrokontrolery

    Freddie: w przeciwieństwie do Ciebie, ja nie jestem nieomylny. Tak się składa, że na F1 i F4 zrobiłem po 2 projekty (na F1 bez ADC), a na F0 i L4 pewnie ponad 50. Domyślałem się, że VREF wygląda podobnie wszędzie, zajrzałem do RefMan F103 i nie zauważyłem VREF, co mnie z lekka zdziwiło. Fakt, jest, ale dość skutecznie schowane.

    Czy już wystarczająco się dowartościowałeś?

    0
  • #9 11 Lut 2018 19:45
    norbis15
    Poziom 14  

    Przetestowałem PVD i ANALOGWATCHDOG.

    -PVD przy skonfigurowaniu na przerwanie przy 2,9 V generuje je dopiero przy ok 2,5 V.

    -ANALOGWATCHDOG rzeczywiście dobrze działa. Ustawiłem go tak by generował przerwanie przy ok 3 V.

    Niestety nie rozwiązało to mojego problemu, gdyż jak zmierzyłem czas potrzebne do zapisania całej strony flash (1 kB) to potrzebuje ok 30 ms, a po wyłączeniu urządzenia napięcie zasilania spada do 0 V po ok 15-20 ms.

    Jest jakieś inne obejście problemu ograniczonej liczby cykli zapisu flash?

    0
  • #10 11 Lut 2018 19:49
    Freddie Chopin
    Specjalista - Mikrokontrolery

    norbis15 napisał:
    Jest jakieś inne obejście problemu ograniczonej liczby cykli zapisu flash?

    Można zapisywać mniej informacji i używać emulacji EEPROMu. Jeśli jednak masz do zapisania "dużo", to nic nie zmienisz.

    norbis15 napisał:
    Niestety nie rozwiązało to mojego problemu, gdyż jak zmierzyłem czas potrzebne do zapisania całej strony flash (1 kB) to potrzebuje ok 30 ms, a po wyłączeniu urządzenia napięcie zasilania spada do 0 V po ok 15-20 ms.

    Prędkość spadku napięcia zależy odczywiście od poboru i od pojemności w układzie. Zależnie od Twoich ograniczeń technicznych możesz więc:
    1. dołożyć do układu duży kondensator elektrolityczny
    2. zmniejszyć pobór prądu - po wykryciu zaniku zasilania wyłączasz wszystko co nie jest potrzebne, ustawiasz wolniejszy zegar, przestawiasz wszystkie piny w tryb hi-z, wyłączasz układy zewnętrzne, ...

    0
  • #11 11 Lut 2018 22:43
    QuadMan
    Poziom 13  

    Witam,

    norbis15 napisał:
    ... Jest jakieś inne obejście problemu ograniczonej liczby cykli zapisu flash?


    A co konkretnie musisz tek często zapisywać do tego FLASH-a, jeśli to nie tajemnica?

    Bo być może trzeba po prostu zmienić podejście do problemu?

    Pozdrawiam, QuadMan.

    0
  • #12 12 Lut 2018 19:00
    norbis15
    Poziom 14  

    W urządzeniu mam zaimplementowanego modbusa i 266 rejestrów 16-bitowych których wartość musi być pamiętana po zaniku zasilania. Teraz po każdej komendzie zapisu do tej przestrzeni wymazuje stronę flash i uaktualniam ją. Sytuacja jest niebezpieczna gdy ktoś będzie chciał w pętli zapisywać te rejestry.

    0
  • #13 12 Lut 2018 20:46
    QuadMan
    Poziom 13  

    Witam.

    Przy takim podejściu, zmiana któregokolwiek z rejestrów implikuje konieczność kasowania całej strony i zapisywania wszystkiego "od nowa", nawet jeśli ktoś chce zmienić zawartość tylko jednego rejestru. Nie lepiej było by zastosować emulator EEPROM-a we Flash-u? Będziesz przy okazji miał "wear living", więc jeśli to sensownie zorganizujesz, to masz wielokrotnie większą trwałość Flasha. Dodatkowo, możesz zaimplementować prosty mechanizm, sprawdzający przed zapisem danego rejestru, czy dana uległa zmianie i pewnie okaże się, że w ogóle nie musisz niczego zapisywać po zaniku zasilania.

    Pozdrawiam, QuadMan.

    0
  • #14 12 Lut 2018 21:18
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Przy emulacji EEPROMu wymagane są minimum 2 strony, ale nic nie stoi na przeszkodzie abyś użył ich więcej. Wtedy Twoja dopuszczalna ilość zapisów znacząco rośnie. Wszystko oczywiście ma swoje granice i przy takich założeniach jak poświęcisz na emulację EEPROMu 100 kB flasha, to tak czy siak kiedyś wytrzymałość się skończy. Czy to "kiedyś" jest wystarczająco odległe w czasie to już musisz niestety ocenić sam...

    0
  • #15 12 Lut 2018 22:41
    QuadMan
    Poziom 13  

    Freddie, właśnie to miałem na myśli. Co prawda Autor podał tu trochę mało danych, ale nieprawdopodobnym wydaje mi się scenariusz, żeby użytkownik "pisał bez opamiętania" stale po tych rejestrach w pętli. Dodatkowo, nawet gdyby założyć taki scenariusz, to w sumie można się i przed tym zabezpieczyć, ot choćby w ten sposób, że zapis zmian następuje po jakimś czasie od ich zakończenia.
    Ja jakoś nie bardzo "lubię" zapisy do pamięci nieulotnych w trakcie zaniku zasilania. W moich urządzeniach mam zwykle do czynienia z obciążeniami o charakterze indukcyjnym, które w stanach nieustalonych potrafią generować sporo zakłóceń i z tymi zapisami bywa... różnie ;-).

    0