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

📄 pwm.i

📁 智能充电参考程序 可以控制整个充电过程希望对大家有帮助
💻 I
📖 第 1 页 / 共 3 页
字号:
    // 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
}


/*******************************************************************************************************
** 函数名称: bat_discharge
** 功能描述: 电池放电, 仅支持电流模式
** 输入参数: INT8U bat_no:
**           INT16U discharge_value:
** 输出参数: 无
********************************************************************************************************/
void bat_discharge(unsigned char bat_no,unsigned int 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(unsigned char bat_no, unsigned char cur_or_vol,unsigned int 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运算出来的差值
********************************************************************************************************/
int cell_pid0(void)
{
    int 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运算出来的差值
********************************************************************************************************/
int cell_pid1(void)
{
    int 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 + -