Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2019:accu-monitor

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revize Předchozí verze
Následující verze
Předchozí verze
2019:accu-monitor [2020/01/19 01:25]
Milan Ambrož [Firmware]
2019:accu-monitor [2020/01/19 22:17] (aktuální)
Milan Ambrož [Závěr]
Řádek 15: Řádek 15:
 Při návrhu bylo dbáno na maximální využití potenciálu zařízení,​ proto je zde možnost osadit deset analogových vstupů, komunikaci pomocí sběrnice RS485 a napájení i komunikace jsou galvanicky odděleny. Při návrhu bylo dbáno na maximální využití potenciálu zařízení,​ proto je zde možnost osadit deset analogových vstupů, komunikaci pomocí sběrnice RS485 a napájení i komunikace jsou galvanicky odděleny.
  
-Software je navrhnut pro základní měření akumulátorů,​ viz zadání, kdy změřená napětí se odesílají po přijetí definovaného ​znaku.+Software je navrhnut pro základní měření akumulátorů,​ viz zadání, kdy změřená napětí se odesílají po přijetí definovaného ​slova. Původní návrh odesílání pomocí impulzu byl vylepšen zejména z důvodu, že je možné poté vyčíst vícero hodnot včetně surových dat.
  
  
Řádek 23: Řádek 23:
 Napájení je řešeno pomocí izolovaného zdroje z 12V na 5V. Napětí 5V je následně vyfiltrováno a stabilizováno lineárním stabilizátorem na 3,3V, kterým se dále napájí mikroprocesor. Toto řešení odstraňuje problém vzniku zemní smyčky mezi GND napájení a GND měřených akumulátorů. Napájení je řešeno pomocí izolovaného zdroje z 12V na 5V. Napětí 5V je následně vyfiltrováno a stabilizováno lineárním stabilizátorem na 3,3V, kterým se dále napájí mikroprocesor. Toto řešení odstraňuje problém vzniku zemní smyčky mezi GND napájení a GND měřených akumulátorů.
  
-Komunikace je připravena pro montáž převodkíku ​UART- RS485, který není nutné osazovat. Toto bylo zvoleno z důvodu, kdyby bylo potřeba komunikovat po této sběrnici.+Komunikace je připravena pro montáž převodníku ​UART- RS485, který není nutné osazovat. Toto bylo zvoleno z důvodu, kdyby bylo potřeba komunikovat po této sběrnici.
 Rovněž je UART opticky oddělen pomocí dvojitých digitálních optočlenů,​ které umožnují jak 3,3V logickou úroveň, tak 5V. Rovněž je UART opticky oddělen pomocí dvojitých digitálních optočlenů,​ které umožnují jak 3,3V logickou úroveň, tak 5V.
  
Řádek 30: Řádek 30:
 Protože mikroprocesor zvládne měřit pouze napětí do velikosti napájecího (3,3V). z tohoto důvodu jsou zařazeny před jednotlivé vstupy děliče napětí. Tyto děliče je potřeba vypočítat pro maximální hladinu napětí, které budeme měřit. Zároveň je třeba brát v potaz rozlišení AD převodníku,​ 12 bitů, nebo taktéž 4096 stavů. Protože mikroprocesor zvládne měřit pouze napětí do velikosti napájecího (3,3V). z tohoto důvodu jsou zařazeny před jednotlivé vstupy děliče napětí. Tyto děliče je potřeba vypočítat pro maximální hladinu napětí, které budeme měřit. Zároveň je třeba brát v potaz rozlišení AD převodníku,​ 12 bitů, nebo taktéž 4096 stavů.
  
