1
0
forked from me/IronOS
This commit is contained in:
Ben V. Brown
2018-11-11 09:28:13 +11:00
2 changed files with 57 additions and 49 deletions

View File

@@ -268,7 +268,7 @@ static void gui_drawBatteryIcon() {
// Range is 42 -> 33 = 9 steps therefore we will use battery 1-10 // Range is 42 -> 33 = 9 steps therefore we will use battery 1-10
if (cellV < 33) if (cellV < 33)
cellV = 33; cellV = 33;
cellV -= 33; // Should leave us a number of 0-9 cellV -= 33;// Should leave us a number of 0-9
if (cellV > 9) if (cellV > 9)
cellV = 9; cellV = 9;
OLED::drawBattery(cellV + 1); OLED::drawBattery(cellV + 1);
@@ -279,7 +279,7 @@ static void gui_drawBatteryIcon() {
// If <9V then show single digit, if not show duals // If <9V then show single digit, if not show duals
uint8_t V = getInputVoltageX10(systemSettings.voltageDiv); uint8_t V = getInputVoltageX10(systemSettings.voltageDiv);
if (V % 10 >= 5) if (V % 10 >= 5)
V = V / 10 + 1;// round up V = V / 10 + 1; // round up
else else
V = V / 10; V = V / 10;
if (V >= 10) { if (V >= 10) {
@@ -289,7 +289,7 @@ static void gui_drawBatteryIcon() {
OLED::setCursor(xPos, 8); OLED::setCursor(xPos, 8);
OLED::printNumber(V % 10, 1); OLED::printNumber(V % 10, 1);
OLED::setFont(0); OLED::setFont(0);
OLED::setCursor(xPos+12,0); // need to reset this as if we drew a wide char OLED::setCursor(xPos + 12, 0); // need to reset this as if we drew a wide char
} else { } else {
OLED::printNumber(V, 1); OLED::printNumber(V, 1);
} }
@@ -713,7 +713,7 @@ void showVersion(void) {
break; break;
case 12: case 12:
#ifdef MODEL_TS80 #ifdef MODEL_TS80
OLED::printNumber(idealQCVoltage,3); OLED::printNumber(idealQCVoltage, 3);
#else #else
OLED::print("Tek.com"); OLED::print("Tek.com");
#endif #endif
@@ -803,8 +803,9 @@ void startGUITask(void const *argument __unused) {
#ifdef MODEL_TS80 #ifdef MODEL_TS80
//Here we re-check for tip presence //Here we re-check for tip presence
if (idealQCVoltage < 90) if (idealQCVoltage < 90)
idealQCVoltage = calculateMaxVoltage(systemSettings.cutoutSetting); idealQCVoltage = calculateMaxVoltage(
seekQC(idealQCVoltage,systemSettings.voltageDiv); systemSettings.cutoutSetting);
seekQC(idealQCVoltage, systemSettings.voltageDiv);
#endif #endif
gui_solderingMode(0); // enter soldering mode gui_solderingMode(0); // enter soldering mode
buttonLockout = true; buttonLockout = true;
@@ -924,7 +925,7 @@ void startPIDTask(void const *argument __unused) {
currentlyActiveTemperatureTarget = 0; // Force start with no output (off). If in sleep / soldering this will currentlyActiveTemperatureTarget = 0; // Force start with no output (off). If in sleep / soldering this will
// be over-ridden rapidly // be over-ridden rapidly
history<int16_t> tempError = {{0}, 0, 0}; history<int16_t> tempError = { { 0 }, 0, 0 };
pidTaskNotification = xTaskGetCurrentTaskHandle(); pidTaskNotification = xTaskGetCurrentTaskHandle();
for (;;) { for (;;) {
@@ -943,7 +944,8 @@ void startPIDTask(void const *argument __unused) {
// to be unstable. Use a rolling average to dampen it. // to be unstable. Use a rolling average to dampen it.
// We overshoot by roughly 1/2 of 1 degree Fahrenheit. // We overshoot by roughly 1/2 of 1 degree Fahrenheit.
// This helps stabilize the display. // This helps stabilize the display.
int32_t tError = currentlyActiveTemperatureTarget - rawTemp + rawC/4; int32_t tError = currentlyActiveTemperatureTarget - rawTemp
+ rawC / 4;
tError = tError > INT16_MAX ? INT16_MAX : tError; tError = tError > INT16_MAX ? INT16_MAX : tError;
tError = tError < INT16_MIN ? INT16_MIN : tError; tError = tError < INT16_MIN ? INT16_MIN : tError;
tempError.update(tError); tempError.update(tError);
@@ -954,17 +956,21 @@ void startPIDTask(void const *argument __unused) {
// P term - total power needed to hit target temp next cycle. // P term - total power needed to hit target temp next cycle.
// thermal mass = 1690 milliJ/*C for my tip. // thermal mass = 1690 milliJ/*C for my tip.
// = Watts*Seconds to raise Temp from room temp to +100*C, divided by 100*C. // = Watts*Seconds to raise Temp from room temp to +100*C, divided by 100*C.
// divided by 20 to let I term dominate near set point. // we divide milliWattsNeeded by 20 to let the I term dominate near the set point.
// I should retune this, but don't want to do it until // This is necessary because of the temp noise and thermal lag in the system.
// the feed-forward temp adjustment is in place. // Once we have feed-forward temp estimation we should be able to better tune this.
#ifdef MODEL_TS100 #ifdef MODEL_TS100
const uint16_t mass = 1690 / 20; const uint16_t mass = 1690 / 20; // divide here so division is compile-time.
#endif #endif
#ifdef MODEL_TS80 #ifdef MODEL_TS80
const uint16_t mass = 1690 / 50; const uint16_t mass = 1690 / 50;
#endif #endif
int32_t milliWattsNeeded = tempToMilliWatts(tempError.average(), mass, rawC); int32_t milliWattsNeeded = tempToMilliWatts(tempError.average(),
mass, rawC);
// note that milliWattsNeeded is sometimes negative, this counters overshoot
// from I term's inertia.
milliWattsOut += milliWattsNeeded; milliWattsOut += milliWattsNeeded;
// I term - energy needed to compensate for heat loss. // I term - energy needed to compensate for heat loss.
@@ -1002,7 +1008,7 @@ void startMOVTask(void const *argument __unused) {
while (idealQCVoltage == 0) while (idealQCVoltage == 0)
osDelay(20); // To ensure we return after idealQCVoltage is setup osDelay(20); // To ensure we return after idealQCVoltage is setup
seekQC(idealQCVoltage,systemSettings.voltageDiv);// this will move the QC output to the preferred voltage to start with seekQC(idealQCVoltage, systemSettings.voltageDiv); // this will move the QC output to the preferred voltage to start with
#else #else
osDelay(250); // wait for accelerometer to stabilize osDelay(250); // wait for accelerometer to stabilize
@@ -1089,7 +1095,7 @@ void startMOVTask(void const *argument __unused) {
osDelay(100); // Slow down update rate osDelay(100); // Slow down update rate
#ifdef MODEL_TS80 #ifdef MODEL_TS80
if (currentlyActiveTemperatureTarget) { if (currentlyActiveTemperatureTarget) {
seekQC(idealQCVoltage,systemSettings.voltageDiv); // Run the QC seek again to try and compensate for cable V drop seekQC(idealQCVoltage, systemSettings.voltageDiv); // Run the QC seek again to try and compensate for cable V drop
} }
#endif #endif
} }

View File

@@ -17,6 +17,8 @@ history<uint16_t, oscillationPeriod> milliWattHistory = {{0}, 0, 0};
int32_t tempToMilliWatts(int32_t rawTemp, uint16_t mass, uint8_t rawC) { int32_t tempToMilliWatts(int32_t rawTemp, uint16_t mass, uint8_t rawC) {
// mass is in milliJ/*C, rawC is raw per degree C // mass is in milliJ/*C, rawC is raw per degree C
// returns milliWatts needed to raise/lower a mass by rawTemp
// degrees in one cycle.
int32_t milliJoules = mass * rawTemp / rawC; int32_t milliJoules = mass * rawTemp / rawC;
return milliJoules * hz; return milliJoules * hz;
} }