Skip to content

概述

官方基础工程已预置 CH224 驱动(components/ch224)并在 sht3x_read_task 任务中完成初始化与 12.2V PPS 供电设置;ch224_voltage 调压工具已在创建 MCP 工具第 5 章注册。本章接线并实测 AI 调节供电电压。

CH224K 是 USB-C 的 PD 受电端:插上支持 PD 的充电器后,通过 I²C 与充电器协商输出电压(5V / 9V / 12V / 15V / 20V…,甚至 PPS 任意电压 0.1V 步进)。整个板子即由它供电。

安全须知(动手前必读)

CH224 调节的电压只在 VOUT / GND 两个接口输出,与电路板自身供电隔离——调压不会烧坏电路板本身。但请注意:

  • VOUT 的高压只给外部负载:接在 VOUT/GND 上的外部设备必须承受得住目标电压(如 20V 只可接额定 20V+ 的负载),否则烧的是外部设备;
  • 本工具安全上限 20V(代码里做了 5~20V 范围保护,超范围直接拒绝);
  • 改压前确认充电器支持 PPS 或对应 PD 档位(不支持则协商失败,电压不变);
  • 接外部负载实验时,建议用万用表/USB 电流表监测。

🎯本页目标使用官方预置的 CH224 驱动(默认 12.2V PPS),新增调压工具,实现 AI 调节开发板供电电压。
🧰前置条件① 完成 [创建 MCP 工具](./create-mcp-tool) ② 支持 PD/PPS 的充电器与 C-to-C 线 ③ 万用表(建议)。
🔗相关章节⚠️ 本章涉及整板供电电压调节,务必先阅读安全须知。完成后进入 [AI 控制 WS2812 彩灯案例](./ws2812-ai-case)。
确认官方已预置 CH224 模块

官方基础工程已预置 CH224 驱动(components/ch224),无需复制。SCBB 库中模块名为 CH224A,从零工程起步时可参考:

mkdir -p components/ch224
cp ~/AiPi-SCBB/CH224A/axk_ch224.c components/ch224/
cp ~/AiPi-SCBB/CH224A/axk_ch224.h components/ch224/
确认初始化与默认供电设置

官方基础工程已完成 I²C 绑定与初始化,并在任务中设置 12.2V PPS 供电(官方默认配置)。从零工程起步时的写法如下(I²C 宏绑定与 SHT3x 相同):

#include "stm32f10x_bsp_i2c.h"
#define AXK_CH224_DELAY_MS(x) delay_ms(x)
#define AXK_CH224_I2C_ACLL(_func, ...) bsp_i2c_##_func(__VA_ARGS__)
#define AXK_CH224_I2C_ADDR 0x22   // CH224 I2C 地址

components/CMakeLists.txt 加入 ch224 目录。

初始化代码(freertos.c sht3x_read_task 中,已验证流程):

/* 初始化 */
res = axk_ch224_init();
if (res != 0) { log_error("ch224 not driver"); ch224_is_init = false; }
else          { ch224_is_init = true;  log_info("ch224 init OK!"); }

/* 读状态寄存器(0x09) */
int st = axk_ch224_get_status(AXK_CH224_REG_STATUS);
if (st < 0) log_error("ch224 status error: %d", st);
else        log_info("ch224 status: 0x%02X", st);

/* 设置 PPS 输出电压为 12.2V,并切到 PPS 模式 —— 本项目供电配置 */
ch224_status = axk_ch224_set_pps_vout(12.2);
if (ch224_status < 0) log_error("ch224 set avs vout error: %d", ch224_status);
else                   log_info("ch224 set avs vout OK!");
ch224_status = axk_ch224_set_mode(AXK_CH224_VOUT_PPS);
if (ch224_status < 0) log_error("ch224 set mode error: %d", ch224_status);
else                   log_info("ch224 set mode OK!");

驱动 API(axk_ch224.h 核验):

