📄 pwm.i
字号:
// 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 + -