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

📄 flxhfd.c

📁 一个用PIC16F716编写的风力发电机的控制器程序
💻 C
字号:
/*
*********************************************************************************************************
* Copyright (c) 2007, 新通电气
* All rights reserved.
* 
* 文件名称:flxhfd.c
* 文件标识:无
* 摘    要:
*  
* 当前版本:1.0
* 作    者:樊忠 
* 完成日期:2007年4月15日
*********************************************************************************************************
*/


/*
*********************************************************************************************************
* 	
* 包含头文件	
* 	
*********************************************************************************************************
*/

#include <pic16f716.h>
#include "flxhfd.h"

#define	__PIC16F716_H


//__CONFIG(XT & WDTDIS & PWRTDIS & PROTECT & BORDIS); 


/*
*********************************************************************************************************
* 	
* 全局变量定义	
* 	
*********************************************************************************************************
*/


/*
*********************************************************************************************************
* 
* 函数名称:void interrupt  isr(void)
*	
* 输入变量:无
* 
* 输出变量:无
* 
* 功能描述:中断服务函数
*	
*********************************************************************************************************
*/
void interrupt isr(void) //@ 0x10		
{
	if(TMR1IF) 
	{
	Timer1Counter++;
	if (Timer1Counter >= ONESECOND) 
		{
			Flag_regTimer = 1;		//秒钟到时间标志
			Timer1Counter = 0;
		}
		TMR1H = 0x0b;				
		TMR1L = 0xdb;				//预设时间寄存器初值
		TMR1IF = 0;
	}

	if(TMR2IF)					//timer2中断标志
	{
		TMR2IF = 0;
		TMR2   = 0;
	}
	if(INTF)					//转速中断标志
	{
		Plus_WindSpeed ++;			//转一圈有一个脉冲输入
		INTF = 0;				// 中断标志位清零
	}
		
}
/*
*********************************************************************************************************
* 
* 函数名称:void DelayTime(UWORD wTimer, UBYTE ucTimes)
*	
* 输入变量:延时时间长短数据
* 
* 输出变量:无
* 
* 功能描述:不精确延时
*********************************************************************************************************
*/

void DelayTime(UWORD wTimer, UWORD ucTimes)
{
	UWORD i;
	for (i = ucTimes;i>0;i--);
	for (i = wTimer;i>0;i--);
	
} 

