From 388e023fe33f9bc103bfacf1cac2bf72a5dfe8c2 Mon Sep 17 00:00:00 2001 From: Axel Johansson Date: Sun, 29 Dec 2024 14:01:05 +0100 Subject: [PATCH 1/6] Implement 3-button mode --- AxxSolder_firmware/Core/Inc/main.h | 1 + AxxSolder_firmware/Core/Src/main.c | 82 ++++++++++++++++++++---------- 2 files changed, 56 insertions(+), 27 deletions(-) diff --git a/AxxSolder_firmware/Core/Inc/main.h b/AxxSolder_firmware/Core/Inc/main.h index 7778a59..097963b 100644 --- a/AxxSolder_firmware/Core/Inc/main.h +++ b/AxxSolder_firmware/Core/Inc/main.h @@ -56,6 +56,7 @@ typedef struct{ float serial_debug_print; float displayed_temp_filter; float startup_temp_is_previous_temp; + float three_button_mode; }Flash_values; /* USER CODE END Includes */ diff --git a/AxxSolder_firmware/Core/Src/main.c b/AxxSolder_firmware/Core/Src/main.c index 5e90f20..94b4c12 100644 --- a/AxxSolder_firmware/Core/Src/main.c +++ b/AxxSolder_firmware/Core/Src/main.c @@ -292,10 +292,11 @@ Flash_values default_flash_values = {.startup_temperature = 330, .temp_cal_450 = 450, .serial_debug_print = 0, .displayed_temp_filter = 5, - .startup_temp_is_previous_temp = 0}; + .startup_temp_is_previous_temp = 0, + .three_button_mode = 0}; /* List of names for settings menu */ -#define menu_length 26 +#define menu_length 27 char menu_names[menu_length][30] = { "Startup Temp °C ", "Temp Offset °C ", "Standby Temp °C ", @@ -319,6 +320,7 @@ char menu_names[menu_length][30] = { "Startup Temp °C ", "Serial DEBUG ", "Disp Temp. filter ", "Start at prev. temp ", + "3-button mode ", "-Load Default- ", "-Save and Reboot- ", "-Exit no Save- "}; @@ -640,7 +642,7 @@ void settings_menu(){ ((float*)&flash_values)[menu_cursor_position] = (float)old_value + (float)(TIM2->CNT - 1000.0) / 2.0 - (float)menu_cursor_position; } - if ((menu_cursor_position == 5) || (menu_cursor_position == 8) || (menu_cursor_position == 11) || (menu_cursor_position == 12) || (menu_cursor_position == 13) || (menu_cursor_position == 20) || (menu_cursor_position == 22)){ + if ((menu_cursor_position == 5) || (menu_cursor_position == 8) || (menu_cursor_position == 11) || (menu_cursor_position == 12) || (menu_cursor_position == 13) || (menu_cursor_position == 20) || (menu_cursor_position == 22) || (menu_cursor_position == 23)){ ((float*)&flash_values)[menu_cursor_position] = fmod(round(fmod(fabs(((float*)&flash_values)[menu_cursor_position]), 2)), 2); } else if (menu_cursor_position == 9){ @@ -955,14 +957,18 @@ void LCD_draw_main_screen(){ UG_DrawLine(0, 296, 240, 296, RGB_to_BRG(C_DARK_SEA_GREEN)); UG_DrawLine(0, 297, 240, 297, RGB_to_BRG(C_DARK_SEA_GREEN)); - - LCD_PutStr(11, 301, "PRESETS", FONT_arial_20X23, RGB_to_BRG(C_DARK_SEA_GREEN), RGB_to_BRG(C_BLACK)); - memset(DISPLAY_buffer, '\0', sizeof(DISPLAY_buffer)); - sprintf(DISPLAY_buffer, "%.0f", convert_temperature(flash_values.preset_temp_1)); - LCD_PutStr(130, 301, DISPLAY_buffer, FONT_arial_20X23, RGB_to_BRG(C_DARK_SEA_GREEN), RGB_to_BRG(C_BLACK)); - memset(DISPLAY_buffer, '\0', sizeof(DISPLAY_buffer)); - sprintf(DISPLAY_buffer, "%.0f", convert_temperature(flash_values.preset_temp_2)); - LCD_PutStr(190, 301, DISPLAY_buffer, FONT_arial_20X23, RGB_to_BRG(C_DARK_SEA_GREEN), RGB_to_BRG(C_BLACK)); + if(flash_values.three_button_mode == 1){ + LCD_PutStr(11, 301, "TEMP DOWN UP", FONT_arial_20X23, RGB_to_BRG(C_DARK_SEA_GREEN), RGB_to_BRG(C_BLACK)); + } + else{ + LCD_PutStr(11, 301, "PRESETS", FONT_arial_20X23, RGB_to_BRG(C_DARK_SEA_GREEN), RGB_to_BRG(C_BLACK)); + memset(DISPLAY_buffer, '\0', sizeof(DISPLAY_buffer)); + sprintf(DISPLAY_buffer, "%.0f", convert_temperature(flash_values.preset_temp_1)); + LCD_PutStr(130, 301, DISPLAY_buffer, FONT_arial_20X23, RGB_to_BRG(C_DARK_SEA_GREEN), RGB_to_BRG(C_BLACK)); + memset(DISPLAY_buffer, '\0', sizeof(DISPLAY_buffer)); + sprintf(DISPLAY_buffer, "%.0f", convert_temperature(flash_values.preset_temp_2)); + LCD_PutStr(190, 301, DISPLAY_buffer, FONT_arial_20X23, RGB_to_BRG(C_DARK_SEA_GREEN), RGB_to_BRG(C_BLACK)); + } UG_DrawFrame(208, 64, 232, 270, RGB_to_BRG(C_WHITE)); UG_DrawFrame(209, 65, 231, 269, RGB_to_BRG(C_WHITE)); @@ -1024,19 +1030,26 @@ void LCD_draw_main_screen(){ UG_DrawLine(315, 0, 315, 240, RGB_to_BRG(C_DARK_SEA_GREEN)); UG_DrawLine(316, 0, 316, 240, RGB_to_BRG(C_DARK_SEA_GREEN)); - LCD_PutStr(285, 75, "P", FONT_arial_20X23, RGB_to_BRG(C_DARK_SEA_GREEN), RGB_to_BRG(C_BLACK)); - LCD_PutStr(285, 97, "R", FONT_arial_20X23, RGB_to_BRG(C_DARK_SEA_GREEN), RGB_to_BRG(C_BLACK)); - LCD_PutStr(285, 119, "E", FONT_arial_20X23, RGB_to_BRG(C_DARK_SEA_GREEN), RGB_to_BRG(C_BLACK)); - LCD_PutStr(285, 141, "S", FONT_arial_20X23, RGB_to_BRG(C_DARK_SEA_GREEN), RGB_to_BRG(C_BLACK)); - LCD_PutStr(285, 163, "E", FONT_arial_20X23, RGB_to_BRG(C_DARK_SEA_GREEN), RGB_to_BRG(C_BLACK)); - LCD_PutStr(285, 185, "T", FONT_arial_20X23, RGB_to_BRG(C_DARK_SEA_GREEN), RGB_to_BRG(C_BLACK)); - LCD_PutStr(285, 207, "S", FONT_arial_20X23, RGB_to_BRG(C_DARK_SEA_GREEN), RGB_to_BRG(C_BLACK)); - memset(&DISPLAY_buffer, '\0', sizeof(DISPLAY_buffer)); - sprintf(DISPLAY_buffer, "%.0f", flash_values.preset_temp_1); - LCD_PutStr(272, 40, DISPLAY_buffer, FONT_arial_20X23, RGB_to_BRG(C_DARK_SEA_GREEN), RGB_to_BRG(C_BLACK)); - memset(&DISPLAY_buffer, '\0', sizeof(DISPLAY_buffer)); - sprintf(DISPLAY_buffer, "%.0f", flash_values.preset_temp_2); - LCD_PutStr(272, 10, DISPLAY_buffer, FONT_arial_20X23, RGB_to_BRG(C_DARK_SEA_GREEN), RGB_to_BRG(C_BLACK)); + if(flash_values.three_button_mode == 1){ + LCD_PutStr(269, 90, "DEC", FONT_arial_20X23, RGB_to_BRG(C_DARK_SEA_GREEN), RGB_to_BRG(C_BLACK)); + LCD_PutStr(269, 10, "INC", FONT_arial_20X23, RGB_to_BRG(C_DARK_SEA_GREEN), RGB_to_BRG(C_BLACK)); + } + else{ + LCD_PutStr(285, 75, "P", FONT_arial_20X23, RGB_to_BRG(C_DARK_SEA_GREEN), RGB_to_BRG(C_BLACK)); + LCD_PutStr(285, 97, "R", FONT_arial_20X23, RGB_to_BRG(C_DARK_SEA_GREEN), RGB_to_BRG(C_BLACK)); + LCD_PutStr(285, 119, "E", FONT_arial_20X23, RGB_to_BRG(C_DARK_SEA_GREEN), RGB_to_BRG(C_BLACK)); + LCD_PutStr(285, 141, "S", FONT_arial_20X23, RGB_to_BRG(C_DARK_SEA_GREEN), RGB_to_BRG(C_BLACK)); + LCD_PutStr(285, 163, "E", FONT_arial_20X23, RGB_to_BRG(C_DARK_SEA_GREEN), RGB_to_BRG(C_BLACK)); + LCD_PutStr(285, 185, "T", FONT_arial_20X23, RGB_to_BRG(C_DARK_SEA_GREEN), RGB_to_BRG(C_BLACK)); + LCD_PutStr(285, 207, "S", FONT_arial_20X23, RGB_to_BRG(C_DARK_SEA_GREEN), RGB_to_BRG(C_BLACK)); + memset(&DISPLAY_buffer, '\0', sizeof(DISPLAY_buffer)); + sprintf(DISPLAY_buffer, "%.0f", flash_values.preset_temp_1); + LCD_PutStr(272, 40, DISPLAY_buffer, FONT_arial_20X23, RGB_to_BRG(C_DARK_SEA_GREEN), RGB_to_BRG(C_BLACK)); + memset(&DISPLAY_buffer, '\0', sizeof(DISPLAY_buffer)); + sprintf(DISPLAY_buffer, "%.0f", flash_values.preset_temp_2); + LCD_PutStr(272, 10, DISPLAY_buffer, FONT_arial_20X23, RGB_to_BRG(C_DARK_SEA_GREEN), RGB_to_BRG(C_BLACK)); + } + UG_DrawFrame(8, 30, 32, 212, RGB_to_BRG(C_WHITE)); @@ -1076,7 +1089,12 @@ void LCD_draw_earth_fault_popup(){ void get_set_temperature(){ if(custom_temperature_on == 0){ TIM2->CNT = clamp(TIM2->CNT, MIN_SELECTABLE_TEMPERATURE, MAX_SELECTABLE_TEMPERATURE); - sensor_values.set_temperature = (uint16_t)(TIM2->CNT/2) * 2; + if(flash_values.three_button_mode == 1){ + sensor_values.set_temperature = (uint16_t)(TIM2->CNT); + } + else{ + sensor_values.set_temperature = (uint16_t)(TIM2->CNT/2) * 2; + } } } @@ -1159,12 +1177,22 @@ void handle_button_status(){ /* Set "set temp" to preset temp 1 */ if(SW_2_pressed == 1){ SW_2_pressed = 0; - TIM2->CNT = flash_values.preset_temp_1; + if(flash_values.three_button_mode == 1){ + TIM2->CNT -= 5; + } + else{ + TIM2->CNT = flash_values.preset_temp_1; + } } /* Set "set temp" to preset temp 2 */ if(SW_3_pressed == 1){ SW_3_pressed = 0; - TIM2->CNT = flash_values.preset_temp_2; + if(flash_values.three_button_mode == 1){ + TIM2->CNT += 5; + } + else{ + TIM2->CNT = flash_values.preset_temp_2; + } } } From 83eb1c510f97472b51cc1a3ae11a29bcf2e92c18 Mon Sep 17 00:00:00 2001 From: Axel Johansson Date: Thu, 2 Jan 2025 20:48:48 +0100 Subject: [PATCH 2/6] Put user flash at ADDR_FLASH_PAGE_63 instead of ADDR_FLASH_PAGE_62 --- AxxSolder_firmware/Core/Inc/flash.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AxxSolder_firmware/Core/Inc/flash.h b/AxxSolder_firmware/Core/Inc/flash.h index 2770e10..702908f 100644 --- a/AxxSolder_firmware/Core/Inc/flash.h +++ b/AxxSolder_firmware/Core/Inc/flash.h @@ -81,7 +81,7 @@ bool FlashWrite(Flash_values *flash_values); #define ADDR_FLASH_PAGE_63 ((uint32_t)0x0801F800) /* Base @ of Page 63, 2 Kbytes */ -#define FLASH_USER_START_ADDR ((uint32_t)ADDR_FLASH_PAGE_62) /* Start @ of user Flash area */ +#define FLASH_USER_START_ADDR ((uint32_t)ADDR_FLASH_PAGE_63) /* Start @ of user Flash area */ #define FLASH_USER_END_ADDR (ADDR_FLASH_PAGE_63 + FLASH_PAGE_SIZE - 1) /* End @ of user Flash area */ /* Function prototypes -------------------------------------------------------*/ From a3936f3551d233bc2a670a92eadc8445b4a8d617 Mon Sep 17 00:00:00 2001 From: Axel Johansson Date: Thu, 2 Jan 2025 20:49:30 +0100 Subject: [PATCH 3/6] Remove soft_reset and bump version number --- AxxSolder_firmware/Core/Src/main.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/AxxSolder_firmware/Core/Src/main.c b/AxxSolder_firmware/Core/Src/main.c index 94b4c12..da02429 100644 --- a/AxxSolder_firmware/Core/Src/main.c +++ b/AxxSolder_firmware/Core/Src/main.c @@ -42,7 +42,7 @@ /* USER CODE BEGIN PTD */ uint8_t fw_version_major = 3; uint8_t fw_version_minor = 2; -uint8_t fw_version_patch = 4; +uint8_t fw_version_patch = 5; //#define PID_TUNING DEBUG_VERBOSITY_t debugLevel = DEBUG_INFO; @@ -1495,7 +1495,6 @@ int main(void) FlashWrite(&default_flash_values); beep(1); //Beep once to indicate default parameters written to flash HAL_Delay(100); - HAL_NVIC_SystemReset(); } /* Read flash data */ From f2ab9945d4cae5fd96fd63df0a3c352ff7c93948 Mon Sep 17 00:00:00 2001 From: Axel Johansson Date: Thu, 2 Jan 2025 20:51:03 +0100 Subject: [PATCH 4/6] Move requested_power filter call to display update --- AxxSolder_firmware/Core/Src/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AxxSolder_firmware/Core/Src/main.c b/AxxSolder_firmware/Core/Src/main.c index da02429..005cc2c 100644 --- a/AxxSolder_firmware/Core/Src/main.c +++ b/AxxSolder_firmware/Core/Src/main.c @@ -1400,7 +1400,6 @@ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc){ update_heater_PWM(); /* Compute PID */ PID_Compute(&TPID); - sensor_values.requested_power_filtered = clamp(Moving_Average_Compute(sensor_values.requested_power, &requested_power_filtered_filter_struct), 0, PID_MAX_OUTPUT); thermocouple_measurement_done = 1; } if ((hadc->Instance == ADC2) && (current_measurement_done == 0)){ @@ -1702,6 +1701,7 @@ int main(void) /* Update display */ if(HAL_GetTick() - previous_millis_display >= interval_display){ + sensor_values.requested_power_filtered = clamp(Moving_Average_Compute(sensor_values.requested_power, &requested_power_filtered_filter_struct), 0, PID_MAX_OUTPUT); update_display(); previous_millis_display = HAL_GetTick(); } From 02e9a72afb677da33b27cde709ed751f75fee990 Mon Sep 17 00:00:00 2001 From: Axel Johansson Date: Thu, 2 Jan 2025 21:24:01 +0100 Subject: [PATCH 5/6] Update SerialPlot_settings --- Other/SerialPlot_settings.ini | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Other/SerialPlot_settings.ini b/Other/SerialPlot_settings.ini index 1a755c5..1a85cd6 100644 --- a/Other/SerialPlot_settings.ini +++ b/Other/SerialPlot_settings.ini @@ -1,7 +1,7 @@ [MainWindow] size=@Size(2560 1377) pos=@Point(-1 -8) -activePanel=TextView +activePanel=DataFormat hidePanels=false maximized=true state=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\0\0\0\n\0\0\0\x5\x16\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\x1\0\0\0\x2\0\0\0\x3\0\0\0\f\0t\0\x62\0P\0l\0o\0t\x1\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\x1a\0t\0\x62\0P\0o\0r\0t\0\x43\0o\0n\0t\0r\0o\0l\x1\0\0\0i\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\x10\0t\0\x62\0R\0\x65\0\x63\0o\0r\0\x64\x1\0\0\x2\x5\xff\xff\xff\xff\0\0\0\0\0\0\0\0) @@ -33,7 +33,7 @@ filterPrefix= numOfChannels=9 numberFormat=float endianness=little -frameStart=AA BB +frameStart=AA fixedSize=false frameSize=36 checksum=false @@ -149,4 +149,4 @@ timestampFormat=seconds [UpdateCheck] periodicCheck=true -lastCheck=2024-11-03 +lastCheck=2025-01-02 From 6d99afa276ef3c0f32b62bb7aedb0216ae7d5f9a Mon Sep 17 00:00:00 2001 From: Axel Johansson Date: Thu, 2 Jan 2025 21:24:27 +0100 Subject: [PATCH 6/6] Move PID_Compute out from interrupt context --- AxxSolder_firmware/Core/Src/main.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/AxxSolder_firmware/Core/Src/main.c b/AxxSolder_firmware/Core/Src/main.c index 005cc2c..e7bbcfb 100644 --- a/AxxSolder_firmware/Core/Src/main.c +++ b/AxxSolder_firmware/Core/Src/main.c @@ -1398,8 +1398,6 @@ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc){ HAL_ADC_Stop_DMA(&hadc1); get_thermocouple_temperature(); update_heater_PWM(); - /* Compute PID */ - PID_Compute(&TPID); thermocouple_measurement_done = 1; } if ((hadc->Instance == ADC2) && (current_measurement_done == 0)){ @@ -1529,7 +1527,7 @@ int main(void) /* Initiate PID controller */ PID(&TPID, &sensor_values.thermocouple_temperature, &sensor_values.requested_power, &PID_setpoint, 0, 0, 0, _PID_CD_DIRECT); //PID parameters are set depending on detected handle by set_handle_values() PID_SetMode(&TPID, _PID_MODE_AUTOMATIC); - PID_SetSampleTime(&TPID, PID_UPDATE_INTERVAL, 0); //Set PID sample time to "PID_UPDATE_INTERVAL" to make sure PID is calculated every time it is called + PID_SetSampleTime(&TPID, PID_UPDATE_INTERVAL, 0); // Set PID update time to "PID_UPDATE_INTERVAL" PID_SetOutputLimits(&TPID, 0, PID_MAX_OUTPUT); // Set max and min output limit PID_SetILimits(&TPID, 0, 0); // Set max and min I limit PID_SetIminError(&TPID,PID_ADD_I_MIN_ERROR); @@ -1633,6 +1631,9 @@ int main(void) previous_sensor_update_low_update = HAL_GetTick(); } + /* Compute PID */ + PID_Compute(&TPID); + /* switch */ switch(sensor_values.current_state) { case RUN: {