加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
笔记 2.68 KB
一键复制 编辑 原始数据 按行查看 历史
fat0x 提交于 2024-04-25 12:12 . a1
123
1.PID计算和电池板数据读取都采用了多线程。
2.温度的读取与PID计算周期保持了一致
void xTask_PIDCalc_Temprature(void * pvParameters)
{
//控制逻辑:
//1.PID计算采用多线程不停计算,计算间隔时间在InitoPID_Temprature()中设置(PID_Calc_Period),默认100ms计算一次(lib\PID\PIDv1.cpp中的默认值)。
// 该线程不停循环,每个循环10次(计为0-9周期),计算完成后立即更新PWM输出
//2.因为电热偶和加热丝是串在一起的,所以要读取热偶的电压需要关闭PWM输出并等待一段时间(10ms?)。所以第10周期先停掉输出,等10ms,然后测温,再重新打开输出
uint8_t cycleCouter = 0;
while(true)
{
vTaskDelay(10);//xTask中必须要有delay(10)以上的语句,给IDLE_TASK喂狗的机会,否则会导致CPU因为WDT原因重启
//只要PID计算周期长于10ms,此处的延时对周期几乎无影响,因为PID计算中还要判断周期时间是否到了
if(g_pageLevelID==0){//在主页状态
if (oTipControl.PIDCalc_Temprature()){//PID计算,注意计算间隔时间,大于间隔时间才返回true计算有效。意味着cycleCouter每计算间隔时间才增加1
if(cycleCouter < (g_PIDLoopTimes - 1))//0-8
{//加热
oTipControl.setPower(true); //设置PWM占空比
cycleCouter++;
}
else if(cycleCouter == (g_PIDLoopTimes-1))//9
{//测温
oTipControl.setPower(false);
vTaskDelay(10);
oTipControl.readTemprature(); //测温
oTipControl.setPower(true);
cycleCouter = 0;//复位
}
}
}
else if ( g_pageLevelID==1 ){//在设置状态
if (oTipControl.PIDCalc_Voltage(g_Cal_voltage[g_Cal_CurCalPoint])){//PID计算,注意计算间隔时间,大于间隔时间才返回true计算有效。意味着cycleCouter每计算间隔时间才增加1
//Serial.println("PIDCalc_Voltage return true!");
if(cycleCouter < (g_PIDLoopTimes - 2))//0-7
{//加热
oTipControl.setPower(true,true); //设置PWM占空比
cycleCouter++;
}
else if(cycleCouter == (g_PIDLoopTimes - 2))//8
{//停止加热
oTipControl.setPower(false);
delay(2);//等待5ms才能测温,这有可能导致PID周期拉长一点点,没关系
cycleCouter++;
}
else if(cycleCouter == (g_PIDLoopTimes - 1))//9
{//测温
oTipControl.readTemprature(); //测温
cycleCouter = 0;//复位
}
}
}
//Serial.printf("Thread xTask_PIDCalc_Temprature cycleCouter=%d\n",cycleCouter);
}
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化