Spectator:基于CH32X035的USB PD/QC诱骗器设计与实现
1. 为什么你需要一个USB PD/QC诱骗器
作为一个经常折腾电子设备的开发者,我遇到过太多次这样的场景:手头有个支持快充的设备,但不知道它到底支持哪些协议;或者想测试自己设计的电路在不同电压下的表现,却苦于没有合适的电源。这时候,一个靠谱的快充诱骗器就能派上大用场。
Spectator这款基于CH32X035的诱骗器,可以说是我的"瑞士军刀"。它不仅能诱骗PD和QC协议,还集成了电压电流监测、ADC/DAC工具等功能。想象一下,你只需要这么一个小设备,就能完成以往需要多个仪器才能搞定的测试工作,这感觉不要太爽。
CH32X035这颗国产RISC-V芯片真的很给力,内置了PD PHY、运放和高速ADC,这让我们的设计变得特别简洁。我记得第一次用它成功诱骗出20V电压时,那种成就感简直爆棚。下面我就来详细说说这个项目的设计思路和实现细节。
2. 硬件设计要点
2.1 核心芯片选型
选择CH32X035G8U6这颗芯片真是明智之举。它内置的USB PD PHY省去了外置协议芯片的麻烦,48MHz的主频完全够用,20KB SRAM跑个简单菜单系统绰绰有余。最让我惊喜的是它内置的运放和12位ADC,这让我们的电流检测电路简单了不少。
实际使用中,我发现它的GPIO响应速度特别快,处理编码器信号毫无压力。62KB的Flash空间足够放下我们所有的功能代码,还能留出空间给未来的升级。
2.2 电源电路设计
电源部分我们做了双重保护:首先是TVS二极管防止静电和浪涌,然后是自恢复保险丝。实测中遇到过几次短路情况,这套保护机制都很好地保护了设备。
分压电阻的选择很有讲究。我们用了0.1%精度的电阻,确保电压检测的准确性。电流采样用的是50mΩ的精密电阻,配合芯片内置的运放,测量精度可以达到±1%。
2.3 人机交互设计
OLED屏幕通过SPI接口连接,使用DMA传输可以大大减轻CPU负担。我移植了u8g2库,菜单滑动效果非常流畅。编码器用的是常见的EC11,通过TIM的编码器模式读取,代码简洁又高效。
这里有个小技巧:在编码器中断服务函数里不要做太多处理,只记录方向,主循环中再处理实际逻辑。这样可以避免旋转过快时丢失脉冲。
3. 软件实现细节
3.1 PD协议实现
CH32X035内置的PD控制器让协议实现变得简单。我们主要处理了两类请求:Fixed电压和PPS。Fixed电压就是常见的5V、9V这些固定档位,PPS则可以实现更精细的调压。
void PD_Negotiate(uint8_t voltage_index) { PD_Message msg; msg.MessageType = PD_MSG_REQUEST; msg.DataObjects[0] = PD_DataObject(voltage_index); PD_Transmit(&msg); }PPS调压的实现稍微复杂些,需要通过波轮调整电压值,然后发送包含目标电压和电流的请求。实测发现,很多充电器对PPS请求的响应速度差异很大,这点在代码中需要做超时处理。
3.2 QC协议处理
QC协议是通过D+ D-线上的电压来通信的。我们用了两个GPIO配合简单的电阻网络来实现:
QC2.0: D+ D- Vbus 0.6V 0V 5V 0.6V 0.6V 9V 3.3V 3.3V 12V 3.3V 0.6V 20V QC3.0: 上升沿: D+ 3.3V, D- 0.6V (+0.2V) 下降沿: D+ 0.6V, D- 3.3V (-0.2V)这里有个坑要注意:有些充电器在切换QC电压时会有短暂的断电过程,如果负载较大可能会造成设备重启。解决方法是在切换时先降低负载电流。
3.3 ADC/DAC功能实现
ADC部分我们用了芯片内置的12位ADC,测量范围0-3.3V。为了提高精度,软件上做了多次采样取平均的处理。DAC功能则是通过PWM加RC低通滤波器实现的,配合内置运放做缓冲,输出非常稳定。
#define DAC_PWM_PERIOD 4096 void Set_DAC_Output(uint16_t value) { if(value > DAC_PWM_PERIOD) value = DAC_PWM_PERIOD; TIM_SetCompare1(TIM1, value); }实际测试发现,PWM频率选择在20kHz左右,配合10kΩ电阻和0.1μF电容组成的低通滤波器,纹波可以控制在10mV以内,对大多数应用来说已经足够好了。
4. 系统整合与优化
4.1 内存管理
虽然CH32X035有20KB SRAM,但在实现多功能时还是要注意内存使用。我们把菜单系统的显示缓冲区和协议处理缓冲区做了复用,节省了不少空间。
协议栈的处理也做了优化,PD协议的状态机是非阻塞式的,这样在等待充电器响应时不会卡住整个系统。实测下来,这种设计让菜单操作始终保持流畅。
4.2 实时性保障
系统中有几个对实时性要求较高的任务:编码器读取、PD协议处理和电压电流监测。我们通过合理分配中断优先级来确保关键任务及时响应。
编码器中断设为最高优先级,确保旋转操作跟手。PD协议中断次之,电压电流监测放在主循环中处理,通过DMA自动采集ADC数据,大大减轻了CPU负担。
4.3 功耗控制
虽然这是个插电设备,但我们还是做了低功耗优化。在闲置状态下,CPU会进入低功耗模式,只有编码器中断能唤醒它。OLED屏幕也有自动关闭功能,长时间不操作时会自动熄灭。
实测待机电流可以做到1mA以下,这对于一个功能这么丰富的设备来说相当不错了。
5. 实际使用体验
经过几个月的使用和迭代,Spectator已经成了我工作台上不可或缺的工具。它最大的优势就是小巧便携但功能全面,出差时带它一个就能应付大多数测试需求。
PD诱骗功能特别稳定,测试过市面上主流的20多款充电器,兼容性都很好。QC诱骗的连续调压功能在做电源测试时特别方便,可以精细地观察电路在不同电压下的表现。
ADC/DAC功能虽然精度比不上专业设备,但对于快速验证电路已经足够用了。我经常用它来测量传感器输出或者生成测试信号,省去了搬动大型仪器的麻烦。
电压电流计的刷新率做到了10Hz,用来监测充电过程完全够用。最让我满意的是它的电流测量精度,实测误差在±20mA以内,对于判断设备的工作状态很有参考价值。
