0hmX/pcbgolf-routing-checkpoint-20261012

A PCBGolf assembly combining a modeled PCB with copper/component bodies and seven native connector housings.

Version
0.0.3
License
unset
Stars
0

firmware-support/pcbgolf_imon.c

#include "pcbgolf_board.h"

bool pcbgolf_fit_imon(float zero_v, float known_v, float known_a, pcbgolf_imon_cal_t *cal) {
  if (!cal || !(zero_v >= 0.0f) || !(known_v > zero_v) || !(known_a >= 1.0f) ||
      known_v > 3.6f || known_a > 5.0f) return false;
  cal->zero_v = zero_v;
  cal->volts_per_a = (known_v - zero_v) / known_a;
  return cal->volts_per_a > 0.0f;
}
bool pcbgolf_imon_current(uint32_t raw, uint8_t bits, float vref,
                         const pcbgolf_imon_cal_t *cal, float *amps) {
  if (!cal || !amps || (bits != 12U && bits != 16U) || !(vref >= 3.0f && vref <= 3.6f) ||
      !(cal->zero_v >= 0.0f && cal->zero_v < vref) || !(cal->volts_per_a > 0.0f && cal->volts_per_a < vref)) return false;
  uint32_t fullscale = (1U << bits) - 1U;
  if (raw > fullscale) return false;
  float a = (((float)raw * vref / (float)fullscale) - cal->zero_v) / cal->volts_per_a;
  *amps = a > 0.0f ? a : 0.0f;
  return true;
}