-Při výpočtu děliče je důležité brát v potaz maximální impedanci děliče z pohledu analogového vstupu. U tohoto mikroprocesoru,​ kde je AD převodník vybavený vzorkovacím kondenzátorem je impedance závislá na vzorkovací frekvenci. Pro nejpomalejší vzorkování mi bylo doporučeno použít rezistor 33k.+Při výpočtu děliče je důležité brát v potaz maximální impedanci děliče z pohledu analogového vstupu. U tohoto mikroprocesoru,​ kde je AD převodník vybavený vzorkovacím kondenzátorem je impedance závislá na vzorkovací frekvenci. Pro nejpomalejší vzorkování mi bylo doporučeno použít rezistor 33k. Dále je tento rezistor blokován kondenzíátorem,​ což opět snižuje impedanci v případě vzorkování.
  
 Pro rezistor 33k a maximálnímu měřenému napětí 3,3V odpovídá poměr 10k na 1V. Pokud vybereme tedy druhý rezistor děliče 560k, máme na něm úbytek 56V. Celkem tedy 59,3V. Toto je napětí, které lze maximálně měřit a odpovídá to napětí 14,825V na jeden akumulátor,​ což je příliš vysoké napětí. Maximální provozní napětí akumulátoru je 14,4V, což odpovídá při čtyřech zapojených v sérii 57,6V. Pro rezistor 33k a maximálnímu měřenému napětí 3,3V odpovídá poměr 10k na 1V. Pokud vybereme tedy druhý rezistor děliče 560k, máme na něm úbytek 56V. Celkem tedy 59,3V. Toto je napětí, které lze maximálně měřit a odpovídá to napětí 14,825V na jeden akumulátor,​ což je příliš vysoké napětí. Maximální provozní napětí akumulátoru je 14,4V, což odpovídá při čtyřech zapojených v sérii 57,6V.
  
-Maximální rozlišení poté bude 59,3V / 4094 = 14,5mV. Toto rozlišení plně postačuje pro monitoring olověného akumulátoru,​ kde postačí měření na stovky milivoltů.+Maximální rozlišení poté bude 59,3V / 4096 = 14,5mV. Toto rozlišení plně postačuje pro monitoring olověného akumulátoru,​ kde postačí měření na stovky milivoltů.
  
 Hodnota filtračních kondenzátorů pro napěťové děliče je možná příliš vysoká, ale vzhledem ke kapacitě měřených akumulátorů (200Ah) nevadí velké zpoždění reakce na změnu. Kapacita byla zvolena jednotná pro celé zapojení Hodnota filtračních kondenzátorů pro napěťové děliče je možná příliš vysoká, ale vzhledem ke kapacitě měřených akumulátorů (200Ah) nevadí velké zpoždění reakce na změnu. Kapacita byla zvolena jednotná pro celé zapojení
Řádek 67: Řádek 67:
  
  
-= změření napětí akumulátorů =+== změření napětí akumulátorů ​==
 Pokud do zařízení odešleme příkaz "​aku",​ okamžitě nám odpoví mikroprocesor výpisem hodnot napětí jednotlivých akumulátorů v milivoltech s jedním desetinným místem. Před hodnotou je uvedeno, o který akumulátor se jedná. Poslední dva vstupy se taktéž odesílají. Pokud do zařízení odešleme příkaz "​aku",​ okamžitě nám odpoví mikroprocesor výpisem hodnot napětí jednotlivých akumulátorů v milivoltech s jedním desetinným místem. Před hodnotou je uvedeno, o který akumulátor se jedná. Poslední dva vstupy se taktéž odesílají.
 +{{ :​2019:​monitor_pb:​aku.jpg?​nolink&​100 |}}
  
- +== změření napětí vstupů ​==
-= změření napětí vstupů =+
 Příkazem "​voltage"​ naopak vyžádáme zaslání jednotlivých napětí, které mikroprocesor měří na daných deseti vstupech v milivoltech s jedním desetinným místem Příkazem "​voltage"​ naopak vyžádáme zaslání jednotlivých napětí, které mikroprocesor měří na daných deseti vstupech v milivoltech s jedním desetinným místem
 +{{ :​2019:​monitor_pb:​voltage.jpg?​nolink&​100 |}}
  
- +== vyčtení hodnot AD převodníku ​==
-= vyčtení hodnot AD převodníku =+
 Posledním příkazem je "​adcvalues"​. Tento příkaz je následován odesláním surových nezpracovaných dat AD převodníku a kalibrační konstantou napěťové reference. Posledním příkazem je "​adcvalues"​. Tento příkaz je následován odesláním surových nezpracovaných dat AD převodníku a kalibrační konstantou napěťové reference.
 +{{ :​2019:​monitor_pb:​adcvalues.jpg?​nolink&​100 |}}
 === Popis funkce Softwaru === === Popis funkce Softwaru ===
  
