shibosoftwaredev/f1c100s-linux-nema17-stepper-controller

A four-layer NEMA 17 motor-controller PCB combining an Allwinner F1C100S Linux computer, USB‑PD/buck power system, W5500 Ethernet, STM32 real-time motion control, DRV8825 stepper driver, protection/temperature/current telemetry, USB interfaces, and local LED/buzzer diagnostics.

Version
0.4.56
License
unset
Stars
0

firmware/stm32/current.c

#include "current.h"

// INA241B1 gain 10 and inline 0.300 ohm shunts: 3 V/A, zero at VDDA/2.
// This is nominal filtered telemetry, not calibrated protection or true RMS.
static int32_t milliamps(uint16_t raw, uint16_t vdda) {
  int32_t numerator=((int32_t)raw*2-4095)*(int32_t)vdda;
  const int32_t denominator=4095*6;
  return numerator>=0 ? (numerator+denominator/2)/denominator
    : -((-numerator+denominator/2)/denominator);
}
void current_update(CurrentTelemetry *t, const CurrentSample *s) {
  *t=(CurrentTelemetry){.raw_a=s->raw_a,.raw_b=s->raw_b,.vdda_mv=s->vdda_mv,.updated_at=s->now};
  if(!s->adc_ok || s->vdda_mv<2700 || s->vdda_mv>3600 || s->raw_a>4095 || s->raw_b>4095)return;
  t->a_ma=milliamps(s->raw_a,s->vdda_mv);t->b_ma=milliamps(s->raw_b,s->vdda_mv);
  // At least 200 mV of upper-rail headroom is specified. Rail-adjacent
  // readings remain visible but must not be represented as valid current.
  if(s->raw_a<64 || (uint32_t)s->raw_a*s->vdda_mv>(uint32_t)(s->vdda_mv-200)*4095)
    t->flags|=CURRENT_A_CLIPPED;
  else t->flags|=CURRENT_A_VALID;
  if(s->raw_b<64 || (uint32_t)s->raw_b*s->vdda_mv>(uint32_t)(s->vdda_mv-200)*4095)
    t->flags|=CURRENT_B_CLIPPED;
  else t->flags|=CURRENT_B_VALID;
}
CurrentTelemetry current_snapshot(const CurrentTelemetry *t, uint32_t now) {
  CurrentTelemetry result=*t;
  uint32_t age=now-t->updated_at;
  result.age_ms=age>65535 ? 65535:(uint16_t)age;
  if(age>20)result.flags&=~(CURRENT_A_VALID|CURRENT_B_VALID);
  return result;
}