用CH32X035做个“瑞士军刀”:PD/QC诱骗、ADC/DAC、电压电流计三合一保姆级教程
用CH32X035打造全能电子工具箱:从快充诱骗到精密测量的实战指南
在电子DIY的世界里,工具的多功能性和便携性往往决定了创意的实现效率。想象一下:当你需要测试充电头的输出能力时,不必翻箱倒柜寻找专用测试仪;当电路调试需要特定电压信号时,无需连接笨重的台式电源;当需要测量微小电压变化时,不用额外购置昂贵的专业仪表——所有这些功能,都能集成在一个只有打火机大小的设备中。这正是CH32X035这颗RISC-V芯片带给硬件爱好者的可能性。
本文将带你深入探索如何利用CH32X035打造一款真正的"电子瑞士军刀"。不同于市面上单一功能的测试工具,我们将通过精心设计的外设分配和固件架构,实现四大核心功能的无缝整合:
- USB PD/PPS快充协议诱骗- 精确控制充电头输出5V至20V电压
- QC2.0/3.0协议支持- 兼容主流快充标准,支持0.2V步进微调
- 12位精密ADC/DAC- 0-3.3V范围内实现毫伏级测量与输出
- 实时电压电流监测- 直观显示Type-C接口的功率传输状态
1. 硬件设计:极致利用每一颗引脚
CH32X035G8U6这颗64MHz RISC-V芯片虽然体积小巧(仅QFN20封装),但其外设资源却异常丰富。要实现四大功能的同时运行,关键在于对硬件资源的合理分配和复用。
1.1 核心外设分配方案
| 功能模块 | 使用外设 | 引脚占用 | 特殊配置 |
|---|---|---|---|
| OLED显示 | SPI1 + DMA | PA5-PA7 | 硬件SPI加速图形渲染 |
| 编码器输入 | TIM2编码器模式 | PA0-PA1 | 带消抖滤波的硬件计数 |
| PD协议通信 | 内置USB PD PHY | PA11-PA12 | CC1/CC2引脚自动控制 |
| PWM DAC输出 | TIM1 PWM + 内置运放 | PA8 | 二阶RC滤波优化波形 |
| ADC采样 | 12位ADC通道 | PA2-PA4 | 硬件过采样提升分辨率 |
| 电流检测 | 差分ADC + 运放 | PA3-PA4 | 可编程增益放大 |
1.2 关键电路设计要点
快充诱骗模块的稳定性取决于几个细节:
- CC线路上必须串联100nF电容滤除高频噪声
- 使用TVS二极管保护PD通信引脚
- VBUS输出端建议放置至少47μF的储能电容
PWM DAC电路采用独特的两级滤波设计:
# PWM频率计算(48MHz主频,256分频) pwm_freq = 48_000_000 / (256 * 4096) ≈ 45.8Hz # 滤波器截止频率计算(R=10kΩ, C=10μF) f_cutoff = 1/(2πRC) ≈ 1.59Hz这种配置在纹波抑制和响应速度间取得了良好平衡,实测输出纹电压小于5mV。
2. 固件架构:多任务和谐共处
要让所有功能流畅协同工作,固件设计需要采用分层架构。我们摒弃了传统的超级循环(super loop)方式,转而采用事件驱动模型。
2.1 核心任务优先级划分
USB PD协议栈(最高优先级)
- 实时响应CC线上的协议握手
- 处理PPS电压协商超时
- 监测VBUS过压/欠压状况
用户界面刷新(中等优先级)
- 编码器旋转检测(每10ms轮询)
- OLED菜单渲染(仅在有变化时更新)
- 按键长按/短按识别
测量与输出(低优先级)
- ADC采样均值滤波(每秒100次)
- PWM占空比平滑调整
- 电流积分计算(用于mAh计量)
2.2 关键代码片段解析
编码器处理采用硬件TIM编码器模式,极大减轻CPU负担:
// TIM2编码器模式初始化 void Encoder_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_Period = 0xFFFF; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); TIM_ICStructInit(&TIM_ICInitStructure); TIM_ICInitStructure.TIM_ICFilter = 6; // 设置数字滤波 TIM_ICInit(TIM2, &TIM_ICInitStructure); TIM_Cmd(TIM2, ENABLE); }PWM DAC输出利用定时器硬件自动重载特性,实现无CPU干预的稳定输出:
void PWM_DAC_Init(uint16_t init_val) { GPIO_InitTypeDef GPIO_InitStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM1, ENABLE); // PA8作为TIM1_CH1输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); TIM_TimeBaseStructure.TIM_Prescaler = 255; // 分频系数 TIM_TimeBaseStructure.TIM_Period = 4095; // 自动重载值 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = init_val; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM1, &TIM_OCInitStructure); TIM_CtrlPWMOutputs(TIM1, ENABLE); TIM_Cmd(TIM1, ENABLE); }3. 功能实现:从理论到实践
3.1 快充协议诱骗实战
PD诱骗工作流程遵循严格的时序要求:
- 检测Source Capabilities报文
- 解析可用的电压/电流组合
- 发送Request报文协商电压
- 等待Accept/Reject响应
- 监测VBUS实际输出
注意:PD3.0的PPS模式需要每10秒发送一次KeepAlive报文,否则充电器会复位输出。
QC协议实现技巧:
- QC2.0通过D+/D-电压组合触发
- QC3.0采用连续的200mV步进调整
- 需要精确控制时序(典型延迟<1ms)
协议触发电压对照表:
| 协议 | D+电压 | D-电压 | 输出VBUS |
|---|---|---|---|
| QC2.0 5V | 0.6V | 0V | 5V |
| QC2.0 9V | 3.3V | 0.6V | 9V |
| QC3.0 + | 3.3V | 0.6V | 当前+0.2V |
| QC3.0 - | 0.6V | 3.3V | 当前-0.2V |
3.2 精密测量功能优化
ADC采样精度提升采用了多重技术:
- 硬件过采样(16倍)
- 软件滑动平均滤波(窗口大小8)
- 参考电压校准(内部1.2V基准)
电压测量算法流程:
- 采集分压电阻两端电压
- 计算实际VBUS电压
def calc_voltage(adc_val, R1=100, R2=20): v_div = adc_val * 3.3 / 4095 return v_div * (R1 + R2) / R2 - 温度补偿(系数约0.1%/℃)
电流测量采用差分输入+可编程运放:
- 50mΩ采样电阻
- 运放增益可调(20/50/100倍)
- 零点自动校准功能
4. 用户体验:精心设计的交互系统
4.1 多层次菜单结构
主菜单 ├─ PD诱骗 │ ├─ 固定电压模式 │ └─ PPS调压模式 ├─ QC诱骗 │ ├─ QC2.0预设 │ └─ QC3.0连续 ├─ 信号发生器 │ ├─ 直流输出 │ └─ 方波输出 └─ 测量仪表 ├─ 电压表 └─ 电流表4.2 编码器操作逻辑
- 短按:确认选择
- 长按:返回上级
- 旋转:
- 慢速:单步调整
- 快速:连续加速滚动
- 组合操作:
- 旋转+长按:快速切换功能模式
- 双连击:锁定当前设置
OLED显示优化技巧:
- 使用u8g2库的缓冲模式
- 关键参数反色显示
- 添加动态进度条指示
- 电压值采用大号字体
在实际项目中,我发现最实用的功能组合是PD诱骗+电流监测同时工作。这样在调试充电电路时,可以实时观察不同电压下设备的功耗变化。一个特别有用的技巧是在PPS模式下缓慢调整电压,同时监测电流曲线,可以准确找到设备的最高效工作点。
