čtení napětí z MCP3221 (1ch/12bit)
Robert Baranka
hwlist na centrum.sk
Úterý Duben 2 07:32:47 CEST 2019
A ešte by stálo za úvahu odmerať napätie na vstupe adc, vdd adc a výsledky porovnať s
voltage = (float) (mcp_vdd / 4096.0) * value; // * (60 / mcp_vdd);
Robo
PS. A nejaký ten diablik sa môže skrývať aj v presnosti "měřáku" ;-)
Dňa 2. 4. 2019 4:31 Petr Zahradník wrote / napísal(a):
> Ne, měří to od nuly, samozřejmě. Tedy hodnota je Vdd/4096.
>
> Proč ti rozdíl 0,5 V z napětí 60 V při toleranci odporů v děliči 1% ze šuplíku přijde hodně? Do kalkulačky sis to hodil?
>
> A ten převodník napájíš z čeho?
>
> Petr Zahradník, počítačový expert
> e-mail: clexpert na clexpert.cz
> mobil: 602 409 601, telefony: 475 501 627, 910 256 000
> http://www.clexpert.cz, http://www.zahradniksebavi.cz
> Petr Zahradník, Computer Laboratory
> Obvodová 740/14, 400 07 Ústí nad Labem
>
> -----Original Message-----
> From: Hw-list <hw-list-bounces na list.hw.cz> On Behalf Of cizek.milan na seznam.cz
> Sent: Tuesday, April 2, 2019 4:08 AM
> To: 'HW-news' <hw-list na list.hw.cz>
> Subject: čtení napětí z MCP3221 (1ch/12bit)
>
> Ahoj,
> potřeboval bych poradit, protože v bitových operacích nejsem tolik silný,
> hlavně nikde nevidím chybu.
>
> Snažím se přes MCP3221 číst napětí v rozsahu 0-60V.
> MCP3221 Vdd je 3V3 a Vss GND.
> Nějak mi to funguje, ale ne přesně. Jsem cca -0,5V, což mi přijde hodně i s
> ohledem na toleranci děliče (47k a 2,74k +-1%).
> Tak hledám chybu v kódu...
>
> Jde mi hlavně o tu část přepočtu value, trochu jsem to celé okomentoval pro
> lepší orientaci a daný, řádek, jak jej chápu.
>
> int value = 0x0;
> float voltage = 0.0;
> const float mcp_vdd = 3.3;
>
> // ADC (MCP3221) dělič spočítán na 0-60V
> // vestavěná/pevná přesnost 12 bitů, žádný konfigurační registr, pouze
> read-only čip
> // při Vdd=3.3V (a Vss GND) jsme schopni měřit napětí v rozsahu -0.3V až
> 3.6V (Vss-0.3V a Vdd+0.3V)
> // (approx) PoE-IN Ain
> // 0 0.00 0.00V
> // 2048 30.0 1.65V (1.655V)
> // 4095 60.0 3.31V
>
> value = wiringPiI2CReadReg16(fd, 0x0);
>
> // čteme celé 2 bajty, ale zajímá nás jen 12 spodních bitů (z MSB 4 bity a
> z LSB všech 8 bitů)
> // první jsme ale přijali MSB[0] následně LSB[1], takže prohazujeme
> // první závorka vymaskuje spodní bajt a šoupne je o 8 bitů vlevo
> // druhá závorka vymaskuje horní bajt a šoupne ho o 8 bitů vpravo,
> následně se sečtou, prakticky je to tedy záměna pořadí 2 bajtů
> value = (value & 0xFF) << 8 | (value & 0xFF00) >> 8;
>
> // 12bitů = 4096 možností = 2^12; 60/3.3 = 18.18 (max. 60V před děličem
> odpovídá 3V3 za děličem)
> voltage = (float) (mcp_vdd / 4096.0) * value * (60 / mcp_vdd);
>
>
> 17.31V mi měří kód, měřák 17.74V.
> Nemám problém v té úvaze/tabulce? Jestli hodnota 0 v registru neodpovídá
> -0.3V? Díky.
> Milan
>
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
Další informace o konferenci Hw-list