From 90a94a533b6bc405da5fe4b539fb864f63c273bf Mon Sep 17 00:00:00 2001 From: Alessandro Mauri Date: Fri, 10 Apr 2026 17:10:30 +0200 Subject: [PATCH] more work on basic functions --- fw/main.c | 94 +++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 71 insertions(+), 23 deletions(-) diff --git a/fw/main.c b/fw/main.c index 0ded498..206fbe8 100644 --- a/fw/main.c +++ b/fw/main.c @@ -1,23 +1,31 @@ #include #include #include -#include #include // Pin definitions -#define PIN_LED PA4 -#define PIN_VBUS PA0 -#define PIN_CURRENT PA1 -#define PIN_NTC PA2 +#define PIN_LED PA4 // debug led +#define PIN_VBUS PA0 // vbus voltage feedback +#define PIN_CURRENT PA1 // current feedback +#define PIN_NTC PA2 // ntc temperature sensor +#define PIN_TEMP PA3 // thermocouple amplifier +#define PIN_12V PA5 // 12V regulator enable +#define PIN_HEATER PA6 // power mosfet gate control +#define PIN_ENC_A PB3 // rotary encoder A +#define PIN_ENC_B PB11 // rotary encoder B +#define PIN_BTN PB1 // rotary encoder button // Analog channel definitions -#define VBUS_ADC_CHANNEL ANALOG_0 -#define CURRENT_ADC_CHANNEL ANALOG_1 -#define NTC_ADC_CHANNEL ANALOG_2 +#define VBUS_ADC_CHANNEL ANALOG_0 // PA0 +#define CURRENT_ADC_CHANNEL ANALOG_1 // PA1 +#define NTC_ADC_CHANNEL ANALOG_2 // PA2 +#define TEMP_ADC_CHANNEL ANALOG_3 // PA3 // constants // LUT for converting NTC readings to degrees kelvin // Nominal: 1kOhm, Beta: 3380, Step: 64 +// TODO: Since the board temperature is almost always in the 300-200K range add +// more steps in order to better represent that interval const uint8_t ntc_step_size = 64; const int16_t ntc_table[64] = { 1180, 197, 155, 133, 119, 108, 100, 93, 87, 82, 77, 73, 69, 66, 63, 60, 57, 54, 52, 50, 47, 45, 43, 41, 39, 37, 35, 34, 32, 30, 28, 27, 25, 23, 22, 20, 19, 17, 15, 14, 12, 11, 9, 7, 6, 4, 2, 0, -1, -3, -5, -7, -9, -11, -14, -16, -19, -22, -25, -28, -33, -38, -44, -55 @@ -27,32 +35,59 @@ const int16_t ntc_table[64] = { uint8_t pin = 0; -int get_temp_k(int adc_reading) +// Convert the raw adc reading to a temperature in kelvin with the ntc lut, +// linearly interpolating between positions +static inline int16_t get_temp_k(uint16_t adc_reading) { - if (adc_reading < 0 || adc_reading > 4095) return 0; + if (adc_reading > 4095) return 0; uint8_t index = adc_reading / ntc_step_size; uint8_t remainder = adc_reading % ntc_step_size; - if (index > 64) return 0; - int16_t temp_base = ntc_table[index]; - int16_t temp_next = ntc_table[index + 1]; - int16_t temp_diff = temp_next - temp_base; - int16_t offset = (temp_diff * remainder) / ntc_step_size; - return temp_base + offset; + int16_t temp_base = index < 64 ? ntc_table[index] : 0; + int16_t temp_next = index < 63 ? ntc_table[index + 1] : temp_base; + return temp_base + ((temp_next - temp_base) * remainder)/ntc_step_size; } + +// convert the raw tip reading from the adc to a temperature in kelvin +static inline int16_t get_tip_temp_k(uint16_t adc_reading, int16_t cold_temp_k) +{ + return 0; +} + + // this callback is mandatory when FUNCONF_USE_USBPRINTF is defined, // can be empty though void handle_usbfs_input(int numbytes, uint8_t *data) { + // handle single character commands + // TODO: + // - 'c' to calibrate the tip temperature + // - 't' to test tip presence if(numbytes == 1) { switch(data[0]) { - case 'b': - printf("HAHAHA\n"); + case 'r': // toggle the 12V regulator + if (funDigitalRead(PIN_12V)) { + funDigitalWrite(PIN_12V, 0); + printf("Disabled 12V Regulator\n"); + } else { + funDigitalWrite(PIN_12V, 1); + printf("Enabled 12V Regulator\n"); + } + break; + case 'h': + printf( + "Available commands:\n" + "\tr : toggle the 12V regulator\n" + ); + break; + default: + printf("Unknown command '%c'\n", data[0]); break; } } else { - _write(0, (const char*)data, numbytes); + // echo + // _write(0, (const char*)data, numbytes); } } @@ -67,7 +102,17 @@ __attribute__((noreturn)) int main(void) funPinMode(PIN_VBUS, GPIO_CFGLR_IN_ANALOG); funPinMode(PIN_CURRENT, GPIO_CFGLR_IN_ANALOG); funPinMode(PIN_NTC, GPIO_CFGLR_IN_ANALOG); + funPinMode(PIN_TEMP, GPIO_CFGLR_IN_ANALOG); + funPinMode(PIN_LED, GPIO_CFGLR_OUT_10Mhz_PP); + funPinMode(PIN_12V, GPIO_CFGLR_OUT_10Mhz_PP); + funDigitalWrite(PIN_12V, 0); + funPinMode(PIN_HEATER, GPIO_CFGLR_OUT_10Mhz_PP); + funDigitalWrite(PIN_HEATER, 0); + + funPinMode(PIN_ENC_A, GPIO_CFGLR_IN_PUPD); + funPinMode(PIN_ENC_B, GPIO_CFGLR_IN_PUPD); + funPinMode(PIN_BTN, GPIO_CFGLR_IN_FLOAT); Delay_Ms(500); @@ -76,10 +121,13 @@ __attribute__((noreturn)) int main(void) for (uint32_t x = 0; true ; x++) { poll_input(); // usb if ((x % 100) == 0) { - int vbus_mv = (funAnalogRead(VBUS_ADC_CHANNEL)*3300*11)/4095; - int current_ma = (funAnalogRead(CURRENT_ADC_CHANNEL)*3300)/4095; - int temp_k = get_temp_k(funAnalogRead(NTC_ADC_CHANNEL)); - printf("[%d]: Hello From CH32X035, VBUS=%d, CURRENT=%d, TEMP=%d\n", count++, vbus_mv, current_ma, temp_k); + uint16_t vbus_mv = (funAnalogRead(VBUS_ADC_CHANNEL)*3300*11)/4095; + uint16_t current_ma = ((uint32_t)funAnalogRead(CURRENT_ADC_CHANNEL) * 4125 + 1024) / 2048; + int16_t temp_k = get_temp_k(funAnalogRead(NTC_ADC_CHANNEL)); + uint16_t temp_tip_k = funAnalogRead(TEMP_ADC_CHANNEL); + + printf("[%d]: VBUS=%d, CURRENT=%d, TEMP=%d, TIP=%d\n", count++, vbus_mv, current_ma, temp_k, temp_tip_k); + funDigitalWrite(PIN_LED, pin); pin = !pin; }