Rough tip resistance progress

This commit is contained in:
Ben V. Brown
2022-05-23 21:42:56 +10:00
parent 226750df4c
commit 75b3f09438
8 changed files with 75 additions and 17 deletions

View File

@@ -16,6 +16,13 @@ extern "C" {
// Can be used to check any details for the power system
void power_check();
// Returns the tip resistance in x10 ohms, so 7.5 = 75; 14=140 etc
uint8_t getTipResitanceX10();
// Called when device is idle to allow measuring tip resistance
void startMeasureTipResistance();
void FinishMeasureTipResistance();
#ifdef __cplusplus
}
#endif

View File

@@ -223,3 +223,47 @@ bool isTipDisconnected() {
void setStatusLED(const enum StatusLED state) {
// Dont have one
}
uint8_t lastTipResistance = 75; // default safe
uint32_t lastTipReadinguV = 0;
uint8_t getTipResitanceX10() {
// Return tip resistance in x10 ohms
// We can measure this using the op-amp
return lastTipResistance;
}
void startMeasureTipResistance() {
if (isTipDisconnected()) {
return;
}
// We want to calculate lastTipResistance
// If tip is connected, and the tip is cold and the tip is not being heated
// We can use the GPIO to inject a small current into the tip and measure this
// The gpio is 5.1k -> diode -> tip -> gnd
// Which is around 0.65mA this will induce:
// 6 ohm tip -> 3.9mV (Real world ~= 3320)
// 8 ohm tip -> 5.2mV (Real world ~= 4500)
// Which is definitely measureable
// Taking shortcuts here as we know we only really have to pick apart 6 and 8 ohm tips
// These are reported as 60 and 75 respectively
lastTipReadinguV = TipThermoModel::convertTipRawADCTouV(getTipRawTemp(0));
gpio_write(TIP_RESISTANCE_SENSE, 1);
// Wait for next ADC measurement
}
void FinishMeasureTipResistance() {
gpio_write(TIP_RESISTANCE_SENSE, 0);
if (isTipDisconnected()) {
return;
}
// read the tip uV with the current source on
uint32_t newReading = (TipThermoModel::convertTipRawADCTouV(getTipRawTemp(0)));
if (newReading < lastTipReadinguV) {
return;
}
// newReading -= lastTipReadinguV;
MSG("Tip Delta %lu, %lu %lu \r\n", newReading - lastTipReadinguV, newReading, lastTipReadinguV);
newReading -= lastTipReadinguV;
lastTipReadinguV = newReading;
}

View File

@@ -23,6 +23,7 @@ history<uint16_t, ADC_Filter_Smooth> ADC_Vin;
history<uint16_t, ADC_Filter_Smooth> ADC_Temp;
history<uint16_t, ADC_Filter_Smooth> ADC_Tip;
void adc_fifo_irq(void) {
if (ADC_GetIntStatus(ADC_INT_FIFO_READY) == SET) {
bool wakePID = false;

View File

@@ -29,8 +29,9 @@ void hardware_init() {
gpio_set_mode(TMP36_INPUT_Pin, GPIO_INPUT_MODE);
gpio_set_mode(TIP_TEMP_Pin, GPIO_INPUT_MODE);
gpio_set_mode(VIN_Pin, GPIO_INPUT_MODE);
gpio_set_mode(TIP_RESISTANCE_SENSE, GPIO_INPUT_MODE);
gpio_set_mode(TIP_RESISTANCE_SENSE, GPIO_OUTPUT_PP_MODE);
gpio_write(TIP_RESISTANCE_SENSE, 0);
MSG("Magic Starting\r\n");
setup_timer_scheduler();
setup_adc();
setup_pwm();

View File

@@ -116,17 +116,17 @@
#ifdef MODEL_Magic
#define ADC_VDD_MV 3200 // ADC max reading millivolts
#define SOLDERING_TEMP 320 // Default soldering temp is 320.0 °C
#define VOLTAGE_DIV 600 // 290 - Default divider from schematic
#define CALIBRATION_OFFSET 900 // 900 - Default adc offset in uV
#define VOLTAGE_DIV 600 // 600 - Default divider from schematic
#define CALIBRATION_OFFSET 800 // 900 - Default adc offset in uV
#define MIN_CALIBRATION_OFFSET 100 // Min value for calibration
#define PID_POWER_LIMIT 70 // Sets the max pwm power limit
#define PID_POWER_LIMIT 220 // Sets the max pwm power limit
#define POWER_LIMIT 0 // 0 watts default limit
#define MAX_POWER_LIMIT 70 //
#define MAX_POWER_LIMIT 220 //
#define POWER_LIMIT_STEPS 5 //
#define OP_AMP_GAIN_STAGE OP_AMP_GAIN_STAGE_PINECIL // Uses TS100 resistors
#define TEMP_uV_LOOKUP_HAKKO // Use Hakko lookup table
#define USB_PD_VMAX 20 // Maximum voltage for PD to negotiate
#define PID_TIM_HZ (8) // Tick rate of the PID loop
#define PID_TIM_HZ (10) // Tick rate of the PID loop
#define MAX_TEMP_C 450 // Max soldering temp selectable °C
#define MAX_TEMP_F 850 // Max soldering temp selectable °F
#define MIN_TEMP_C 10 // Min soldering temp selectable °C