⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ctrl_temp.c

📁 MSP430开发的使用PID算法温度控制程序 本程序通过485总线与上位机通信发送和接受命令
💻 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 + -