单片机 N76E003 实现 QC2.0 QC3.0 USB Type-C协议

发布者:TranquilJourney最新更新时间:2022-08-15 来源: csdn关键字:单片机  N76E003 手机看文章 扫描二维码
随时随地手机看文章

原理图

/*************笔记****************

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)

[1] [2]
关键字:单片机  N76E003 引用地址:单片机 N76E003 实现 QC2.0 QC3.0 USB Type-C协议

上一篇:N76E003][MCP4017][MCP4018][MCP4019] 数字电位器 使用方法
下一篇:[N76E003][PCA9540BD][IIC扩展器] 一组IIC变两组IIC 使用方法

推荐阅读最新更新时间:2024-11-10 11:42

如何在STM32单片机中加入RDP功能
沿用之前CM3核的STM32F10X系列的加入RDP功能,之后在Segger的Unsecured Chip或者Unlock STM32的Cmd无法进行去除RDP,而Unlock STM32则提示无法识别该型号。尝试了很多方法,依然无法对其进行Remove RDP,估计是型号比较新,Segger还未完全支持吧。所用 的Segger为官方最新的Release跟Beta版本V4.65d跟V4.67c/ 估计可用的方法有以下三种: 1、配置Boot区,用System bootloader启动,Boot1 = 0,Boot0=1,然后用串口ISP的A上位机对其进行去除读保护; 2、配置Boot区,用SRAM运行程序,在SRAM的主程序中
[单片机]
采用ARM Cortex-M3单片机和DSP的逆变电源设计
  引 言   在电气智能化发展无处不在的今天, 无数用电场合离不开逆变电源系统( Inverted Pow er Supply System,IPS) 为现场设备提供稳定的高质量电源, 特别在如通信机房、服务器工作站、交通枢纽调度中心、医院、电力、工矿企业等对电源保障有苛刻要求的场合。许多IPS产品因遵循传统设计而不符合或落后于现代电源理念,突出表现为控制模块的单一复杂化, 控制器芯片落后且控制任务繁重, 模拟闭环控制而得不到理想的监控和反馈调节效果,并由此带来单个控制设备软硬件设计上的隐患, 这对IPS 电源输出造成不利影响, 甚至对用电设备因为供电故障而导致灾难性后果。数字化控制技术日趋成熟,而且在某些领先理念的电源设备控
[嵌入式]
采用ARM Cortex-M3<font color='red'>单片机</font>和DSP的逆变电源设计
基于MSP430单片机的PID参数整定仪
  PID控制是最常的控制策略,在工业过程控制中90%以上的控制回路具有PID结构。PID控制之所以被广泛应用主要是因为它算法简单,在实际中容易被理解和实现,而且许多高级控制都以PID控制为基础。但是由于环境的变化,使被控对象具有时变性,参数经过一段时间以后会出现性能欠佳、适应性变差、控制效果下降等情况。因此,寻求参数自动整定技术,以适应复杂工况及高性能指标的控制要求,是实现节能优化控制的重要手段,具有重大的工程实践意义。   1 自整定过程原理   本文主要研究了一种手持式的PID参数整定仪器,此整定仪具有整定单变量和双变量的双重功能,控制系统主要采用低能耗的MSP430微控制器,软件部分采用的软件开发平台是IAR MSP4
[单片机]
基于MSP430<font color='red'>单片机</font>的PID参数整定仪
单片机在便携式设备中的应用与设计
引 言 手机在现代生活中的使用越来越广,其功能也是越来越多,如现在有很多手机都带有 MP3 及照相功能,有的还具有闪信和计步器功能。手机闪信需要处理器能完成多路模拟输入、数据的实时处理等,原有的手机很难直接实现这些功能,就需要MCU配合完成其功能。 PMP等便携式设备大都带有彩色的TFT屏,而传统的驱动是由白色 LED 完成的,但其存在色差;现在大都采用RGB三色LED来背光,同时需要检测背光的效果,克服LED亮度变暗的问题。MCU可以协助主处理器完成这些功能,达到很好的彩色TFT屏的背光效果。 便携式设备往往由多个公司共同提供模块,需要MCU有好的保密功能。因此便携式设备对MCU的要求,大都需要小尺寸,低功耗,实
[单片机]
<font color='red'>单片机</font>在便携式设备中的应用与设计
用51单片机实现串口通信
#include void ckInt()//串口初始化 { TMOD=0x20;//定时计数器1,方式2 TH1=0xF3; //计算出来的初值 TL1=0xF3; //计算出来的初值 PCON=0X80;//波特率加倍 TR1=1;//启动定时计数器1 SCON=0x50;//串口工作方式1 ES=1;//打开串口中断 EA=1;//打开总中断 } void main()//主函数 { ckInt();//调用函数 while(1); } void ckzd()interrupt 4//中断函数,串口中断编号4 { unsigned int DATA; DATA=SBUF;//发送数据 RI=0;//
[单片机]
51单片机入门教程(2)——实现流水灯
一、搭建流水灯电路 在Proteus中搭建流水灯电路如图 二、流水灯程序 我们可以把流水灯看作依次点亮若干个灯。 程序如下: #include reg52.h sbit led1 = P2^0; sbit led2 = P2^1; sbit led3 = P2^2; sbit led4 = P2^3; sbit led5 = P2^4; sbit led6 = P2^5; sbit led7 = P2^6; sbit led8 = P2^7; void main() { //点亮第一个灯 led1 = 1; led2 = 0; led3 = 0; led4 = 0; led5 = 0; l
[单片机]
51<font color='red'>单片机</font>入门教程(2)——实现流水灯
两片51单片机互相通信的串行通信程序
;系统晶振是 11.0592 MHz ;51单片机发送单片机程序 ;此程序用Proteus仿真通过 ;此程序在硬件上测试通过 ;2007-05-27 ;附有简化电路图 ;为了使初学者能看懂,程序与图尽可能的简单扼要 ;实验现象为,发送端的P1口的哪个键被接下,接收端的哪个灯对应着亮 ;如果把两个单片机的T和R通过无线模块(如基于MCP2120芯片的模块)来扩充,便可做成无线通信 ORG 0000H AJMP START ORG
[单片机]
两片51<font color='red'>单片机</font>互相通信的串行通信程序
【GD32 MCU 入门教程】GD32 MCU 常见外设介绍(3)NVIC 介绍
NVIC(Nested vectored interrupt controller,嵌套向量中断控制器)是Cortex-M处理器的一部分,它是可编程的,且寄存器位于存储器映射的系统控制空间(SCS)。NVIC与内核相辅相成,共同完成对中断的响应。本章将介绍中断的优先级设置、如何定义中断函数名称、中断向量如何偏移。有关NVIC的更多知识,请见《ARM Coretex-M3权威指南》。 3.1.优先级的设置 在Cortex-M中,优先级对于异常来说很关键的,它会影响一个异常是否能被响应,以及何时可以响应。优先级的数值越小,则优先级越高。Cortex-M支持中断嵌套,使得高优先级异常会抢占低优先级异常。有3个系统异常:复位,NMI以
[单片机]
【GD32 <font color='red'>MCU</font> 入门教程】GD32 <font color='red'>MCU</font> 常见外设介绍(3)NVIC 介绍
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved