?? 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 + -