č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