Řádek 85: Řádek 85:
 Analogově-digitální převodník pracuje v automatickém režimu měření deseti kanálů a referenčního zdroje napětí. Změřené hodnoty jsou opět pomocí DMA zapisovány do pole hodnot "​adcvalue" ​ Analogově-digitální převodník pracuje v automatickém režimu měření deseti kanálů a referenčního zdroje napětí. Změřené hodnoty jsou opět pomocí DMA zapisovány do pole hodnot "​adcvalue" ​
 AD převodník mikroprocesoru STM32 funguje tak, že při konfiguraci zvolíme, které vstupy chceme měřit a ty se měří cyklicky za sebou. Vše se děje automaticky,​ není potřeba ručně volit, který vstup se má změřit. vždy pokračuje na další. ​ AD převodník mikroprocesoru STM32 funguje tak, že při konfiguraci zvolíme, které vstupy chceme měřit a ty se měří cyklicky za sebou. Vše se děje automaticky,​ není potřeba ručně volit, který vstup se má změřit. vždy pokračuje na další. ​
-Jako poslední se měří vnitřní napěťová reference. Z této reference se pomocí kalibrační hodnoty, kterou do mikroprocesoru pevně nahrál výrobce vypočáítá ​aktuální napájecí napětí AD převodníku. Toto napětí posléze slouží jako referenční napětí pro AD převod měřených hodnot.+Jako poslední se měří vnitřní napěťová reference. Z této reference se pomocí kalibrační hodnoty, kterou do mikroprocesoru pevně nahrál výrobce, se vypočítá aktuální napájecí napětí AD převodníku. Toto napětí posléze slouží jako referenční napětí pro AD převod měřených hodnot.
 Tento přepočet je prováděn pomocí proměnných typu float z důvodu, že zde vychází velká čísla a výsledek dělení je desetinný. Mikroprocesor ale i s float proměnnými počítá velmi rychle, narozdíl od osmibitových mikroprocesorů. Tento přepočet je prováděn pomocí proměnných typu float z důvodu, že zde vychází velká čísla a výsledek dělení je desetinný. Mikroprocesor ale i s float proměnnými počítá velmi rychle, narozdíl od osmibitových mikroprocesorů.
 +V následující ukázce kódu se vypíše na sériovou linku napětí prvního akumulátoru:​
 +<code c>
 +uint16_t VREFINT_CAL = (*(uint16_t*)0x1FFFF7BA);​
 +
 +printf("​aku A1: %.1f mV\n\r",​ divider * ((float)3300 * (float)VREFINT_CAL * (float)adcvalue[9]) / ((float)adcvalue[10] * (float)4095));​
 +
 +</​code>​
 +Vypočtená hodnota se rovněž násobí konstantou "​divider",​ což je dělící poměr napěťového děliče.
 +Pro druhý až čtvrtý akumulátor je napětí na něm vždy rozdílem ku napětí předchozího. Proto je ve výpočtu zahrnut rouzdíl jednotlivých kanálů:
 +<code c>
 +printf("​aku A2: %.1f mV\n\r",​ divider * ((float)3300 * (float)VREFINT_CAL * ((float)adcvalue[8] - (float)adcvalue[9])) / ((float)adcvalue[10] * (float)4095));​
 +</​code>​
 +Na první pohled by se mohlo zdát, že se jedná o chybu, ale vzhledem k potřebám návrhu DPS jsou reálně číslovány vstupy opačně oproti číslování kanálů ADC. Z tohoto důvodu je první měřený vstup devátý kanál ADC.
  
 V poslední řadě se v hlavní nekonečné smyčce programu kontroluje, zdali napětí některého z akumulátorů nevybočuje z pevně nastavených mezí. V tomto případě se rozsvítí indikační LED pro daný akumulátor. V poslední řadě se v hlavní nekonečné smyčce programu kontroluje, zdali napětí některého z akumulátorů nevybočuje z pevně nastavených mezí. V tomto případě se rozsvítí indikační LED pro daný akumulátor.
  
 +Na začátku kódu jsou definovány hodnoty jak děliče, tak mezních napětí:
 +<code c>
 +#define divider 23.0
 +#define max_voltage 14200.0
 +#define min_voltage 11000.0
  
 +#define max_volt max_voltage/​divider
 +#define min_volt min_voltage/​divider
 +</​code>​
  
  
 +Protože indikace stavu akumulátorů není tak důležitá,​ tak se převodní konstanta pro výpočet napětí počítá pouze na začátku. Jedná se o přepracování vzorců a výsledkem je hodnota napětí odpovídající LSB.
 +<code c>
 +// get calibration value for int. Vref
 +uint16_t VREFINT_CAL = (*(uint16_t*)0x1FFFF7BA);​
 +
 +// calculate voltage for LSB from int. Vref
 +float ADCconst = ((float)3300 * (float)VREFINT_CAL) / ((float)adcvalue[10])/​(float)4095;​
 +</​code>​
 +
 +
 +Následně se testuje, zdali je napětí v toleranci, či nikoliv. Dle toho se rozsvítí příslušná LED.
 +<code c>
 +// SET LED for aku 1
 +if( ((((float)adcvalue[9])*ADCconst) < min_volt ) || ((((float)adcvalue[9])*ADCconst) > max_volt ))
 +{
 +  HAL_GPIO_WritePin(LED1_GPIO_Port,​ LED1_Pin, GPIO_PIN_SET);​
 +}
 +else
 +{
 +  HAL_GPIO_WritePin(LED1_GPIO_Port,​ LED1_Pin, GPIO_PIN_RESET);​
 +}
 +</​code>​
 +Toto se následně provede pro zbylých sedm vstupů
 +
 +Celý kód je psán pouze do hlavního souboru main.c, další soubory projektu nejsou modifikovány.
  
  
