MoistureSoftware/Source/WS100T10.c

176 lines
4.5 KiB
C
Raw Normal View History

2025-09-28 09:17:22 +00:00
#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;
}
}
}