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

📄 pwm.c~

📁 智能充电参考程序 可以控制整个充电过程希望对大家有帮助
💻 C~
字号:
/****************************************Copyright (c)**************************************************
**                              智 能 充 电 器 开 发 小 组
**                                     OurAVR 论坛
**                                   QQ 群: 26052247 
**
**                               http://www.ouravr.com/bbs
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: PWM.c
**创   建   人: Trinove
**最后修改日期: 2008年01月13日
**描        述: PWM 输出的底层函数  FOR AVR MCU / Mega16
**              
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: Trinove
** 版  本: v0.01
** 日 期: 2008年01月13日
** 描 述: 原始版本
**
**--------------历史版本信息------------------------------------------------------------------------------
** 修改人: martin7wind
** 日 期: 2008年02月24日
** 描 述: For 智能充电器
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 吕海安
** 日 期: 2008年03月03日
** 描 述: 修改格式,归档
**
**------------------------------------------------------------------------------------------------------
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 村长 aleyn.wu
** 日 期: 2008年3月3日
** 描 述: 修改了一些BUG,使本项目能在CVAVR下编译通过
**         
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "config.h"
#include "PWM.h"


#define CHARGER_CHANNEL_1_OCR   OCR1A
#define CHARGER_CHANNEL_2_OCR   OCR1B


// 根据全局数据表的PWM相关定义
#define PID_FLAG     18

#define CHARGE       1
#define DisCHARGE    2

// 打开或关闭 Timer1
#define START_CHARGE	     TCCR1B = 0x0A
#define STOP_CHARGE	     TCCR1B = 0x00

// 更改端口的输入输出特性,从而控制放电
#define STOP_DisCHARGE	     BIT_CLR(DDRB, PB3);BIT_CLR(DDRD,PD7)
#define START_DisCHARGE      BIT_SET(DDRB, PB3);BIT_SET(DDRD,PD7)

//BAT0
#define BAT0_PWM_STATUS             40
#define BAT0_PWM_VOL_OR_CUR         41  // 0: vol, 1: cur
#define BAT0_PWM_OUTPUT_STATUS      42  // 0: 连续, 1: 断续
#define BAT0_PWM_BAT0               43
#define BAT0_PID_P                  45
#define BAT0_PID_I                  47
#define BAT0_PID_D                  49
#define BAT0_VOL_SET                51
#define BAT0_CUR_SET                53
#define BAT0_PCHARGE_CHARGE_TIME    55
#define BAT0_PCHARGE_DiCHARGE_TIME  56
#define BAT0_PCHARGE_PAUSE_TIME     57

//BAT1
#define BAT1_PWM_STATUS             61
#define BAT1_PWM_VOL_OR_CUR         62  // 0: vol, 1: cur
#define BAT1_PWM_OUTPUT_STATUS      63  // 0: 连续, 1: 断续
#define BAT1_PWM_BAT1               64
#define BAT1_PID_P                  66
#define BAT1_PID_I                  68
#define BAT1_PID_D                  70
#define BAT1_VOL_SET                73
#define BAT1_CUR_SET                75
#define BAT1_PCHARGE_CHARGE_TIME    76
#define BAT1_PCHARGE_DiCHARGE_TIME  77
#define BAT1_PCHARGE_PAUSE_TIME     78

#define VOL 1
#define CUR 2


/*******************************************************************************************************
** 函数名称: pwm_port_init
** 功能描述: PWM 输出端口定义初始化
** 输入参数: 无
** 输出参数: 无
********************************************************************************************************/
void pwm_port_init()
{
    BIT_SET(DDRD, PD5);
    BIT_SET(DDRD, PD4);
    
    BIT_SET(DDRB,PB3);
    BIT_SET(DDRD,PD7);
}

/*******************************************************************************************************
** 函数名称: timer0_init
** 功能描述: 定时器 T0 初始化
** 输入参数: 无
** 输出参数: 无
********************************************************************************************************/
void timer0_init(void)
{  
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: 15.625 kHz
    // Mode: Fast PWM top=FFh
    // OC0 output: Non-Inverted PWM
    
    TCCR0  = 0x00;  // 停止定时器
    TCNT0  = 0x00;  // 初始值   16.384 mS
    OCR0   = 0x00;  // 匹配值
    TIMSK |= 0x01;  // 中断允许
    //TCCR0  = 0x6D;  // 启动定时器  
    TCCR0  = 0x4D;  // 启动定时器
}

