数码之家

 找回密码
 立即注册
搜索
查看: 1349|回复: 0

[工仪] PD诱骗双向电流电压监测表头

[复制链接]
发表于 2024-9-25 11:53:50 | 显示全部楼层 |阅读模式
【PD诱骗双向电流电压表软件原理介绍-哔哩哔哩】 https://b23.tv/q1SWt6c
【PD诱骗双向电压电流表头硬件原理介绍-哔哩哔哩】 https://b23.tv/nibNUtN

项目简介
TA-YB001是基于STC8H系列单片机为主控芯片开发而成,充分利用其优秀的硬件外设,运行为其深度定制开发,同时创新使用模拟开关来切换电流的方向反馈,搭配1.14寸的高清LCD屏不在是单纯的数字显示做了个简单的UI界面,看起来更高级。
项目功能
TA-YB001除了基本的电流电压数据外,还搭载了PD诱骗功能,可直接诱骗5-9-12-15-20V的电压(前提充电器要支持PD功能)。可作为一个简易的可调电源。
1、普通模式
使用时把产品拨动开关拨到“直通”侧,用产品的TYPE-C公头直接插入充电再再用TYPE-C线插入产品的TYPE-C输出口就行。TYPE-C口默认情况下是没电压输出的,这时TA-YB001屏幕是没有任何显示的,当用TYPE-C线插入手机或者其他用电设备时,TA-YB001就会显示了,此时是显示当前的实时电压、电流、功能、容量(mAh\Wh)。并且电流方向图标也会显示当前的电流方向的。
图示:

当然您也可以先把线插入充电器用TYPE-C线的另一头插入TA-YB001母座端,再用公头插入用电设备,这时效果也是一样的,唯一的区别是电流方向图标会相反。
TA-YB001是支持双向电流显的方向,这样就可以判断设备间是哪方在提供能量。(如2个充电宝互相充时)
图示:

2、诱骗模式
使用时把产品拨动开关拨到“PD”侧,用产品的TYPE-C公头直接插入充电再用TYPE-C线插入产品的TYPE-C输出口,这时默认会直接诱骗出5V电压所以TA-YB001会显示。再长按PD按键3秒会进入PD诱骗界面,此时短按校准键往上加,短按PD键往下减,可根据您的需要调整到想要的电压(前提充电器支持所有电压)。再长按PD键退出当前界面回到主界面。
图示:

当然您也可以先把线插入充电器用TYPE-C线的另一头插入TA-YB001母座端,这时效果也是一样的,操作方法一样。有个小缺陷是如果用TYPE-C线插入TA-YB001母座是有可能要调换一下方向才能诱骗
出电压,因为线是5芯线,而直接用公头插入充电器时又是6芯PD诱骗IC不能同时使用6芯和5芯所以就默认5芯,所以用TYPE-C线时如果一边没有显示翻个面就可以了。

警告:诱骗电压时请注意输出口是否连接用电设备,如果用电设备耐压不够有烧机风险!
3、校准模式
TA-YB001如果是按成品发售的都是经过我们已经校准过的,用户无需另行操作。如果是极客爱好者自己用我们开源的资料制作的就需要对产品进行电压、电流校准。
电压校准:先用一个你已经确认的电压源5-10V,接上TA-YB001(最好是公头侧),确认你的电压源精准数据比如5.000V,然后TA-YB001显示的电压是否准确,如果不准确长按校准按键3秒进入校准此时“>”会指示到“V”这里,这是电压的校准值,用PD键短按来减校准值,或者用校准键短按来加校准值,直到显示的电压和你的电压源相同即可。
注:校准界面屏幕最下面一栏是当前校准参数的原始值

电压准确后长按校准按键2-3秒,进入正向电流校准此时“>”会在”I>“这里,这是正向电流的校准值。先用电子负载接到TA-YB001的母座端拉一个1-3A的电流,用PD键短按来减校准值,或者用校准键短按来加校准值,直到显示的电流和你的负载电流相同即可。
注:校准界面屏幕最下面一栏是当前校准参数的原始值

正向电流准确后,需要重新先把TYPE-C线插到TA-YB001的母座端,电子负载接到TA-YB001的公头端拉一个1-3A的电流,长按校准按键2-3秒,进入电压校准再按2-3秒进入正向校准再按2-3秒进入电压校准再按2-3秒进入正向校准再按2-3秒进入反向电流校准此时”>“在“I<”这里,这是反向电流的校准值。用PD键短按来减校准值,或者用校准键短按来减校准值,或者用校准键短按来加校准值,直到显示的电流和你的负载电流相同即可。
注:校准界面屏幕最下面一栏是当前校准参数的原始值

