/*************笔记****************
1、本QC方案采用PWM调节电压。
2、
3、
4、
5、
***********************************/
/* -----------------------------------------宏定义-----------------------------------------*/
#define Voltage_06_PWM 18 //0.6V的占空比
/* -----------------------------------------头文件-----------------------------------------*/
#include "main.h"
/* -----------------------------------------结构体定义-------------------------------------*/
/* -----------------------------------------全局变量定义-----------------------------------*/
xdata uint8_t QC_Mode_Choice = 0; //0--不使用QC协议 1--QC2.0 2--QC3.0
xdata uint8_t QC20_Voltage_Choice = 0; //0--默认5V 1--9V 2--12V 3--20V
/* -----------------------------------------应用程序---------------------------------------*/
void QC_Voltage_Switch(void)
{
if (QC_Mode_Choice == 1) //QC2.0
{
switch (QC20_Voltage_Choice)
{
case 0: //D+ -->0 D- -->0 ==>5V 或者 握手重置
USBDP_PWM(0);
USBDM_PWM(0);
break;
case 1://D+ -->3.3 D- -->0.6 ==>9V
USBDP_PWM(100);
USBDM_PWM(Voltage_06_PWM);
break;
case 2://D+ -->0.6 D- -->0.6 ==>12V
USBDP_PWM(Voltage_06_PWM);
USBDM_PWM(Voltage_06_PWM);
break;
case 3://D+ -->3.3 D- -->3.3 ==>20V 如果不支持则无变化
USBDP_PWM(100);
USBDM_PWM(100);
break;
default:
break;
}
}
else if (QC_Mode_Choice == 2)//QC3.0
{
//D+ -->0.6 D- -->3.3 ==>进入QC3.0模式或者连续模式 (充电头如果不支持那么)
USBDP_PWM(Voltage_06_PWM);
USBDM_PWM(100);
}
}
void QC30_Add_Voltage(void)
{
if (QC_Mode_Choice == 2)
{
//D+ -->3.3 -->100ms -->D+ -->0.6 ==>QC3.0模式 增加电压
USBDP_PWM(100);
os_wait(K_IVL, 100, 0);//500ms
USBDP_PWM(Voltage_06_PWM);
}
}
void QC30_Reduce_Voltage(void)
{
if (QC_Mode_Choice == 2)
{
//D- -->0.6 -->100ms -->D- -->3.3 ==>QC3.0模式 减少电压
USBDM_PWM(100);
os_wait(K_IVL, 100, 0);//500ms
USBDM_PWM(Voltage_06_PWM);
}
}
#ifndef _QC3_0_H
#define _QC3_0_H
/* -----------------------------------------宏定义-----------------------------------------*/
#define Config_USBDP_CH 4
// <0=> PWM0 <1=> PWM1 <2=> PWM2 <3=> PWM3 <4=> PWM4 <5=> PWM5
#define Config_USBDM_CH 4
// <0=> PWM0 <1=> PWM1 <2=> PWM2 <3=> PWM3 <4=> PWM4 <5=> PWM5
#define USBDP_PWM(Num) PWM_InputData(Config_USBDP_CH, (((Config_PWM_Cycle+1)/100)*Num)); //Num代表百分比
#define USBDM_PWM(Num) PWM_InputData(Config_USBDM_CH, (((Config_PWM_Cycle+1)/100)*Num)); //Num代表百分比
/* -----------------------------------------头文件-----------------------------------------*/
#include "main.h"
/* -----------------------------------------结构体定义-------------------------------------*/
/* -----------------------------------------全局变量定义-----------------------------------*/
extern xdata uint8_t QC_Mode_Choice; //0--不使用QC协议 1--QC2.0 2--QC3.0
extern xdata uint8_t QC20_Voltage_Choice; //0--默认5V 1--9V 2--12V 3--20V
/* -----------------------------------------应用程序---------------------------------------*/
void QC_Voltage_Switch(void);
void QC30_Add_Voltage(void);
void QC30_Reduce_Voltage(void);
#endif
/*********************************************
函数名:System_Configuration
功 能:内外设初始化
形 参:
返回值:
备 注:
作 者:薛建强
时 间:2019/06/06
**********************************************/
void System_Configuration(void)
{
uint8_t temp = 0;
SystemReg.RunningState = 1;
SystemReg.RunningState_Flag = 0;
Pwm_Configuration(); // PWM初始化
Exit_Configuration(); // 端口中断使能
Adc_Configuration(); // ADC初始化
SystemInit.ADC = 1;
Key_Configuration(); // 按键初始化
SystemReg.First_Start = 0;
LowPower_Tmr = 10;
SystemReg.RunningState = 1;//关机
}
/*********************************************
函数名:StartRunTask
功 能:OS运行起始任务
形 参:
返回值:
备 注:
作 者:薛建强
时 间:2019/06/06
**********************************************/
void StartRunTask() _task_ 0
{
System_Configuration(); // 初始化系统
os_create_task(1); //创建任务1
os_create_task(2); //创建任务2
QC_Voltage_Switch();//选择充电协议
for (;;)
{
if (SystemInit.PWM == 0)
{
PWM_INIT();//初始化灯光
SystemInit.PWM = 1;
}
if (SystemInit.QC_Handshake == 0)//QC协议握手
{
USBDP_PWM(Voltage_06_PWM);//D+ 0.6V
USBDM_PWM(0);//D- 0V
if (time < 250 && ++time > 7)
{
time = 0;
QC_Voltage_Switch();//选择充电协议
SystemInit.QC_Handshake = 1;
}
}
os_wait(K_IVL, 200, 0);//500ms
}
}
/*********************************************
函数名:StartKeyTask
功 能:按键扫描
形 参:
返回值:
备 注:
作 者:薛建强
时 间:2019/06/06
**********************************************/
void StartKeyTask(void) _task_ 1
{
uint8_t KEY_state = 0;
uint16_t time = 0;
uint8_t i = 0;
os_wait(K_IVL, 30, 0);//0.01s==100ms
for (;;)
{
KEY_state = Key_Scan(&Key1_Type, 1);
switch (KEY_state)
{
case 1://短按
if (SystemInit.QC_Handshake == 1)
{
if (QC_Mode_Choice == 1)
{
if (QC20_Voltage_Choice < 3 && ++QC20_Voltage_Choice > 2) QC20_Voltage_Choice = 0;
if (QC20_Voltage_Choice >= 3)
{
QC20_Voltage_Choice = 0;
}
QC_Voltage_Switch();//选择充电电压
}
else if (QC_Mode_Choice == 2)
{
QC30_Add_Voltage();
}
}
break;
case 2://长按
break;
case 3://双击
if (SystemInit.QC_Handshake == 1)
{
if (QC_Mode_Choice < 3 && ++QC_Mode_Choice > 2) QC_Mode_Choice = 0;
if (QC_Mode_Choice >= 3)
{
QC_Mode_Choice = 0;
}
QC_Voltage_Switch();//选择充电电压
}
break;
default:
break;
}
KEY_state = Key_Scan(&Key2_Type, 2);
switch (KEY_state)
{
case 1://短按
if (SystemInit.QC_Handshake == 1)
{
if (QC_Mode_Choice == 1)
{
if (QC20_Voltage_Choice > 0)
{
--QC20_Voltage_Choice;
}
QC_Voltage_Switch();//选择充电电压
}
if (QC_Mode_Choice == 2)
{
QC30_Reduce_Voltage();
}
}
break;
case 2://长按
break;
case 3://双击
if (SystemInit.QC_Handshake == 1)
{
if (QC_Mode_Choice < 3 && ++QC_Mode_Choice > 2) QC_Mode_Choice = 0;
if (QC_Mode_Choice >= 3)
{
QC_Mode_Choice = 0;
}
QC_Voltage_Switch();//选择充电电压
}
break;
default:
break;
}
os_wait(K_IVL, 10, 0);//0.01s==10ms
}
}
/* -----------------------------------------结构体定义-------------------------------------*/
typedef struct
{
uint8_t RunningState : 2; //0开机 1低功耗待机
uint8_t RunningState_Flag : 2; //0关闭效果 1开机/2关机效果
uint8_t First_Start : 2; //初始化完成: 0--初始化完成 1--未初始化
uint8_t Mode : 2; //0-- 1-- 2--
uint8_t Level : 3; //
uint8_t : 3;
} SYSTEM_REG;
typedef struct
{
uint8_t ADC : 1; //0--未初始化 1--已经初始化 (外围模拟采集)
uint8_t PWM : 1; //0--未初始化 1--已经初始化 (外围模拟输出)
uint8_t LED_And_LampEN : 1; //0--未初始化 1--已经初始化 (LED指示灯及灯光使能脚)
uint8_t : 5;
} SYSTEM_INIT;
/* -----------------------------------------全局变量定义-----------------------------------*/
extern SYSTEM_REG SystemReg;
extern SYSTEM_INIT SystemInit;