/*******************************************************************************************************
** 函数名称: timer0_init
** 功能描述: 定时 T1 初始化
**           OCR1A 升序匹配0,降序匹配1
**           OCR1B 升序匹配0,降序匹配1
**           8 的预分频,3.906KHZ
**           9 位快速PWM
** 输入参数: 无
** 输出参数: 无
********************************************************************************************************/
void timer1_init(void)
{    
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 16000.000 kHz
// Mode: Fast PWM top=01FFh
// OC1A output: Non-Inv.
// OC1B output: Non-Inv.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off

    TCCR1B = 0x00;  // 停止定时器
    TIMSK |= 0x00;  // 中断允许
    TCNT1H = 0x00;
    TCNT1L = 0x00;  // 初始值
    OCR1AH = 0x00;
    OCR1AL = 0x00;  // 匹配 A 值
    OCR1BH = 0x00;
    OCR1BL = 0x7F;  // 匹配 B 值
    ICR1H  = 0xFF;
    ICR1L  = 0xFF;  // 输入捕捉匹配值
    TCCR1A = 0xA2;
    TCCR1B = 0x09;  // 启动定时器
}       



/*******************************************************************************************************
** 函数名称: timer0_init
** 功能描述: 定时器 T2 初始化
** 输入参数: 无
** 输出参数: 无
********************************************************************************************************/
void timer2_init(void)
{
    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: 15.625 kHz
    // Mode: Fast PWM top=FFh
    // OC2 output: Non-Inverted PWM
    
    TCCR2  = 0x00;  // 停止定时器
    ASSR   = 0x00;  // 异步时钟模式
    TCNT2  = 0x00;  // 初始值
    OCR2   = 0x7f;  // 匹配值
    TIMSK |= 0x00;  // 中断不允许
    //TCCR2  = 0x6F;  // 启动定时器  
    TCCR2 = 0x4F;
}

/*******************************************************************************************************
** 函数名称: pwm_init
** 功能描述: PWM 初始化
** 输入参数: 无
** 输出参数: 无
********************************************************************************************************/
void pwm_init()
{
    pwm_port_init(); // 端口初始化
    
    timer1_init();   // 两路充电 PWM 
    timer0_init();   // 第一路放电 PWM,主时钟
    timer2_init();   // 第二路放电 PWM
}

#define BAT0   1
#define BAT1   2

/*******************************************************************************************************
** 函数名称: bat_discharge
** 功能描述: 电池放电, 仅支持电流模式
** 输入参数: INT8U bat_no:
**           INT16U discharge_value:
** 输出参数: 无
********************************************************************************************************/
void bat_discharge(INT8U bat_no,INT16U discharge_value)
{
    
/*    STOP_CHARGE;    // 关闭充电
    
    START_DisCHARGE;    // 开始放电
    
    if(bat_no == BAT0)
    {
        memory[BAT0_PWM_STATUS - 1] = DisCHARGE;
        memory[BAT0_CUR_SET - 1] = discharge_value >> 8;
        memory[BAT0_CUR_SET] = discharge_value & 0x00ff;
    }
    else
    {
        memory[BAT1_PWM_STATUS - 1] = DisCHARGE;
        memory[BAT1_CUR_SET - 1] = discharge_value >> 8;
        memory[BAT1_CUR_SET] = discharge_value & 0x00ff;
    }
*/
}

/*******************************************************************************************************
** 函数名称: bat_charge_set
** 功能描述: 电池充电设置
** 输入参数: INT8U bat_no: 电池 1 或 2
**           INT8U cur_or_vol: 电流控制还是电压控制
**           INT16U charge_data_set: 电流或电压设置值
** 输出参数: 无
********************************************************************************************************/
void bat_charge_set(INT8U bat_no, INT8U cur_or_vol,INT16U charge_data_set)
{
/*    //关闭放电
    STOP_DisCHARGE;
    
    START_CHARGE;
    
    if(bat_no == BAT0)
    {
        memory[BAT0_PWM_STATUS - 1] = CHARGE;
        
        memory[BAT0_PWM_VOL_OR_CUR - 1] = cur_or_vol;
    
        if(cur_or_vol==VOL)
        {
            memory[BAT0_VOL_SET - 1] = charge_data_set >> 8;
            memory[BAT0_VOL_SET] = charge_data_set & 0x00ff;
        }
        else if(cur_or_vol==CUR)
        {
            memory[BAT0_CUR_SET - 1] = charge_data_set >> 8;
            memory[BAT0_CUR_SET] = charge_data_set & 0x00ff;
        }
        else
        {
            
        }
    }

    else if(bat_no == BAT1)
    {
        memory[BAT1_PWM_STATUS - 1] = CHARGE;
        
        memory[BAT1_PWM_VOL_OR_CUR - 1] = cur_or_vol;
        
        if(cur_or_vol == VOL)
        {
            memory[BAT1_VOL_SET - 1] = charge_data_set >> 8;
            memory[BAT1_VOL_SET] = charge_data_set & 0x00ff;
        }
        else if(cur_or_vol == CUR)
        {
            memory[BAT1_CUR_SET - 1] = charge_data_set >> 8;
            memory[BAT1_CUR_SET] = charge_data_set & 0x00ff;
        }
        else
        {
        //
        }			
    }*/
}