此时TA-YB001就可以精确的显示电压和电流了。
项目参数
项目 参数 备注
测试电压范围 4-30V
测试电流范围 0-6A
电压精度 +-0.005V
电流精度 +-0.005A
容量范围 0-9999mAh
Wh范围 0-999Wh
原理解析(硬件说明)
硬件方面主要采用了CH224K作为诱骗PD电压的协议IC,用单片机配置不同的脚位信息来控制需要诱骗的电压值。
单片机采用STC8H3K64S2作为主控,提供ADC采集来计算电压电流和屏幕显示。
软件代码#include         "lcd_init.h"#include         "lcd.h"#include         "UI.h"#include         "calibration.h"float Final_W;        //功率u16 a,b,c,d,e,deige,deige1;void UI_MENU_A(void){                        R5draw_circle(2,8,140,44,MAGENTA);                                //电压位置底色        R5draw_circle(2,49 ,140,83,GREEN);                                //电流位置底色        R5draw_circle(2,88,140,122,CYAN);                                //功率位置底色        R5draw_circle(145,8,238,122,MAGENTA);                        //右框位置底色                }void UI_MENU(void){        if(flag==2)        {                LCD_Fill(0,0,LCD_W,LCD_H,BLACK);                UI_MENU_A();                flag=0;        }        if(dire==1)     {                LCD_ShowString(170,10,">>>>",WHITE,MAGENTA,16,0);}        else{LCD_ShowString(170,10,"<<<<",WHITE,MAGENTA,16,0);}                                Final_W=Final_V*Final_I;                                                                                                //功率计算                LCD_ShowFloatNum3(4,10,Final_V,5,WHITE,MAGENTA,32);                                                //电压        LCD_ShowString(128,29,"V",WHITE,MAGENTA,12,0);        LCD_ShowString(113,11,"VBUS",WHITE,MAGENTA,12,0);                        LCD_ShowFloatNum3(4,51,Final_I,5,WHITE,GREEN,32);                                                //电流        LCD_ShowString(128,70,"A",WHITE,GREEN,12,0);        LCD_ShowString(113,52,"IBUS",WHITE,GREEN,12,0);                                LCD_ShowFloatNum3(4,90,Final_W,5,WHITE,CYAN,32);                                                //功率        LCD_ShowString(128,109,"W",WHITE,CYAN,12,0);        LCD_ShowString(113,93,"POWE",WHITE,CYAN,12,0);        LCD_ShowString(180,33,"mAh",WHITE,MAGENTA,16,0);        LCD_ShowFloatNum1(149,50,mah,6,WHITE,MAGENTA,24);        LCD_ShowString(182,80,"Wh",WHITE,MAGENTA,16,0);        LCD_ShowFloatNum3(149,95,wh,6,WHITE,MAGENTA,24);        }void UI_calibration(void){                if(flag==3)        {                R5draw_circle(145,8,238,122,MAGENTA);                        flag=2;        }        if(dire==1){LCD_ShowString(170,10,">>>>",WHITE,MAGENTA,16,0);}        else{LCD_ShowString(170,10,"<<<<",WHITE,MAGENTA,16,0);}                Final_W=Final_V*Final_I;                                                                                                //功率计算                LCD_ShowFloatNum3(4,10,Final_V,5,WHITE,MAGENTA,32);                                                //电压        LCD_ShowString(128,29,"V",WHITE,MAGENTA,12,0);        LCD_ShowString(113,11,"VBUS",WHITE,MAGENTA,12,0);                        LCD_ShowFloatNum3(4,51,Final_I,5,WHITE,GREEN,32);                                                //电流        LCD_ShowString(128,70,"A",WHITE,GREEN,12,0);        LCD_ShowString(113,52,"IBUS",WHITE,GREEN,12,0);                        //        LCD_ShowString(180,33,"mAh",WHITE,MAGENTA,16,0);        LCD_ShowChinese(163,30,"校  准",WHITE,MAGENTA,16,0);        LCD_ShowString(160,51,"V:",WHITE,MAGENTA,16,0);        LCD_ShowIntNum(175,46,k_v,5,WHITE,MAGENTA,24);        LCD_ShowString(160,75,"I>",WHITE,MAGENTA,16,0);                LCD_ShowIntNum(175,70,k_a1,5,WHITE,MAGENTA,24);//        LCD_ShowString(182,80,"Wh",WHITE,MAGENTA,16,0);        LCD_ShowString(160,99,"I<",WHITE,MAGENTA,16,0);        LCD_ShowIntNum(175,94,k_a2,5,WHITE,MAGENTA,24);                        switch (mode)        {                case 2:                         {                        LCD_ShowChar(150,51,'>',WHITE ,MAGENTA,16,0);                        LCD_ShowChar(150,94,' ',WHITE ,MAGENTA,16,0);                                                LCD_ShowFloatNum3(4,90,sample_V,5,WHITE,CYAN,32);                                                                                                LCD_ShowString(128,109,"V",WHITE,CYAN,12,0);                        LCD_ShowString(113,93,"SAMP",WHITE,CYAN,12,0);                        break;                        }                case 3:                         {                        LCD_ShowChar(150,51,' ',WHITE ,MAGENTA,16,0);                        LCD_ShowChar(150,75,'>',WHITE ,MAGENTA,16,0);                        LCD_ShowFloatNum3(4,90,sample_I,5,WHITE,CYAN,32);                                                                                LCD_ShowString(128,109,"A",WHITE,CYAN,12,0);                        LCD_ShowString(113,93,"SAMP",WHITE,CYAN,12,0);                        break;                        }                case 4:                         {                        LCD_ShowChar(150,75,' ',WHITE ,MAGENTA,16,0);                        LCD_ShowChar(150,99,'>',WHITE ,MAGENTA,16,0);                        LCD_ShowFloatNum3(4,90,sample_I,5,WHITE,CYAN,32);                                                                                LCD_ShowString(128,109,"A",WHITE,CYAN,12,0);                        LCD_ShowString(113,93,"SAMP",WHITE,CYAN,12,0);                        break;                        }                        }        }void UI_PD(void){                if(flag==1)                                                                //PD电压转换时颜色调整,当发生变化后第一次进入时才刷新,不至于一直刷新造成屏幕闪烁。        {                deige=BRED;                deige1=GREEN;                                LCD_Fill(0,0,LCD_W,LCD_H,BLACK);                                R5draw_circle(2,4,238,83,deige1);                        R5draw_circle(15,88,45,118,deige);                R5draw_circle(59,88,89,118,deige);                R5draw_circle(105,88,135,118,deige);                R5draw_circle(149,88,179,118,deige);                R5draw_circle(193,88,223,118,deige);                                flag=2;        }                        if(dire==1){LCD_ShowString(150,53,">>>>",WHITE,deige1,24,0);}                else{LCD_ShowString(150,53,"<<<<",WHITE,deige1,24,0);}                Final_W=Final_V*Final_I;                                LCD_ShowFloatNum3(4,10,Final_V,5,WHITE,deige1,32);                LCD_ShowString(110,22,"V",WHITE,deige1,16,0);                                LCD_ShowFloatNum3(124,10,Final_I,5,WHITE,deige1,32);                LCD_ShowString(226,22,"A",WHITE,deige1,16,0);                                LCD_ShowFloatNum3(4,47,Final_W,5,WHITE,deige1,32);                LCD_ShowString(110,60,"W",WHITE,deige1,16,0);                                                //R5draw_circle(15,88,45,118,LBBLUE);                LCD_ShowString(24,89,"5",a,LBBLUE,24,1);                        //R5draw_circle(59,88,89,118,LBBLUE);                LCD_ShowString(69,89,"9",b,LBBLUE,24,1);                        //R5draw_circle(105,88,135,118,LBBLUE);                LCD_ShowString(109,89,"12",c,LBBLUE,24,1);                        //R5draw_circle(149,88,179,118,LBBLUE);            LCD_ShowString(153,89,"15",d,LBBLUE,24,1);                        //R5draw_circle(193,88,223,118,LBBLUE);            LCD_ShowString(198,89,"20",e,LBBLUE,24,1);}void UI_MODE(void) {                  switch (mode)         {                 case 0:{UI_MENU();         break;}                                                        //主界面模式                  case 1:                 {                                 switch (mode2)                         {                                 case 1:{a=RED; b=WHITE; c=WHITE; d=WHITE; e=WHITE; cfg1=1; break;}                                 case 2:{a=WHITE; b=RED; c=WHITE; d=WHITE; e=WHITE; cfg1=0; cfg2=0; cfg3=0;break;}                                 case 3:{a=WHITE; b=WHITE; c=RED; d=WHITE; e=WHITE; cfg1=0; cfg2=0; cfg3=1;break;}                                 case 4:{a=WHITE; b=WHITE; c=WHITE; d=RED; e=WHITE; cfg1=0; cfg2=1; cfg3=1;break;}                                 case 5:{a=WHITE; b=WHITE; c=WHITE; d=WHITE; e=RED; cfg1=0; cfg2=1; cfg3=0;break;}                                                                           }                                                                          UI_PD();                                                                                //PD界面                         break;                                   }                                  case 2:{UI_calibration(); break; }                                        //校准界面                 case 3:{UI_calibration(); break; }                                 case 4:{UI_calibration(); break; }                                                                                                                                                             }                         }        
这是屏幕显示部分代码
注意事项
  • 要诱骗出5-9-12-15-20V电压的前提你的充电器要支持这些电压。
  • 如果用数据线插入产品母座诱骗电压时可能需要翻面插一下


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-12 04:23 , Processed in 0.187200 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表