ESC Flycolor X Cross HV3 settings on BlHeli 32

I don’t think pre-potting with silicone is needed (if i understand what your goal is)
Heat sink can be protected with anything that epoxy doesn’t adhere to: plastic tape/plasticine clay (if you need some thickness)/waxing etc.

1 Like

I see the 160A version at 78€ with VAT (10% off until 31st March 2024 = 70€), how much did you pay all inclusive (shipping, custom, …) ?
The rebranded BlHeli by Flipsky with 25% more Amps (200A instead of 160A) is at 99$+VAT+shipping+custom

I ordered one, £61 for everything.

I ordered one for 62 € (with all the promotion codes)

$60.72 using link above, no promo codes used

I’ve read that the current sensor on the blheli32 esc measures on the motor side, so it isn’t very helpful to protect your battery.

Has anyone figured an easy way to access telemetry, without a flight controller?

For the one-wire telemetry (when autotelemetry is on) you can use an arduino or similar with a pull-up resistor (1k internal or solder-on). The telemetry is of low quality and not very useful in my testing so far but still working on it. The protocol is called KISS24a there is a pdf spec online.

2 Likes

Hi everyone, xcross seems to have very small capacitors, is it a problem do you guys added some ?

can we not make the assumption that the current from the battery is the same as going to the motor minus some heat loss?

/*
Author: cdl Dec 2023
Read BLHeli ESC telemetry port. Assumes the ESC is configured with auto-telemetry=on using the BLHeli Suite app

Connections:

  • ESC telemetry wired to Seeeduino XAIO to pin 7 (hardware UART aka Serial1)
  • ESC ground to XIAO pin 2
  • ESC powered as appropriate (eg. 12v-40v batt or power source)

*/

#define mySerial Serial2

#define TELEMETRY_FRAME_SIZE 10
static uint8_t telemetryBuffer[TELEMETRY_FRAME_SIZE] = {
0,
};

struct telemetryValues { uint16_t temperature,
voltage,
current,
consumption,
rawrpm; };

uint8_t update_crc8(uint8_t crc, uint8_t crc_seed) {
uint8_t crc_u, i;
crc_u = crc;
crc_u ^= crc_seed;
for (i = 0; i < 8; i++) crc_u = (crc_u & 0x80) ? 0x7 ^ (crc_u << 1) : (crc_u << 1);
return (crc_u);
}
uint8_t get_crc8(uint8_t *Buf, uint8_t BufLen) {
uint8_t crc = 0, i;
for (i = 0; i < BufLen; i++) crc = update_crc8(Buf[i], crc);
return (crc);
}

void setup() {
// Open serial communications and wait for ports to open
Serial.begin(115200); // for output to use the Serial Monitor or equivalent
mySerial.begin(115200); // Connect to the designated UART port on the arduino (eg. for Seeeduino XIAO it is on pin 7)

Serial.print( “BLHeli ESC telemetry\n” );
}

void loop() // run over and over//
{
uint8_t crc, txcrc;
telemetryValues tv;
uint32_t erpm, rpm;

// always keep the most recent 10 bytes in buffer
if (mySerial.available()) {

// shift buffer contents back one char position
telemetryBuffer[0] = telemetryBuffer[1];
telemetryBuffer[1] = telemetryBuffer[2];
telemetryBuffer[2] = telemetryBuffer[3];
telemetryBuffer[3] = telemetryBuffer[4];
telemetryBuffer[4] = telemetryBuffer[5];
telemetryBuffer[5] = telemetryBuffer[6];
telemetryBuffer[6] = telemetryBuffer[7];
telemetryBuffer[7] = telemetryBuffer[8];
telemetryBuffer[8] = telemetryBuffer[9];

// read the next byte from the telemetry port
telemetryBuffer[TELEMETRY_FRAME_SIZE - 1] = mySerial.read();

// compute crc
crc = get_crc8(telemetryBuffer, TELEMETRY_FRAME_SIZE - 1);
// if crc matches last byte in buffer then frame is valid, else ignore and go to next byte
txcrc = telemetryBuffer[TELEMETRY_FRAME_SIZE - 1]; 
if ( crc == txcrc )
{
  tv.temperature = telemetryBuffer[0];
  tv.voltage = telemetryBuffer[1] << 8 | telemetryBuffer[2];
  tv.current = telemetryBuffer[3] << 8 | telemetryBuffer[4];
  tv.consumption = telemetryBuffer[5] << 8 | telemetryBuffer[6];
  tv.rawrpm = telemetryBuffer[7] << 8 | telemetryBuffer[8];
  erpm = tv.rawrpm * 100;
  rpm = erpm / 7; // assumes 14 magnet pole motor
  Serial.printf("Temp: %d\n", tv.temperature);
  Serial.printf("Voltage: %d\n", tv.voltage);
  Serial.printf("Current: %d\n", tv.current);
  Serial.printf("Consumption: %d\n", tv.consumption);
  Serial.printf("eRPM: %d\n", erpm );
  Serial.printf("RPM (14 poles): %d\n", rpm );
  Serial.printf("CRC: %d %s %d\n\n", crc, ( crc==txcrc ? "=" : "!=" ), txcrc );
}

}
}

3 Likes

Motor current and battery current are different and scaled to the PWM duty cycle.

12v1A in battery at duty 0.5 is 6V2A out to motor