用CH32X035做个“万能钥匙”:手把手教你DIY一个PD/QC快充诱骗器(附源码)
用CH32X035打造智能快充协议分析仪:从硬件设计到开源固件全解析
在快充技术遍地开花的今天,各类充电协议让普通用户眼花缭乱。作为一名电子爱好者,你是否想过自己动手打造一款既能检测又能模拟各种快充协议的智能工具?本文将带你用CH32X035这颗不足10元的RISC-V MCU,实现一个集PD/QC诱骗、电压电流监测、ADC/DAC测试于一体的多功能设备。不同于市面上动辄上千元的专业仪器,我们的方案成本控制在百元以内,却具备80%的核心功能。
1. 硬件架构设计与关键元件选型
1.1 核心控制器CH32X035的独特优势
这颗国产RISC-V芯片堪称本次项目的"灵魂部件",其硬件配置完美契合我们的需求:
- USB PD PHY硬件加速:原生支持Type-C协议解析,省去外部PHY芯片
- 12位高精度ADC:8通道输入,满足多路电压电流采样需求
- 内置运算放大器:可直接连接电流采样电阻,简化信号调理电路
- 62KB Flash+20KB RAM:足够运行完整协议栈和图形界面
- 48MHz主频+硬件除法器:确保协议处理的实时性
// CH32X035最小系统原理图关键部分 VCC_3V3 --| |-- USB_DM | CH32X035|-- USB_DP GND ---| |-- ADC_IN1(电压采样) |-- ADC_IN2(电流采样)1.2 外围电路设计要点
电压采样电路采用经典电阻分压网络,需要注意:
- 分压比计算:假设最大测量30V,选择R1=100kΩ, R2=10kΩ
- 功耗考量:高压侧电阻不宜过小,建议≥100kΩ
- 保护设计:并联TVS二极管防止电压浪涌
电流检测方案对比:
| 方案类型 | 精度 | 成本 | 功耗 | 适用场景 |
|---|---|---|---|---|
| 采样电阻+运放 | ±1% | 低 | 中 | 大多数DIY项目 |
| 霍尔传感器 | ±0.5% | 高 | 低 | 高压隔离测量 |
| 专用IC | ±0.2% | 最高 | 最低 | 商业产品 |
提示:普通应用推荐使用50mΩ/1%的合金采样电阻配合CH32X035内置运放,成本不足2元即可实现基本电流检测。
2. 快充协议诱骗功能实现
2.1 USB PD协议处理核心逻辑
CH32X035内置的PD PHY大大简化了协议实现难度。我们需要:
- 初始化USB PD控制器
- 监听Source Capabilities消息
- 根据用户选择发送Request消息
- 处理PS_RDY等状态确认
# PD协议状态机伪代码 def pd_state_machine(): while True: if state == IDLE: listen_for_source_caps() elif state == NEGOTIATING: send_request(voltage, current) elif state == CONTRACT: monitor_voltage()2.2 QC协议的特殊处理
QC协议采用D+/D-电压调制方式,需要特别注意:
- 电平时序必须精确,误差应<50ms
- 不同版本协议电压组合:
| QC版本 | 电压档位(V) | 调制方式 |
|---|---|---|
| 2.0 | 5/9/12/20 | 固定组合 |
| 3.0 | 3.6-20V | 0.2V步进 |
| 4.0 | 3.6-20V | 数字通信 |
实现技巧:
- 使用TIMER产生精确时序
- 通过GPIO模拟D+/D-电平变化
- 添加0.1uF去耦电容保证信号质量
3. 人机交互系统设计
3.1 旋转编码器驱动优化
机械编码器存在抖动问题,推荐采用硬件去抖方案:
- 配置TIMER为编码器模式
- 设置滤波器参数(例如4个时钟周期)
- 使用中断+轮询混合方式检测
// 编码器初始化代码示例 void Encoder_Init(void) { TIM_EncoderInterfaceConfig(TIM1, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); TIM_SetAutoreload(TIM1, 255); // 8位计数范围 TIM_Cmd(TIM1, ENABLE); }3.2 基于u8g2的图形界面
移植u8g2库到CH32X035需要注意:
- 调整SPI时钟频率(建议8-12MHz)
- 优化屏幕刷新区域减少闪烁
- 使用DMA传输提升性能
菜单系统数据结构示例:
graph TD A[主菜单] --> B[PD诱骗] A --> C[QC诱骗] A --> D[电压表] B --> B1[固定电压] B --> B2[PPS调压] C --> C1[QC2.0] C --> C2[QC3.0]4. 高级功能扩展与校准
4.1 ADC采样精度提升技巧
虽然CH32X035内置12位ADC,但实际有效位数可能只有10-11位。通过以下方法可提高精度:
硬件方面:
- 添加0.1μF陶瓷电容滤除高频噪声
- 使用独立的参考电压源
- 保持模拟地线独立走线
软件方面:
- 采集16次取平均值
- 应用滑动窗口滤波算法
- 分段线性校准
// 软件滤波示例代码 #define SAMPLE_COUNT 16 uint16_t ADC_GetAverage(uint8_t channel) { uint32_t sum = 0; for(uint8_t i=0; i<SAMPLE_COUNT; i++){ sum += ADC_Read(channel); delay_us(10); } return (sum + SAMPLE_COUNT/2) / SAMPLE_COUNT; }4.2 自定义协议扩展
系统架构预留了协议扩展接口,只需在protocols目录添加新文件即可支持更多快充标准:
- 创建
protocol_xxx.c/h文件 - 实现标准接口函数:
init()negotiate()get_voltage()
- 在主菜单注册新协议
项目实际测试中发现,使用PPS协议时调整电压的响应速度比固定电压模式慢约200-300ms,这主要受电源适配器内部环路调节影响。建议在UI设计时添加状态提示,避免用户误操作。