Řádek 99: Řádek 145:
 Při výrobě DPS v domácích podmínkách se mi nepodařilo vyvolat kvalitní předlohu pro výrobu, pravděpodobně mám už staré zásoby fotocitlivého kuprextitu a z tohoto důvodu jsem sestavil zařízení pomocí vývojového kitu a nepájivého pole. Při výrobě DPS v domácích podmínkách se mi nepodařilo vyvolat kvalitní předlohu pro výrobu, pravděpodobně mám už staré zásoby fotocitlivého kuprextitu a z tohoto důvodu jsem sestavil zařízení pomocí vývojového kitu a nepájivého pole.
  
 +Při výrobě finálního výrobku je také třeba v programu změnit hodnotu dělícího poměru, aktuální hodnota je vztažená k děliči 680k/33k, protože dané rezistory byly k dispozici ve vývodovém pouzdru. ​
  
-**ZIP archiv se schematem ​PCB SW Eagle a zdrojovými kódy:**+Funkce SW byla otestována na nepájivém kontaktním poli pracuje spolehlivě. Na ukázkách jsou sice využity čtyři vstupy, ale postupně byly ověřeny ​všechny vstupy. ​
  
 +Zbylé dva kanály a dvě nevyužité LED jsou plánovány pro rozšíření funkce. Pomocí dvou kanálů budou měřena napětí obvodu 24V a 12V, ze kterého se napájí osvětlení. LED budou indikovat správnost těchto napětí.
 +
 +Další užitečné rozšíření bude aplikace jednoduchého filtru výstupu AD převodníku. Ačkoliv jsou vstupy filtrovány,​ tak příležitostně je změřena špatná hodnota, pravděpodobně vlivem rušení. Tato chyba se ale může vyskytovat taktéž z důvodu dlouhých přívodů a sestavení na nepájivém kontaktním poli.
 +
 +**ZIP archiv se schematem a PCB v SW Eagle a zdrojovými kódy:**
 +{{ :​2019:​monitor_pb:​mereni_solar_nucleo.zip |}}
  
 **Krátké video demonstrující funkci:** **Krátké video demonstrující funkci:**
 +https://​youtu.be/​7ZXOgswnDS0
 +{{youtube>​7ZXOgswnDS0?​medium}}
 +
 +===== Zdroje =====
 +
 +[[https://​www.st.com/​content/​ccc/​resource/​technical/​document/​application_note/​91/​66/​2d/​8c/​f9/​b5/​47/​55/​DM00089834.pdf/​files/​DM00089834.pdf/​jcr:​content/​translations/​en.DM00089834.pdf|Application note STM32F030]]
 +
 +[[https://​www.st.com/​content/​ccc/​resource/​technical/​document/​reference_manual/​cf/​10/​a8/​c4/​29/​fb/​4c/​42/​DM00091010.pdf/​files/​DM00091010.pdf/​jcr:​content/​translations/​en.DM00091010.pdf|STM32F030 reference manual]]
 +
 +[[https://​www.st.com/​content/​ccc/​resource/​technical/​document/​user_manual/​98/​2e/​fa/​4b/​e0/​82/​43/​b7/​DM00105823.pdf/​files/​DM00105823.pdf/​jcr:​content/​translations/​en.DM00105823.pdf|Nucleo64 user manual]]
 +
 +
 +
 +
  
  
2019/accu-monitor.1579393549.txt.gz · Poslední úprava: 2020/01/19 01:25 autor: Milan Ambrož