/*******************************************************************************************************
** 函数名称: cell_pid0
** 功能描述: 电池1 PID 运算
** 输入参数: 无
** 输出参数: PID运算出来的差值
********************************************************************************************************/
INT16S cell_pid0(void)
{/*
    INT16S result;
    
    if(memory[BAT0_PWM_STATUS - 1] == CHARGE)
    {
        if(memory[BAT0_PWM_VOL_OR_CUR-1] == VOL)
        {
            filter_adc(BAT_0_VOL_CH);
            
            result = Memory_Char_to_Int(BAT_0_BASE + BAT_0_VOL - 1) - Memory_Char_to_Int(BAT0_VOL_SET - 1);
        }
        else if(memory[BAT0_PWM_VOL_OR_CUR - 1] == CUR)
        {
            filter_adc(BAT_0_CUR_CH);
            
            result = Memory_Char_to_Int(BAT_0_BASE + BAT_0_CUR - 1) - Memory_Char_to_Int(BAT0_CUR_SET - 1);
        }
        else
        {
        
        }
    }
    else if(memory[BAT0_PWM_STATUS - 1] == DisCHARGE)
    {
        filter_adc(BAT_0_CUR_CH);
        
        result = Memory_Char_to_Int(BAT_0_BASE + BAT_0_CUR - 1) + Memory_Char_to_Int(BAT0_CUR_SET - 1);
    
    }
    else
    {
        //put_c(98);
    }
                  */
    return result;
}



/*******************************************************************************************************
** 函数名称: cell_pid1
** 功能描述: 电池2 PID 运算
** 输入参数: 无
** 输出参数: PID运算出来的差值
********************************************************************************************************/
INT16S cell_pid1(void)
{
    INT16S result;

    return result;
}



/*******************************************************************************************************
** 函数名称: cell_output
** 功能描述: 电池1、2  PWM  输出控制
**           根据需要调用相应的PID控制程序,由PID使能标志控制
** 输入参数: 无
** 输出参数: 无
********************************************************************************************************/
void cell_output(void)
{   /*
    INT16U pwm_value;
    INT8U temp;

    temp = OCR1AH;
    
    pwm_value = ((INT16U)temp) << 8;
    
    pwm_value |= OCR1AL;
    
    if(memory[18])  //进行PID运算控制PWM
    {
    
    }
    else  //直接进行PWM控制操作
    {
        if(cell_pid0() > 0)
        {		
            //put_c(98);
            if(memory[BAT0_PWM_STATUS - 1] == CHARGE)
            {	
                //put_c(97);
                if(pwm_value != 0x0000)					
                {
                    pwm_value--;
                }
                OCR1AH = (INT8U)(pwm_value >> 8);
        
                OCR1AL = (INT8U)(pwm_value & 0x00ff);
            }
            else if(memory[BAT0_PWM_STATUS - 1] == DisCHARGE)
            {
                if(OCR0 != 0xfe)
                {
                    OCR0 ++;
                }
            }
        }
        else
        {
            //put_c(97);
        
            if(memory[BAT0_PWM_STATUS - 1] == CHARGE)
            {
                if(pwm_value != 0xFFFF)					
                pwm_value++;
                
                OCR1AH = (INT8U)(pwm_value >> 8);
                
                OCR1AL = (INT8U)(pwm_value & 0x00ff);
            }
            else if(memory[BAT0_PWM_STATUS - 1] == DisCHARGE)
            {
                if(OCR2 != 0x01)
                {
                    OCR0 --;
                }
            }
        
        }
        
    }*/

}

/**************************************************************************************×*****************
**                                 END OF FILE
********************************************************************************************************/

⌨️ 快捷键说明

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