Meranie napájacieho napatia na module bluepill (STM32f103)

Pozdravujem,
vyvíjam zariadenie s STM32f103 (bluepill), ktore je napajané akumulatormi (3 x NIMH v serii = 3.6 V), chcem merat a vyhodnocovat napatie na bateriach, je mozne nejako zmerat napajacie napatie mikrokontroléra (Vcc). Je mozne pouzit ADC0 a prepojit ho s Vcc ?

dakujem za kazdu odpoved.

Připojit to možné je, ale tak stejně napětí na baterkách nevyhodnotíš. Je potřeba nějaká pevná reference buď interní (Například AVR čipy umí interní referenci 2,56V nebo 1,1V - podle MCU) nebo externí (předpokládám, že STM má vstup pro externí referenci pro AD převodník). Reference musí (nebo aspoň by měla) mít nižší napětí, než je minimální možné (kdy to ještě funguje) napětí na baterkách, pokud chceš vyhodnocovat v celém funkčním rozsahu. Napětí z baterek pak přivedeš na AD vstup přes takový dělič, abys při maximálním napětí dostal na AD převodníku hodnotu těsně pod jeho maximem - pro 8 bitů (0-255) hodnotu třeba 252, pro 10 bitů (0-1023) třeba 1020 atd.

Diky za odpoved !

ano stm32f103 ma 1,2 V internu napatovu referenciu.
to to mi je uz jasne - dik.

Este mam dotaz, stm32f103 pisu ze ma rozsah napajacieho napatia 2.7 do 3.6 V, chcem pouzit
na napajanie 3 x nimh to je 3.6 V avsak kupil som baterie ale maju o nieco vyssie napatie ako 1.2 na clanok cca 1.27 V, teda neodpalim ten stm32f103 ? ak tam pripojim napajacie napatie 3.8 V ?

dakujem

radop2

No jestli má 1V2 referenci, tak to asi nezměří víc než 1V2 ne? Takže budeš muset upravit tvoje max. napětí 3V8 na 1V2. Použil bych odporový dělič tak, aby 3V8 vyšlo někde kolem 1V. Takže např. 10k a 3k8 odpory a při napětí 3,8V budeš mít na odporovém děliči 1,046V.

Je to ještě horší … plně nabité články mohou mít až 1,4V !

Dik za odpoved.

rozhodol som sa ze pouzijem Li-Fe (litium ferit) akumulator, da sa kupit celkom vyhodne a clanok ma 3.2V co mi uplne vyhovuje. (lebo 3.2V mozem napajat uProcesor a aj LoRa rf modul aj dalsie periferie)

Dik za inspiraciu

R

Zadal jsem do google dotaz ohledně té tvojí baterie:

The nominal voltage of one single LiFePO4 battery cell is 3.2V , and the charge voltage range is 3.50-3.65V.

Z toho mi vyplývá, že pro měření stejně budeš muset upravit jeho maximální výstupní napětí odporovým děličem. Takže si myslím, že bez nějaké stabilizace to bude na hraně. Protože krajní meze tyto mcu mají právě 3,6V.

resil jsem neco podobnyho napajeneho z baterek ale pozadavek byla co nejmensi spotreba coz odporovej delic rozhodne neni… nejaky napad do budoucna?
napeti musis stahnout pod napeti reference a nechat tam rezervu …

Co mít odporový dělič a ten si nějakým fetem spínat jenom po dobu měření?

Ahojte,

vdaka za reakcie.

Ano potrebujem co najmenej stiahnut prud na zariadeni napajaneho z baterie, odpojil som LED power a tak isto stabilik na BLUEPILLe. V STANDBY mode je takto spotreba okolo 24uA. (je v tom aj prud pre LoRa modul v stave SLEEP)
Ked pouzijem jednoduchy delic na meranie baterkoveho napatia tak je prud na minime lebo BLUEPILL sa uspi a raz za pol hodinu sa zobudi a zmera napatie ostatne veliciny, posle ich a znova zaspi.

STM32F103 ma internu napatovu referenciu. Viem toto napatie zmerat (cca 1.2V na ADC_CHANNEL_17) ale ako teraz zmeram napajacie napatie Vcc (alebo na pine VBat ?)

Dik

R

STM32F103 ma internu napatovu referenciu. Viem toto napatie zmerat (cca 1.2V na ADC_CHANNEL_17) ale ako teraz zmeram napajacie napatie Vcc (alebo na pine VBat ?)

Tak teď fakt nevím. Tak jestli umíš změřit napětí na adc_channel_17 tak obdobně změříš napětí na na jiném kanálu, kde máš připojené Vcc a VBat bude taky určitě jiný kanál.

Ale mně spíše přijde, že ty vůbec nevíš co se kde děje s tím adc. Co se kam připojí, pokud se to přijí přes odporový dělič, tak proč to šlo přes odporový dělič, atp.

Dik za odpoved.

chcem sa spytat:

1,
takze viem zmerat napatie na AD prevodniku vtedy ked nepouzivam internu napatovu referenciu.
na zistenie napatia pouzijem tento kusok programu:

  float V1;
  V1 = ((float)adc_value * 3.3)/(float)4095;

  v adc_value je hodnota nacitana cez funkciu HAL_ADC_GetValue(&hadc1);

  toto funguje.