int axk_ch224_init(void);                                    // 初始化
int axk_ch224_get_status(axk_ch224_reg_t reg);               // 读寄存器(0x09 状态)
int axk_ch224_set_vout(axk_ch224_vout_t VOUT);               // 固定档位:5V/9V/12V/15V/20V/28V
int axk_ch224_set_mode(axk_ch224_vout_t _mode);              // 工作模式:PPS 或 AVS
int axk_ch224_set_pps_vout(float PPS_VOUT);                  // PPS 可编程电压(0.1V 步进)
int axk_ch224_set_avs_vout(float AVS_VOUT);                  // AVS 可编程电压

🔑 CH224A/Q 关键寄存器(axk_ch224.h 中的定义,勿改错)

寄存器 地址 说明
STATUS 0x09 状态寄存器
VOUT 0x0A 电压档位/模式:0x00~0x05 = 固定档(5V/9V/12V/15V/20V/28V),0x06 = PPS 模式,0x07 = AVS 模式
AVS_MSB / AVS_LSB 0x51 / 0x52 AVS 电压高/低字节
PPS 0x53 PPS 目标电压,值 = 电压 × 10(如 12.2V 写 122

⚠️ 网上一些"标准 CH224K"资料写的 PPS 寄存器是 0x0B——那是另一款芯片的布局,CH224A/Q 不要照抄,否则写入不生效(写入有 ACK 但电压不变)。

确认 ch224_voltage 工具已注册(第 5 章已完成)

ch224_voltage 调压工具的回调与注册已在创建 MCP 工具第 5 章完成(含 5~20V 安全限制)。工具回调核心逻辑如下(对照理解):

ch224_voltage 工具:传入电压值(5~20 的数字)调压,不传参数则查询当前电压。代码中加入安全保护:

/* ---- CH224 调压工具回调 ---- */
static float current_vout = 12.2f;   // 记录当前配置电压

static void ch224_voltage_set_handler(void *arg) {
  cJSON *root = (cJSON *)arg;
  cJSON *v = cJSON_GetObjectItem(root, "voltage");

  /* 带 voltage 参数 → 调压;否则 → 查询当前电压 */
  if (v != NULL && cJSON_IsNumber(v)) {
    float target = (float)v->valuedouble;
    /* 安全限制:只允许 5.0 ~ 20.0V(防呆,保护板子) */
    if (target < 5.0f || target > 20.0f) {
      log_error("[ch224] voltage out of range: %.1f", target);
      emMCP_ResponseValue(emMCP_CTRL_ERROR);
      return;
    }
    /* 动态调压:先写 PPS 电压寄存器(0x53 = 电压×10),再确保 PPS 模式(VOUT=0x06) */
    int r1 = axk_ch224_set_pps_vout(target);
    log_info("[ch224] set_pps_vout(%.1f) = %d", target, r1);
    if (r1 == 0) {
      int r2 = axk_ch224_set_mode(AXK_CH224_VOUT_PPS);
      log_info("[ch224] set_mode(PPS) = %d", r2);
      if (r2 == 0) {
        current_vout = target;
        emMCP_ResponseValue(emMCP_CTRL_OK);
      } else emMCP_ResponseValue(emMCP_CTRL_ERROR);
    } else emMCP_ResponseValue(emMCP_CTRL_ERROR);
  } else {
    /* 查询:回执当前配置电压 */
    char rsp[32];
    snprintf(rsp, sizeof(rsp), "{\"voltage\":%.1f}", current_vout);
    emMCP_ResponseValue(rsp);
  }
}
static void ch224_voltage_check_handler(void *arg) {
  ch224_voltage_set_handler(arg);
}

/* 注册 */
memset(&t, 0, sizeof(t));
t.name = "ch224_voltage";
t.description = "电源输出电压调节工具,voltage参数范围5到20伏,不传voltage参数时查询当前电压";
t.inputSchema.properties[0].name = "voltage";
t.inputSchema.properties[0].description = "目标电压值5-20伏,查询当前电压时不要传此参数";
t.inputSchema.properties[0].type = MCP_SERVER_TOOL_TYPE_NUMBER;
t.setRequestHandler = ch224_voltage_set_handler;
t.checkRequestHandler = ch224_voltage_check_handler;
emMCP_AddToolToToolList(&t);

⚠️ 工具描述里的查询说明很关键:如果 description 只写"电压调节 5-20 伏",AI 在你说"现在电压多少"时会乱填一个电压值发过来(当作设置执行)。加上"不传 voltage 参数时查询当前电压"后,AI 查询时才会发空参数走查询分支。

emMCP_config.h 的工具数量上限 MCP_SERVER_TOOL_NUMBLE_MAX 已设为 7(本项目 4 个工具,足够,无需修改);如使用手动注册模式,需同步更新 mcp_tools_fmt JSON 中的 ch224_voltage 工具描述。

测试
  1. 上电日志应有(本项目真实输出):

    [INFO] ch224 init OK!
    [INFO] ch224 status: 0x08
    [INFO] ch224 set pps vout OK!
    [INFO] ch224 set mode OK!
    

    若日志只有 ch224 set avs vout OK!(旧版文案)不影响功能,最终行为一致:上电即请求 12.2V PPS。

  2. 串口手动测试(USART2,115200),从 5V 开始慢慢试:

    {"role":"AI","msgType":"MCP","data":{"name":"ch224_voltage","args":{"voltage":5}}}
    # 成功 → mcp-responsive ... "data":"true"
    # 用万用表量 USB-C 口 / 板载测试点,确认真的输出 5V
    
  3. AI 语音测试:说 “把电源调到 9 伏”“把电源调到 12 伏”“现在电源是多少?”

    AI 语音控制电源


常见问题与踩坑提示

🔧 日志 ch224 not driver / status 读不到
原因:① 接线 ② 充电器不支持 PD
解决:① SDA→PB6、SCL→PB7 ② 必须用支持 PD/PPS 的充电器(普通 5V 充电器无法协商高电压),C-to-C 线

🔧 调压后电压没变
原因:① 充电器不支持该档位 ② PPS 模式没生效 ③ 寄存器被改错
解决:① 确认充电器支持 PPS(充电器铭牌上标 PPS 字样)② 按顺序先 set_pps_vout()set_mode(AXK_CH224_VOUT_PPS) ③ 确认 PPS 寄存器是 0x53(见②步骤寄存器表,改错会有 ACK 但电压不变)

🔧 切换电压后要拔插充电器才生效原因:CH224 冷启动(重新上电)时才完整重新协商,运行中写寄存器触发不了所有充电器的热协商 解决属正常现象,第一次切到新电压后把充电器拔掉再插上(此时协商按新寄存器值执行),之后在同一档位区间内动态调压一般可直接生效。每换一个目标电压建议插拔一次

🔧 固定 9V 能生效、PPS 调压不生效
原因:充电器只有固定 PD 档位、不支持 PPS
解决:用 axk_ch224_set_vout(AXK_CH224_VOUT_9V) 走固定档(5/9/12/15/20V 任选);或换支持 PPS 的充电器

🔧 用 A-to-C 线无法协商
原因:USB-A 口没有 PD 通信
解决:换 C-to-C 线,且充电器要支持 PD/PPS

🔧 调 12V 时板子直接重启
原因:瞬间掉电/过流
解决:降低目标电压;检查负载是否过大;换更大功率充电器(如 65W)

🔧 查询电压返回的是"配置值"不是实测值
原因:驱动不读回实际协商电压
解决:属正常现象;current_vout 记录的是你设置的值;实测电压用万用表量 USB-C 口

🔧 上电默认 12.2V 太激进
原因:供电配置写死在初始化里
解决:本项目默认 12.2V(板子设计安全值);想改默认电压改 axk_ch224_set_pps_vout(12.2) 那行的数值

🔧 调压后 VOUT 上的外部设备异常
原因:外部设备耐压不足
解决立即调回 5V 并断电检查;VOUT 输出与板内供电隔离,板子本身不会烧,烧的是外部负载(详见下方安全须知)

🔧 充电器能协商但电流不足
原因:充电器功率不够
解决:换大功率充电器;或降低系统功耗(关灯带等)

再强调一遍

CH224 输出电压只在 VOUT/GND 接口,与板子自身供电隔离——调压不会烧板子。但接在 VOUT 上的外部负载必须耐压:从 5V 开始逐档上探,每档确认外部负载承受得住;超过外部负载额定电压会烧坏外部设备(不在保修范围)。

下一步

Released under the MIT License. Build Time 2026-08-07 22:59:19