📄 flxhfd.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 + -