/*
*********************************************************************************************************
* 
* 函数名称:void AdConvertResult(UBYTE channel)
*	
* 输入变量:需要采样的模拟量的通道 
* 
* 输出变量:无
* 
* 功能描述:获得需要采样的模拟量的数据
*	
*********************************************************************************************************
*/
void AdConvertResult(UBYTE channel)
{
	if(channel == 0x01)		//通道值为通道1
	{
		CHS0 = 1;		//选择通道1(充电电压值判定)采样
		CHS1 = 0;		//第一位通道选择位置零
		CHS2 = 0;		//第二位通道选择位置零
	}
	if(channel == 0x02)		//通道值为通道2
	{
		CHS0 = 0;		//选择通道2(风机电压值判定)采样
		CHS1 = 1;		//第一位通道选择位置1
		CHS2 = 0;		//第二位通道选择位置零
	}
		GODONE = 1;		//启动转换
		while(GODONE);		//等待转换结束
		AdResult = ADRES;	//存储结果
}
/*
*********************************************************************************************************
* 
* 函数名称:UBYTE SortAdConResult(void)
*	
* 输入变量:采样的模拟量的数据 
* 
* 输出变量:滤波后实际使用的模拟量
* 
* 功能描述:模拟量的数据软件滤波获得使用为判据的模拟量的数据(中值滤波)
*	
*********************************************************************************************************
*/
UBYTE SortAdConResult(void)
{
	UBYTE AdVer;			//定义临时变量
       	AdVer  =    AdResult;		//结束排序取平均值
       	return	AdVer;			//返回平均值
}
/*
*********************************************************************************************************
* 
* 函数名称:void PwmAdjust(UWORD Duty)
*	
* 输入变量:10位占空比数据
* 
* 输出变量:无
* 
* 功能描述:调整输出PWM占空比
*	
*********************************************************************************************************
*/
void PwmAdjust(UBYTE Duty)
{
	CCPR1L = Duty;			//8位占空比	
}
/*
*********************************************************************************************************
* 
* 函数名称:void main(void)
*	
* 输入变量:无
* 
* 输出变量:无
* 
* 功能描述:主函数
*	
*********************************************************************************************************
*/
void main(void)
{
//	CLRWDT();			//禁止看门狗	
//	FOSC1 =	1;			//振荡器模式选择位
//	FOSC0 =	0;				
//	CONFIG_ADDR	=	0x82;	//HS振荡器>=4MHz 
/////////////timer0 init//////////////////////////////////////
	PEIE = 0;			//禁止所有未被屏蔽的外设中断
  	GIE = 0;			//禁止所有未被屏蔽的中断
	POR = 1;			//上电复位标志位
	BOR = 1;			//上电复位标志位
	PSA = 0;			//TIMER0预分频 1/256
	PS2 = 1;
	PS1 = 1;
	PS0 = 1;
	T0CS = 0;			//选择内部指令周期时钟
   	TMR0 = 0x00;			//选择TMR0寄存器清零
//	TMR0IE=0;			//TMR0 溢出使能关闭
	T0IE = 0;			//禁止TIMER0溢出中断
	T0IF = 0;			//TIMER0中断标志清零
/////////////timer1 init//////////////////////////////////////
	T1CKPS1	= 1;			//TIMER1预分频 1/8
	T1CKPS0	= 1;
	TMR1CS = 0;			//使用内部时钟(FOSC/4)
	TMR1H = 0x0b;			//0x3c;			
	TMR1L = 0xdb;			//0xaf;		//预设时间寄存器初值
	TMR1ON = 1;			//TMR1 溢出使能	
	T1OSCEN = 0;			//关闭振荡器
	TMR1IE = 0;			//允许TIMER1溢出中断
	TMR1IF = 0;			//TIMER1中断标志清零
/////////////timer2 init//////////////////////////////////////使用timer2	
	T2CKPS1 = 0;			//TIMER2预分频 1/1
	T2CKPS0 = 0;
	TMR2 = 0x00;
	TMR2ON = 1;			//TMR2打开
	TMR2IE = 1;			//允许中断
	TMR2IF = 0;			//TIMER2中断标志清零
////////////ioport init//////////////////////////////////////使用PWM
	ERROROUTPUT = OUTPUTDIRECT;	//过载指示输出
	ADDLOADOUT  = OUTPUTDIRECT;	//泄荷电阻接通切断控制
	WINDVOLTAGE = INPUTDIRECT;	//风机电压采样输入
	BATTCHECK   = INPUTDIRECT;	//电池电压采样输入
	WINDROLLSPEEDIN = INPUTDIRECT;	//风机转速采样输入

	PWMOUTPUT = INPUTDIRECT;	//PWM输出时初始化先设置为输入
/////////////PWM INIT//////////////////////////////////////////使用pwm
	PR2	= 0x3f;			//频率约为78k赫兹
	CCP1CON = 0x0c;			//PWM 模式,单输出, P1A 调制
	PwmAdjust(0x0010);		//小占空比
	PRSEN = 1;			//允许自动重新启动
	PSSAC0 = 0;			//关闭时为低电平输出
	PSSAC1 = 0;			//关闭时为低电平输出
	ECCPAS0 = 0;
	ECCPAS2 = 0;
	ECCPASE = 1;			//关闭PWM
////////////external init//////////////////////////////////////		
	INTE = 0;			//不允许外部中断
//   	TXIE = 0; 	        	//发送中断屏蔽 
//   	RCIE = 0;              		//接收中断屏蔽
   	RBIE = 0;			//RB口电平中断屏蔽
   	CCP1IE = 0;			//禁止CCP1 中断
   	INTF = 0;			//外部中断标志清零
   	RBIF = 0;			//RB口电平中断标志清零	
   	CCP1IF = 0;			//CCP1中断标志清零
/////////////ad convert init////////////////////////////////////
//	BATTCHECK = INPUTDIRECT;    	//电池充电电压输入模拟量端口
	ADCON1 = 0x00;			//配置模拟引脚/ 参考电压
					//PCFG2:PCFG0 AN3/RA3 AN2/RA2 AN1/RA1 AN0/RA0 VREF
					//    0x0       A        A       A       A    VDD
	ADCS1 = 0;
	ADCS0 = 0;			//A/D 转换时钟选择位FOSC/2
	ADON = 1;			//A/D 开启	
	ADIE = 0;			//不允许AD转换中断
	ADIF = 0;			//AD转换中断标志清零
////////////////////////////////////////////////////////////////////////////////
	AdValue = 0x00;
	PWMOUTPUT = OUTPUTDIRECT;	//PWM输出
	ECCPASE = 0;			//启动PWM
	PEIE = 1;			//开放所有未被屏蔽的外设中断
  	GIE = 1;			//使能所有未被屏蔽的中断
////////////////////////////////////////////////////////////////////////////////
while(1)
	{
		AdConvertResult(BATTCHECKCHANNEL);		//电池电压采样通道
		AdValue = SortAdConResult();
		if(AdValue < BATTCHARGEHIGH)
		{
			ECCPASE = 0;				//启动PWM
			Plus_Width += WIDTH_STEP;		//增加脉宽
			if(Plus_Width >= PULS_WIDTH_MAX)
			{
				Plus_Width =  PULS_WIDTH_MAX;
			}	
			PwmAdjust(Plus_Width);			//调整脉宽
		}
		if(AdValue > BATTCHARGEHIGH)
		{
			Plus_Width -= WIDTH_STEP;
			if(Plus_Width <= PULS_WIDTH_MIN)	//减小脉宽
			{
				ECCPASE = 1;			//关闭PWM
				Plus_Width =  PULS_WIDTH_MIN;
			}
			PwmAdjust(Plus_Width);			//调整脉宽
		}

		if(Flag_regTimer)				//一秒时间到
		{
			if(Plus_WindSpeed >= PULS_CONTROL_START)	//高于50r/s
			{						
				ADDLOADOUTPUT = 0;			//开通泄荷电阻
				ERRORDISPOUT  = 1;			//开通泄荷指示
			}
			if(Plus_WindSpeed <= PULS_CONTROL_OVER)		//低于30r/s
			{						
				ADDLOADOUTPUT = 1;			//关闭泄荷电阻
				ERRORDISPOUT  = 0;			//关闭泄荷指示
			}
			Flag_regTimer	= 0;
			Plus_WindSpeed 	= 0;
		}
	
	}
}

⌨️ 快捷键说明

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