2, teraz potrebujem zmerat Vdd , ktore je pripojene na AD prevodnik kanal 1. cez napatovy delic
(napr 200k a 50k) teda na AD kanal1 pripojim Vdd napatie delene 5.

 potom napatie V1;
 V1 = 5 x ((float)adc_value * 1.2)/(float)4095;
 pricom 1.2 V je napatie internej napatovej referencie.

Ale pred meranim tohoto V1 musim "dat vediet" procesoru aby
pouzival Vref ( internu napat. referenciu )

asi tak by to malo byt nie ?

diky

R

Pozdravujem,
nadvazujem na prechadzajucu komunikaciu a prosim o pomoc.

riesim zariadenie na baze modulu bluepill ktore ma okrem ineho aj moznost zmerat napatie na napajani (jedna sa o zariadene napajane z akumulatora ER18505M - LITHIUM 3.6V)

schema zapojenia:

programujem to v prostredi keil uvision.

Uvadzam nasledujucu funkciu MerajNapatie pre meranie napatia na vstupe A0 mcu.

float MerajNapatie( void )
{
uint16_t adcIn1Raw;
ADC_ChannelConfTypeDef sConfig = {0};

// citam napatie na 0 kanaly
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}

HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
HAL_Delay(1);

adcIn1Raw = HAL_ADC_GetValue(&hadc1);
   HAL_ADC_Stop(&hadc1);

   float ret =  ( ( (float)adcIn1Raw / (float)4096 ) ) * (float)1.2 * (float) 6;

// 4096 znamena 12 bit. prevodnik
// 1.2 je interna nap. referencia
// 6 je pomer rezistorov 12k / 2k

return ret;

}

funkcia MX_ADC1_Init pre inicializaciu ADC1 prevodnika:

ADC_HandleTypeDef hadc1 = {0};

void MX_ADC1_Init(void)
{

__ADC1_CLK_ENABLE();

// Initialising ADC1
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;

// pokus o nastavenie int. referencie napatovej
hadc1.Instance->CR2 |= ADC_CR2_TSVREFE;

if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}

}

funkcia MerajNapatie stale vracia cca 1.1 V

a malo by vratit nieco okolo 3.2V

Ak by niekoho napadlo preco, budem sa tesit kazdej rade.

dakujem !!!

R

Další, který neumí dát do <code>, </code> CELÝ kód …

Jak vypadá hodnota adcIn1Raw ?
Než se pustíš do výpočtů, měl bys vědět, z čeho vlastně vycházíš.


Celý to počítáš ve float ? :astonished:

Co třeba takhle :

#define REFERENCE (1200)
#define POMER_VIN_VCC (6) 
uint32_t ret;

ret = (((uint32_t)adcIn1Raw*REFERENCE*POMER_VIN_VCC)+2048)/4096;

A výsledek máš v mV.
(Těch 2048 je připočtení 0,5mV k výsledku před dělením kvůli zaokrouhlování)


Jinak, co jsem našel, tak ER18505M NENÍ akumulátor, ale baterie.

Takže pokud to napájíš z baterky, tak ten dělič 10k/2k má trvalý odběr 0,3mA (při 3,6V - s poklesem napětí proud samozřejmě klesá) => 7,2mAh/den.
Dal bych tam odpory 100k/20k nebo klidně 1M/200k a na vstup malý kondenzátor - třeba 10nF.

  • při 100k/20k máš 10nF nabitý za cca 4ms - odběr 30uA => 0,72mAh/den
  • při 1M/200k máš 10nF nabitý za cca 40ms - odběr 3uA => 0,072mAh/den

Dakujem za odpoved,

no adcIn1Raw je priblizne cca 600.

zatial sa jedna len o test, cize nie je to este optimalny finalny kod, preto som to zatial riesit cez float-y.

skusil som to tak ako si poradil a hodnota v premenne ret je cca 1092 cize vysledok sa nezmenil
mera mi to tak ako predtym akurat je vysledok v mV.

A co sa tyka toho odberu odporoveho delica, ano budem to riesit s vacsimi odpormi alebo skusim pomocou FET-u “pripinat” delic.

Este dodavam ze bluepill MCU zariadenia je v spanku a raz za 3min sa zobudi zo spanku a zmera okrem ineho aj napatie na baterii posle cez radio a znova zaspi.

Dik za radu

R

Mám obavu, že jsem našel příčinu. Bluepill používá tento procesor ve 48-pinovém pouzdře. Pokud jsem správně pochopil datasheety od procesoru, tak zde není interní reference (jako u výše zmiňovaných AVR), ale musíš použít Vref+ a Vref-. Jenže u procesorů v pouzdrech s 64 a méně piny jsou tyto reference interně propojeny na Vdda a Vssa. Tom pádem máš referencí Vdda (tedy napětí baterky) a hodnota 600 z AD převodníku odpovídá tomu, co bylo naměřeno na vstupu.

Je to zase o tom … ČÍST DATASHEETY.

Dakujem za odpoved.

Aha tak tomu odpoveda aj ta vec, ze ci nastavim bit ADC_CR2_TSVREFE v ADC1 reg.

ADC1 ->CR2 |= ADC_CR2_TSVREFE;

alebo ho zmazem

ADC1 ->CR2 &= ~ADC_CR2_TSVREFE

vysledok je ten isty

dik

R

Pre BALU:

Este raz vdaka za Tvoj cas a ochotu mi pomoct !

R

Nemáš zač. Ale kdyby sis pozorně přečetl datasheet procesoru, tak bys to tam našel. :wink: