代码拉取完成,页面将自动刷新
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);
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。