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