176 lines
4.5 KiB
C
176 lines
4.5 KiB
C
|
|
#include "APPDEF.h"
|
|||
|
|
#include "i2c.h"
|
|||
|
|
uint16_t ACCtrl(uint16_t Percent) /*0-1000*/
|
|||
|
|
{
|
|||
|
|
uint8_t Out = 0;
|
|||
|
|
if (Percent < 10) {
|
|||
|
|
Out = 0;
|
|||
|
|
} else if (Percent > 990) {
|
|||
|
|
Out = 1;
|
|||
|
|
} else {
|
|||
|
|
Out = 127u - (uint8_t)((float)Percent * 0.128f);
|
|||
|
|
}
|
|||
|
|
WS100T10_Ctrl(Out);
|
|||
|
|
return Percent;
|
|||
|
|
}
|
|||
|
|
void ACCMD(bool cmd)
|
|||
|
|
{
|
|||
|
|
if (!cmd) {
|
|||
|
|
GPIO_ResetBits(GPIOA, GPIO_Pin_15);
|
|||
|
|
|
|||
|
|
} else {
|
|||
|
|
GPIO_SetBits(GPIOA, GPIO_Pin_15);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
uint16_t Percent[4];
|
|||
|
|
uint16_t GetPercent[4];
|
|||
|
|
uint16_t PercentOld[4];
|
|||
|
|
void _task_ACCtrl(const void *p_arg)
|
|||
|
|
{
|
|||
|
|
WS100T10_Init();
|
|||
|
|
for (;;) {
|
|||
|
|
if (Percent[0] != PercentOld[0]) {
|
|||
|
|
GetPercent[0] = ACCtrl(Percent[0]);
|
|||
|
|
PercentOld[0] = Percent[0];
|
|||
|
|
}
|
|||
|
|
osDelay(300);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
osThreadDef(_task_ACCtrl, osPriorityNormal, 1u, 0u);
|
|||
|
|
|
|||
|
|
void AC_CTRL_Init(void)
|
|||
|
|
{
|
|||
|
|
osThreadCreate(osThread(_task_ACCtrl), NULL);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//
|
|||
|
|
//
|
|||
|
|
//
|
|||
|
|
extern float Temperature;
|
|||
|
|
float Kp, Ki, Kd;
|
|||
|
|
static enum enumHeatOp_State { // <09><><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>״̬
|
|||
|
|
eShut,
|
|||
|
|
eRunning,
|
|||
|
|
eShutReq
|
|||
|
|
} volatile HeatOp_State;
|
|||
|
|
float HeatOutValue;
|
|||
|
|
float OutputMax = 1;
|
|||
|
|
static void HeatPID_Task(void)
|
|||
|
|
{
|
|||
|
|
float SetValue, RunValue, OutValue = 0.0f;
|
|||
|
|
float Ek_1, Ek = 0.0f;
|
|||
|
|
float Up = 0.0f, Ui = 0.0f, Ud = 0.0f;
|
|||
|
|
float Upid = 0.0f;
|
|||
|
|
float Initout = 0.0f;
|
|||
|
|
float UpidSetGain = 0.800f;
|
|||
|
|
uint32_t SaveTick;
|
|||
|
|
SetValue = Set.TempSet;
|
|||
|
|
Kp = 0.06;
|
|||
|
|
Ki = 0.00029;
|
|||
|
|
Kd = 1.0;
|
|||
|
|
HeatOutValue = 0.0f;
|
|||
|
|
Percent[0] = 0;
|
|||
|
|
osDelay(500u);
|
|||
|
|
ACCMD(true);
|
|||
|
|
// <09><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ
|
|||
|
|
osDelay(500u);
|
|||
|
|
SaveTick = osKernelSysTick();
|
|||
|
|
const uint32_t oneTick = osKernelSysTickMicroSec(1000u);
|
|||
|
|
uint32_t now, lostTick, delayCount;
|
|||
|
|
while (eRunning == HeatOp_State) {
|
|||
|
|
|
|||
|
|
RunValue = Temperature;
|
|||
|
|
// PID<49><44><EFBFBD><EFBFBD>
|
|||
|
|
Ek_1 = Ek;
|
|||
|
|
Ek = (SetValue - RunValue);
|
|||
|
|
if (Ek > 20.0f) {
|
|||
|
|
HeatOutValue = OutValue = OutputMax;
|
|||
|
|
Percent[0] = OutValue * 1000;
|
|||
|
|
} else {
|
|||
|
|
Up = Kp * Ek;
|
|||
|
|
Ui += Ki * Ek;
|
|||
|
|
|
|||
|
|
if (Ui < -1.0f) { Ui = -1.0f; }
|
|||
|
|
if (Ui > +1.0f) { Ui = +1.0f; }
|
|||
|
|
Ud = (Ud * 0.667f) + (Kd * (Ek - Ek_1) * (1.0f - 0.667f));
|
|||
|
|
Upid = (Upid * UpidSetGain) + (Up + Ui + Ud) * (1.0f - UpidSetGain);
|
|||
|
|
OutValue = Upid + Initout;
|
|||
|
|
|
|||
|
|
// PID<49><44><EFBFBD><EFBFBD>
|
|||
|
|
if (OutValue < 0.0f) { OutValue = 0.0f; }
|
|||
|
|
if (OutValue > OutputMax) { OutValue = OutputMax; }
|
|||
|
|
HeatOutValue = OutValue;
|
|||
|
|
Percent[0] = OutValue * 1000;
|
|||
|
|
}
|
|||
|
|
// <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ
|
|||
|
|
now = osKernelSysTick();
|
|||
|
|
// <09><><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD>ȥ<EFBFBD><C8A5>tick<63><6B>ʱ<EFBFBD><CAB1>λ
|
|||
|
|
lostTick = (uint32_t)(now + oneTick - 1u - SaveTick) / oneTick;
|
|||
|
|
// <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>(<28>趨<EFBFBD><E8B6A8><EFBFBD><EFBFBD>ʱ<EFBFBD>䣺300ms)
|
|||
|
|
if (lostTick < 300u) {
|
|||
|
|
delayCount = 300u - lostTick;
|
|||
|
|
} else { // <09>Ѿ<EFBFBD><D1BE><EFBFBD>ȥ<EFBFBD><C8A5>ʱ<EFBFBD>䳬<EFBFBD><E4B3AC><EFBFBD>趨<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
|||
|
|
SaveTick = now;
|
|||
|
|
delayCount = 30u;
|
|||
|
|
}
|
|||
|
|
osDelay(delayCount);
|
|||
|
|
SaveTick += delayCount * oneTick;
|
|||
|
|
}
|
|||
|
|
// PID ֹͣ
|
|||
|
|
HeatOutValue = 0.0f;
|
|||
|
|
Percent[0] = 0;
|
|||
|
|
osDelay(500u);
|
|||
|
|
ACCMD(false);
|
|||
|
|
HeatOp_State = eShut;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/********************************** <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> ***********************************
|
|||
|
|
* <EFBFBD>ӵ<EFBFBD><EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*******************************************************************************/
|
|||
|
|
static void HeatTask_Socket(void const *p_arg)
|
|||
|
|
{ // <09><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
HeatPID_Task();
|
|||
|
|
|
|||
|
|
osThreadTerminate(osThreadGetId());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
osThreadDef(HeatTask_Socket, osPriorityHigh, 1, 0);
|
|||
|
|
|
|||
|
|
static void HeatTask_Init()
|
|||
|
|
{
|
|||
|
|
osThreadCreate(osThread(HeatTask_Socket), NULL);
|
|||
|
|
}
|
|||
|
|
/********************************** <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> ***********************************
|
|||
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>/// <09><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*******************************************************************************/
|
|||
|
|
// #include "BIOS.H"
|
|||
|
|
|
|||
|
|
void Pump_OutCmd(bool NewState)
|
|||
|
|
{
|
|||
|
|
if (!NewState) { // <09><><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9> // osThread_SetReady;
|
|||
|
|
HeatOp_State = eShutReq;
|
|||
|
|
} else if (eRunning == HeatOp_State) { // <09><><EFBFBD>ã<F3BFAAB1><C3A3><EFBFBD><EFBFBD>ò<EFBFBD>û<EFBFBD>й<EFBFBD>?!
|
|||
|
|
;
|
|||
|
|
} else { // <09><><EFBFBD>ã<F3BFAAB1><C3A3><EFBFBD><EFBFBD><EFBFBD>֪<EFBFBD><D6AA><EFBFBD>ǹص<C7B9>
|
|||
|
|
HeatOp_State = eRunning;
|
|||
|
|
HeatTask_Init();
|
|||
|
|
}
|
|||
|
|
// if( HeatOp_State == eRunning)
|
|||
|
|
// lightopen();
|
|||
|
|
// else
|
|||
|
|
// lightclose();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <09><>ȡָ<C8A1><D6B8><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD>õĵ<C3B5><C4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[0.0 ~ 1.0]
|
|||
|
|
float Pump_GetOutput(void)
|
|||
|
|
{
|
|||
|
|
{
|
|||
|
|
if (eShutReq == HeatOp_State) {
|
|||
|
|
return 0.0f;
|
|||
|
|
} else {
|
|||
|
|
return HeatOutValue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|