č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