čtení napětí z MCP3221 (1ch/12bit)
cizek.milan na seznam.cz
cizek.milan na seznam.cz
Úterý Duben 2 04:07:57 CEST 2019
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
Další informace o konferenci Hw-list