Spectator:基于CH32X035的USB PD/QC诱骗器设计与实现 📅 2026/6/28 23:36:56 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以内对于判断设备的工作状态很有参考价值。