📄 ctrl_temp.c
字号:
#include <msp430x14x.h>
#include <math.h>
#include "Ctrl_Temp.h"
#include "ds18b20.h"
#include "pwm_timer_b.h"
#include "Time_A.h"
//---------------------Temperature------------------------
float fTempOffset = 0.f; // 温度偏差
float fErr0,fErr1,fErr2; // fErr0 - > 当前偏差 fErr1 ->上次偏差 fErr2-> 上上次偏差
double PWM2_Duty = 0;
volatile unsigned int NUMBER;
float PID_Adj(float fErr) //PWM波的占空比
{
double fD1Ek = 0; // 偏差一阶
double fD2Ek = 0; // 偏差二阶
double fDUk = 0; // 输出增量
// 计算一阶和二阶偏差
fErr0 = fErr;
fD1Ek = fErr0 - fErr1;
fD2Ek = fErr0 - 2 * fErr1 + fErr2;
if (fErr < 0.f)
fErr = -fErr;
// 保存偏差值
fErr2 = fErr1;
fErr1 = fErr0;
// 计算增量PID输出(比例和微分)
fDUk = fD1Ek + Kd * fD2Ek;
// 误差在一个范围内时增加积分项
if(fErr < 3.f)
fDUk += Ki * fErr0;
// 计算增量PID输出(比例系数)
fDUk *= Kp;
//fDUk=Kp*fD1Ek+Ki*fErr0+Kd*fD2Ek;
// 累加输出
PWM2_Duty += fDUk;
//if (PWM2_Duty > 1.1)
// PWM2_Duty = 1.1;
//else if (PWM2_Duty < -0.2)
// PWM2_Duty = -0.2;
// 计算输出值
fDUk = PWM2_Duty;
if (fDUk > 1.0)
fDUk = 1.0;
else if (fDUk < 0.0)
fDUk = 0.0;
else if (fDUk > 0)
fDUk = sqrt(fDUk);
return (float)fDUk;
}
void CtrlTemp()
{
if( 'C' == Address() )
/* Ctrlhot();
else*/
Ctrlcold();
}
void Ctrlhot() //加热
{
float fduk;
float temp=NewTemperature();
temp=fTempSet-temp; //高温标志
if(temp<-1.f)
SetScale(0);
else if(temp>3.f)
SetScale(PF*LIMIT);
else
{
fduk=(float)PID_Adj(temp);
if (fduk>=LIMIT)
fduk=LIMIT;
SetScale(fduk*PF); //设置占空比
}
//SetFre(PF); //设置周期
GoPwm(1);
}
void Ctrlcold() //降温
{
float fduk;
float temp;
//Kp = 0.5f; // 比例系数
//Ki = 0.1; // 积分系数
//Kd = 0.01; // 微分系数
//fTempSet = 16.0; // 设定低温度
//fTempOffset = 0.f; // 温度偏差
temp=NewTemperature();
temp=temp-fTempSet; //低温标志
if(temp>2.f)
SetScale(1);
else if(temp<-1.f)
SetScale(0);
else
{
fduk=(float)PID_Adj(temp);
SetScale(fduk); //设置占空比
}
//SetFre(PF1);
//SetScale(0.5); //设置占空比
GoPwm(2);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -