Add PID controller to oven driver module
This commit is contained in:
		@@ -22,6 +22,16 @@
 | 
				
			|||||||
#define __OVEN_DRIVER_H__
 | 
					#define __OVEN_DRIVER_H__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					#include <stdbool.h>
 | 
				
			||||||
 | 
					#include <reflow-controller/pid-controller.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct oven_pid_status {
 | 
				
			||||||
 | 
						bool active;
 | 
				
			||||||
 | 
						bool aborted;
 | 
				
			||||||
 | 
						float target_temp;
 | 
				
			||||||
 | 
						float current_temp;
 | 
				
			||||||
 | 
						uint64_t timestamp_last_run;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void oven_driver_init(void);
 | 
					void oven_driver_init(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -29,4 +39,14 @@ void oven_driver_set_power(uint8_t power);
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void oven_driver_disable(void);
 | 
					void oven_driver_disable(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void oven_pid_init(struct pid_controller *controller_to_copy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void oven_pid_handle(float target_temp, float current_temp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void oven_pid_stop();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void oven_pid_report_error(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const struct oven_pid_status *oven_pid_get_status(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* __OVEN_DRIVER_H__ */
 | 
					#endif /* __OVEN_DRIVER_H__ */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -45,4 +45,6 @@ float pid_sample(struct pid_controller *pid, float deviation);
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
float pid_get_control_output(const struct pid_controller *pid);
 | 
					float pid_get_control_output(const struct pid_controller *pid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int pid_copy(struct pid_controller *dest, const struct pid_controller *src);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* __PID_CONTROLLER_H__ */
 | 
					#endif /* __PID_CONTROLLER_H__ */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -37,7 +37,6 @@
 | 
				
			|||||||
#include <reflow-controller/digio.h>
 | 
					#include <reflow-controller/digio.h>
 | 
				
			||||||
#include "fatfs/shimatta_sdio_driver/shimatta_sdio.h"
 | 
					#include "fatfs/shimatta_sdio_driver/shimatta_sdio.h"
 | 
				
			||||||
#include <reflow-controller/temp-converter.h>
 | 
					#include <reflow-controller/temp-converter.h>
 | 
				
			||||||
#include <reflow-controller/pid-controller.h>
 | 
					 | 
				
			||||||
#include <stm-periph/stm32-gpio-macros.h>
 | 
					#include <stm-periph/stm32-gpio-macros.h>
 | 
				
			||||||
#include <stm-periph/clock-enable-manager.h>
 | 
					#include <stm-periph/clock-enable-manager.h>
 | 
				
			||||||
#include <stm-periph/uart.h>
 | 
					#include <stm-periph/uart.h>
 | 
				
			||||||
@@ -61,7 +60,6 @@ static void setup_nvic_priorities()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/* Process parameters are defined static globally to be watched in debugger from any context */
 | 
					/* Process parameters are defined static globally to be watched in debugger from any context */
 | 
				
			||||||
static float target_temperature;
 | 
					static float target_temperature;
 | 
				
			||||||
static struct pid_controller pid;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
FATFS fs;
 | 
					FATFS fs;
 | 
				
			||||||
FATFS *fs_ptr = &fs;
 | 
					FATFS *fs_ptr = &fs;
 | 
				
			||||||
@@ -219,9 +217,6 @@ int main()
 | 
				
			|||||||
	shell_handle = shell_init(write_shell_callback);
 | 
						shell_handle = shell_init(write_shell_callback);
 | 
				
			||||||
	shell_print_motd(shell_handle);
 | 
						shell_print_motd(shell_handle);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pid_init(&pid, 0.1, 0.1, 4.0, 0.0, 100.0, 40.0, 0.25);
 | 
					 | 
				
			||||||
	pid_zero(&pid);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	while (1) {
 | 
						while (1) {
 | 
				
			||||||
		sd_card_mounted = mount_sd_card_if_avail(sd_card_mounted);
 | 
							sd_card_mounted = mount_sd_card_if_avail(sd_card_mounted);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,6 +21,17 @@
 | 
				
			|||||||
#include <reflow-controller/oven-driver.h>
 | 
					#include <reflow-controller/oven-driver.h>
 | 
				
			||||||
#include <reflow-controller/periph-config/oven-driver-hwcfg.h>
 | 
					#include <reflow-controller/periph-config/oven-driver-hwcfg.h>
 | 
				
			||||||
#include <stm-periph/clock-enable-manager.h>
 | 
					#include <stm-periph/clock-enable-manager.h>
 | 
				
			||||||
 | 
					#include <reflow-controller/systick.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static struct pid_controller oven_pid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static struct oven_pid_status oven_pid_current_status = {
 | 
				
			||||||
 | 
						.active = false,
 | 
				
			||||||
 | 
						.aborted = false,
 | 
				
			||||||
 | 
						.target_temp = 0.0f,
 | 
				
			||||||
 | 
						.current_temp = 0.0f,
 | 
				
			||||||
 | 
						.timestamp_last_run = 0ULL
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void oven_driver_init()
 | 
					void oven_driver_init()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -57,3 +68,47 @@ void oven_driver_disable()
 | 
				
			|||||||
	rcc_manager_disable_clock(&RCC->AHB1ENR, BITMASK_TO_BITNO(OVEN_CONTROLLER_PORT_RCC_MASK));
 | 
						rcc_manager_disable_clock(&RCC->AHB1ENR, BITMASK_TO_BITNO(OVEN_CONTROLLER_PORT_RCC_MASK));
 | 
				
			||||||
	rcc_manager_disable_clock(&RCC->APB1ENR, BITMASK_TO_BITNO(OVEN_CONTROLLER_TIM_RCC_MASK));
 | 
						rcc_manager_disable_clock(&RCC->APB1ENR, BITMASK_TO_BITNO(OVEN_CONTROLLER_TIM_RCC_MASK));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void oven_pid_init(struct pid_controller *controller_to_copy)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						pid_copy(&oven_pid, controller_to_copy);
 | 
				
			||||||
 | 
						oven_pid.output_sat_min = 0.0f;
 | 
				
			||||||
 | 
						oven_pid.output_sat_max = 100.0f;
 | 
				
			||||||
 | 
						oven_pid_current_status.timestamp_last_run = 0ULL;
 | 
				
			||||||
 | 
						oven_pid_current_status.active = true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void oven_pid_handle(float target_temp, float current_temp)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						float pid_out;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (oven_pid_current_status.active) {
 | 
				
			||||||
 | 
							if (systick_ticks_have_passed(oven_pid_current_status.timestamp_last_run,
 | 
				
			||||||
 | 
										      (uint64_t)(oven_pid.sample_period * 1000))) {
 | 
				
			||||||
 | 
								pid_out = pid_sample(&oven_pid, target_temp - current_temp);
 | 
				
			||||||
 | 
								oven_driver_set_power((uint8_t)pid_out);
 | 
				
			||||||
 | 
								oven_pid_current_status.timestamp_last_run = systick_get_global_tick();
 | 
				
			||||||
 | 
								oven_pid_current_status.active = true;
 | 
				
			||||||
 | 
								oven_pid_current_status.target_temp = target_temp;
 | 
				
			||||||
 | 
								oven_pid_current_status.current_temp = current_temp;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void oven_pid_report_error()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						oven_pid_current_status.active = false;
 | 
				
			||||||
 | 
						oven_pid_current_status.aborted = true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const struct oven_pid_status *oven_pid_get_status()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return &oven_pid_current_status;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void oven_pid_stop()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						oven_pid_current_status.active = false;
 | 
				
			||||||
 | 
						oven_pid_current_status.target_temp = 0.0f;
 | 
				
			||||||
 | 
						oven_pid_current_status.current_temp = 0.0f;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,6 +19,7 @@
 | 
				
			|||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <reflow-controller/pid-controller.h>
 | 
					#include <reflow-controller/pid-controller.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void pid_init(struct pid_controller *pid, float k_deriv, float k_int, float k_p, float output_sat_min, float output_sat_max, float integral_max, float sample_period)
 | 
					void pid_init(struct pid_controller *pid, float k_deriv, float k_int, float k_p, float output_sat_min, float output_sat_max, float integral_max, float sample_period)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -38,6 +39,16 @@ void pid_init(struct pid_controller *pid, float k_deriv, float k_int, float k_p,
 | 
				
			|||||||
	pid_zero(pid);
 | 
						pid_zero(pid);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int pid_copy(struct pid_controller *dest, const struct pid_controller *src)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (!dest || !src)
 | 
				
			||||||
 | 
							return -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						memcpy(dest, src, sizeof(struct pid_controller));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void pid_zero(struct pid_controller *pid)
 | 
					void pid_zero(struct pid_controller *pid)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	pid->control_output = 0.0f;
 | 
						pid->control_output = 0.0f;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user