Refactor split main.c
This commit is contained in:
100
Src/temp_control.c
Normal file
100
Src/temp_control.c
Normal file
@ -0,0 +1,100 @@
|
||||
#include "temp_control.h"
|
||||
#include "app_state.h" /* TO7, TO7_PID */
|
||||
|
||||
/* --- PID_Controller_Temp и Advanced_Controller_Temp из main.c --- */
|
||||
|
||||
uint16_t Advanced_Controller_Temp(LDx_SetupTypeDef * LDx_curr_setup, LDx_ParamTypeDef * LDx_results, uint8_t num)
|
||||
{
|
||||
// Main idea:
|
||||
// I is responsible to maintaining constant temperature difference between laser and room temperature.
|
||||
// As room temperature can be approximated as constant at current-varying time -- I should be kept constant too.
|
||||
// As current through laser diode heats it -- we can estimate excessive power on laser diode and trim peltier current according to it.
|
||||
// So, equation should be look like this:
|
||||
// x_output = x_output_original + I(laser)*(a + (t - b)c)
|
||||
// t -- cycle phase
|
||||
// a,b,c -- constants
|
||||
//
|
||||
// How can we control laser diode temperature?
|
||||
// -- We can set laser to fixed current at the time we need to measure.
|
||||
// Then we should measure wavelength.
|
||||
// Calibration sequence:
|
||||
// 1) n
|
||||
|
||||
|
||||
|
||||
int e_pid;
|
||||
float P_coef_current;//, I_coef_current;
|
||||
float e_integral;
|
||||
int x_output;
|
||||
|
||||
e_pid = (int) LDx_results->LD_CURR_TEMP - (int) LDx_curr_setup->LD_TEMP;
|
||||
|
||||
e_integral = LDx_results->e_integral;
|
||||
|
||||
if((e_pid < 3000) && (e_pid > - 3000)){
|
||||
e_integral += LDx_curr_setup->I_coef_temp * (float)(e_pid) * (float)(TO7 - TO7_PID) / (float) 100;//100 - timer is too fast
|
||||
}
|
||||
P_coef_current = LDx_curr_setup->P_coef_temp;
|
||||
|
||||
if (e_integral > 32000){
|
||||
e_integral = 32000;
|
||||
}
|
||||
else if (e_integral < - 32000){
|
||||
e_integral = -32000;
|
||||
}
|
||||
LDx_results->e_integral = e_integral;
|
||||
|
||||
x_output = 32768 + P_coef_current * e_pid + (int)e_integral;//32768 - P_coef_current * e_pid - (int)e_integral;//
|
||||
|
||||
if(x_output < 1000){
|
||||
x_output = 8800;
|
||||
}
|
||||
else if(x_output > 56800){
|
||||
x_output = 56800;
|
||||
}
|
||||
|
||||
if (num==2)
|
||||
TO7_PID = TO7;//Save current time only on 2nd laser
|
||||
|
||||
return (uint16_t)x_output;
|
||||
}
|
||||
|
||||
|
||||
uint16_t PID_Controller_Temp(LDx_SetupTypeDef * LDx_curr_setup, LDx_ParamTypeDef * LDx_results, uint8_t num)
|
||||
{
|
||||
int e_pid;
|
||||
float P_coef_current;//, I_coef_current;
|
||||
float e_integral;
|
||||
int x_output;
|
||||
|
||||
e_pid = (int) LDx_results->LD_CURR_TEMP - (int) LDx_curr_setup->LD_TEMP;
|
||||
|
||||
e_integral = LDx_results->e_integral;
|
||||
|
||||
if((e_pid < 3000) && (e_pid > - 3000)){
|
||||
e_integral += LDx_curr_setup->I_coef_temp * (float)(e_pid) * (float)(TO7 - TO7_PID) / (float) 100;//100 - timer is too fast
|
||||
}
|
||||
P_coef_current = LDx_curr_setup->P_coef_temp;
|
||||
|
||||
if (e_integral > 32000){
|
||||
e_integral = 32000;
|
||||
}
|
||||
else if (e_integral < - 32000){
|
||||
e_integral = -32000;
|
||||
}
|
||||
LDx_results->e_integral = e_integral;
|
||||
|
||||
x_output = 32768 + P_coef_current * e_pid + (int)e_integral;//32768 - P_coef_current * e_pid - (int)e_integral;//
|
||||
|
||||
if(x_output < 1000){
|
||||
x_output = 8800;
|
||||
}
|
||||
else if(x_output > 56800){
|
||||
x_output = 56800;
|
||||
}
|
||||
|
||||
if (num==2)
|
||||
TO7_PID = TO7;//Save current time only on 2nd laser
|
||||
|
||||
return (uint16_t)x_output;
|
||||
}
|
||||
Reference in New Issue
Block a user