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

📄 main.c

📁 MSP430开发的使用PID算法温度控制程序 本程序通过485总线与上位机通信发送和接受命令
💻 C
字号:
//****************************************************************************\
//文件名:main.c
//描述: 控制主函数,使用MSP430F149A
//****************************************************************************/

#include <MSP430x14x.h>
#include "xieyi.h"
#include "Receiver.h"
#include "df_uart0.h"
#include "df_uart1.h"
#include "24c02.h"
#include "Time_A.h"
#include "pwm_timer_b.h"
#include "Ctrl_Temp.h"
#include "ds18b20.h"
#include "i2c.h"

float nTempperature;
float Kp ;				// 比例系数
float Ki ;				// 积分系数
float Kd ;				// 微分系数
float fTempSet ;			// 设定高温度


//函数声明区
void InitSys();
void Adrress_choose();

int main( void )
{
	//short i;
	//float temp=0;



		
	
	
	InitSys();		//系统初始化


	

	while(1)
	{	


		if (FRAME_OK())
			HandleCommand();		//如果上位机有信号,执行通信命令
		
		
		////nTempperature =GetTemperature();	
		
		
		/*{
			for(i=0;i<5;i++)
			temp+=GetTemperature();
			nTempperature=temp/5;
			temp=0;
			SendCommand("L&%f&",nTempperature);
		}					*/						//计算温度平均值				
			
			
		if (Ctrl_Temp_Flag == START_HEAT_COOL)		//如果中断标志为1
		{
			CtrlTemp();
			Ctrl_Temp_Flag = STOP_HEAT_COOL;
			
			nTempperature =GetTemperature();		//每2秒读一次温度,存起来
			
			SendCommand("L&%d&|PWM_Duty%f|FERR%f|Kp fD1Ek%f|Ki * fErr0%f|",(int)(nTempperature*10),PWM2_Duty,fErr0,(fErr0 - fErr1),(Ki * fErr0));
		}
		
	}
}

//****************************************************************************
//系统初始化函数
//描述:关闭看门狗,开XT2振荡器,选择MCLK、SMCLK为XT2,初始化其他外设
//调用:其他外设初始化函数
//****************************************************************************
void InitSys()
{
	unsigned int iq0;
	WDTCTL = WDTPW + WDTHOLD;               //关闭看门狗
	BCSCTL1&=~XT2OFF;                       //打开XT2振荡器
	do
	{
		IFG1 &= ~OFIFG;                     // 清除振荡器失效标志
		for (iq0 = 0xFF; iq0 > 0; iq0--);   // 延时,等待XT2起振
	}
	while ((IFG1 & OFIFG) != 0);            // 判断XT2是否起振

	BCSCTL2 =SELM_2+DIVS_0+SELS;			//选择MCLK、SMCLK为XT2
	{
           P5DIR = (BIT6|BIT4|BIT2);   
           P5OUT = BIT2;          /*lighten led*/
	}
	
	
	Uart0Init();                            //初始化串口0
	Uart1Init();                            //初始化串口1
	Start_I2C();							//启动I2C总线
	Init_DS18B20();
	InitTimeB();							//TimerB初始化
	InitTimeA();							//TimerA初始化
	GoTimer(1);								//启动TimerA定时器
	CtrlPwm3(1);							//启动风扇
	Adrress_choose();
	{
		/*P4SEL&=~BIT1;
		P4DIR|=BIT1;
		P4OUT|=BIT1;

		P4SEL&=~BIT2;
		P4DIR|=BIT2;
		P4OUT&=~BIT2;*/

	}
	

	_EINT();                                //打开全局中断控制
}
void  Adrress_choose()
{
	nAddress = Address();
	
	if( 'C' == Address() )
	//{
	//	NUMBER = 400;

	//    Kp = 0.007f;				// 比例系数
 //       Ki = 0.004;				// 积分系数
 //       Kd = 0.001;				// 微分系数
	//	fTempSet = 37.0;		
	//}
	//else
	{
		NUMBER = GetMsValue(10000);
		
		Kp = 0.4f;				// 比例系数
		Ki = 0.1;				// 积分系数
		Kd = 0.01;				// 微分系数
		fTempSet = 16.0;
	}	
		

	CtrlTemp();
	TimCh0 = HEAT_COOL_INTERVAL;
}

//****************************************************************************
//端口2中断函数
//****************************************************************************
#pragma vector=PORT2_VECTOR
__interrupt void Port2()
{
	if((P2IFG&BIT0) == BIT0)
	{
		P2IFG &= ~BIT0;                     //清除中断标志
	}
	else if((P2IFG&BIT1) ==BIT1)
	{
		P2IFG &= ~BIT1;                     //清除中断标志
	}
	else if((P2IFG&BIT2) ==BIT2)
	{
		P2IFG &= ~BIT2;                     //清除中断标志
	}
	else if((P2IFG&BIT3) ==BIT3)
	{
		P2IFG &= ~BIT3;                     //清除中断标志
	}
	else if((P2IFG&BIT4) ==BIT4)
	{
		P2IFG &= ~BIT4;                     //清除中断标志
	}
	else if((P2IFG&BIT5) ==BIT5)
	{
		P2IFG &= ~BIT5;                     //清除中断标志
	}
	else if((P2IFG&BIT6) ==BIT6)
	{
		P2IFG &= ~BIT6;                     //清除中断标志
	}
	else
	{
		P2IFG &= ~BIT7;                     //清除中断标志
	}
	LPM3_EXIT;                              //退出中断后退出低功耗模式。
}

//****************************************************************************
//看门狗定时器中断函数
//****************************************************************************
#pragma vector=WDT_VECTOR
__interrupt void WatchDog()
{
	LPM3_EXIT;                              //退出中断后退出低功耗模式。
}

//****************************************************************************
//比较器A中断函数
//****************************************************************************
#pragma vector=COMPARATORA_VECTOR
__interrupt void ComparatorA()
{
	LPM3_EXIT;                              //退出中断后退出低功耗模式。
}

//****************************************************************************
//定时器B中断函数
//中断源:CC0
//****************************************************************************
#pragma vector=TIMERB0_VECTOR
__interrupt void TimerB0()
{
	LPM3_EXIT;                              //退出中断后退出低功耗模式。
}

//****************************************************************************
//不可屏蔽中断函数
//****************************************************************************
#pragma vector=NMI_VECTOR
__interrupt void Nmi()
{
	if((IFG1&OFIFG)==OFIFG)                 //振荡器失效
	{
		IFG1 &= ~OFIFG;
	}
	else if((IFG1&NMIIFG)==NMIIFG)          //RST/NMI不可屏蔽中断
	{
		IFG1 &= ~NMIIFG;
	}
	else if((FCTL3&ACCVIFG)==ACCVIFG)       //存储器非法访问
	{
		FCTL3 &= ~ACCVIFG;
	}
	LPM3_EXIT;                              //退出中断后退出低功耗模式。
}








⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -