用CH32X035做个PD/QC诱骗器,还能当电压表?手把手教你复刻Spectator
2026/6/11 5:04:51 网站建设 项目流程

用CH32X035打造多功能快充测试仪:从诱骗到测量的全流程实战

在电子DIY和硬件开发领域,快充协议的测试工具一直是工程师和爱好者的刚需。传统方案往往需要多个独立设备配合使用,不仅成本高昂,而且携带不便。本文将展示如何基于CH32X035这颗RISC-V内核的MCU,打造一个集PD/QC诱骗、电压测量、信号生成为一体的便携式工具。

1. 硬件设计与元器件选型

CH32X035作为核心控制器,其内置的USB PD PHY和丰富外设资源为多功能整合提供了可能。硬件设计需要兼顾功能完整性和便携性,以下是关键组件选型建议:

  • 主控芯片:CH32X035G8U6(QFN20封装),内置USB PD控制器和62KB Flash
  • 显示模块:0.96寸OLED(SSD1306驱动,SPI接口)
  • 编码器:EC11旋转编码器,用于菜单导航和参数调节
  • 电压检测:分压电阻网络(建议1%精度金属膜电阻)
  • 电流检测:INA199电流采样芯片,支持双向测量
  • 接口设计:Type-C母座(支持CC引脚检测)+ 1.25mm间距测试针座

关键电路设计要点

// 示例:分压电路计算(针对20V最大输入) #define R1 100000 // 100kΩ #define R2 15000 // 15kΩ float voltage_measure(float adc_value) { return adc_value * 3.3 / 4095 * (R1 + R2) / R2; }

注意:PD诱骗需要严格遵循USB-IF规范,CC引脚的上拉电阻值直接影响电源能力协商

2. 开发环境搭建与基础工程配置

CH32X035开发需要准备以下软件环境:

  1. 工具链安装

    • MounRiver Studio(官方推荐IDE)
    • RISC-V GCC编译器
    • WCH-Link调试器驱动
  2. 工程初始化

    • 配置系统时钟为48MHz
    • 启用USB外设和PD PHY
    • 初始化SPI接口用于OLED驱动
# 典型编译配置示例 CC = riscv-none-embed-gcc CFLAGS = -march=rv32imac -mabi=ilp32 -Os LDFLAGS = -T WCH32X035.ld -nostartfiles
  1. 关键库移植
    • u8g2图形库(OLED显示)
    • USB PD协议栈(基于官方库修改)

3. USB PD/QC诱骗功能实现

快充诱骗是本项目的核心功能,需要处理协议协商和电压切换。CH32X035内置的PD控制器大大简化了实现难度。

3.1 PD协议处理流程

  1. 检测Source能力

    • 发送Source_Capabilities请求
    • 解析返回的PDO(Power Data Object)
  2. 电压请求

    • Fixed模式:选择预设电压档位(如5V/9V/12V/15V/20V)
    • PPS模式:发送APDO请求,指定电压和电流

典型PDO数据结构

类型电压(V)电流(A)最大功率(W)
Fixed5315
Fixed92.2220
PPS3.3-112.2527

3.2 QC协议实现要点

QC协议通过D+/D-引脚电压组合触发:

void set_qc_voltage(QC_Voltage voltage) { switch(voltage) { case QC_5V: set_dp(0.6V); set_dm(0V); break; case QC_9V: set_dp(0.6V); set_dm(0.6V); break; case QC_12V: set_dp(3.3V); set_dm(3.3V); break; case QC_20V: set_dp(3.3V); set_dm(0.6V); break; } delay_ms(100); // 维持足够触发时间 }

提示:QC3.0的连续调压需要动态调整D+电压,每步变化约0.2V

4. 测量功能与用户界面开发

多功能集成需要直观的UI设计,u8g2库提供了良好的图形支持。建议采用分层菜单结构:

  • 主菜单

    • PD诱骗
    • QC诱骗
    • 电压表
    • 信号发生器
  • PD子菜单

    • Fixed模式选择
    • PPS模式调节
    • 当前状态显示

编码器处理示例

void encoder_handler(void) { static int8_t last_state; int8_t new_state = GPIO_ReadInputDataBit(ENC_A_PORT, ENC_A_PIN); new_state |= GPIO_ReadInputDataBit(ENC_B_PORT, ENC_B_PIN) << 1; if(last_state == 0x3 && new_state == 0x1) { // 顺时针旋转 menu_scroll(1); } else if(last_state == 0x3 && new_state == 0x2) { // 逆时针旋转 menu_scroll(-1); } last_state = new_state; }

5. 系统优化与实战技巧

在实际使用中,有几个关键点需要特别注意:

  1. 电源稳定性

    • 添加足够的去耦电容(建议10μF+0.1μF组合)
    • 线性稳压器选择低噪声型号(如TPS7A系列)
  2. ADC精度提升

    • 使用内部参考电压校准
    • 软件端采用滑动平均滤波
#define SAMPLE_COUNT 16 uint16_t adc_filter(void) { static uint16_t samples[SAMPLE_COUNT]; static uint8_t index = 0; uint32_t sum = 0; samples[index++] = ADC_GetConversionValue(); if(index >= SAMPLE_COUNT) index = 0; for(int i=0; i<SAMPLE_COUNT; i++) { sum += samples[i]; } return sum / SAMPLE_COUNT; }
  1. PWM转DAC优化
    • 使用二阶RC滤波(截止频率约1kHz)
    • 配合内部运放做缓冲输出

实测性能对比

功能分辨率响应时间精度
PD诱骗20mV<200ms±1%
电压测量12bit50ms±0.5%
PWM转DAC8bit10ms±3%

6. 扩展功能与进阶玩法

除了基础功能,CH32X035还有更多潜力可挖:

  • USB HID模式:实现与PC的数据交互
  • 自定义协议:支持厂商私有快充协议
  • 数据记录:添加EEPROM存储测量数据
  • 外壳设计:3D打印定制化保护壳

一个特别实用的技巧是利用DAC功能实现可编程电源:

void set_output_voltage(float volts) { if(volts < 0) volts = 0; if(volts > 3.3) volts = 3.3; uint16_t dac_value = (uint16_t)(volts * 4095 / 3.3); TIM_SetCompare1(TIM1, dac_value); // 通过PWM+DAC输出 }

在实际项目中,我发现CH32X035的GPIO中断响应速度极快,这对于实现流畅的用户交互非常关键。通过合理配置中断优先级,可以确保编码器操作和协议处理互不干扰。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询