PPS対応のUSB-PDコントローラーIC CH224Aを使ってみる

Category: 電子工作
Tag: USBWCH
thumbnail

前回の記事ではPDコントローラーのCH224シリーズで、抵抗による設定とHIGH/LOWの組み合わせによる設定のPD出力を試しました。
CH224シリーズの内、CH224A, CH224QはI2Cを使った設定が可能で、前回の方法ではできなかったPPS機能を使うこともできます。
なお、CH224A, CH224Qはピン数が同じパッケージ違いで、機能としては同じ物です。(I2Cのアドレスは異なります)

データシート:
[en] https://www.wch-ic.com/downloads/CH224DS1_PDF.html
[cn] https://www.wch.cn/downloads/CH224DS1_PDF.html

用語集

この記事で登場する用語
  • Extended Power Range(EPR): PD 3.1で追加された最大240Wの出力を可能にする規格
  • Programmable Power Supply(PPS): PD 3.1で追加された出力電圧/電流を3.3~21Vの範囲で20mV/50mA単位で設定できる機能
  • Adjustable Voltage Supply(AVS): PD 3.2で追加されたPPSに似たもの、9~48Vの範囲で100mV単位で設定可能

CH224KとCH224Aの違い

前回使ったCH224Kと今回使うCH224Aはパッケージが同じで、一見I2Cの対応だけが違うように見えますが、データシートにその他の違いがまとめられています。

7.1 CH224AとCH224Kの違い

  • CH224AのPin1(VHV)は耐圧32V、CH224KのPin1(VDD)は耐圧3.6V
  • CH224AのCFG2とCFG3の内部にはプルアップ抵抗があり、CH224Kにはない
  • CH224AのCFG1耐圧は3.8V、CH224KのCFG1耐圧は8V
  • CH224AのVBUS耐圧は32V、CH224KのVBUS耐圧は13.5V

Source: WCH USB PD 多快充协议受电芯片CH224 7.1 CH224A和CH224K 不同点 (翻訳)

CH224KではVDDに1kΩの抵抗を直列接続して過剰な電圧を食わせていましたが、CH224A/QではVDDがVHVになり(働きは同じです)32V耐圧になったため、USBのVBUSに直接接続するだけで良くなりました。

また、設定可能な電圧から15Vが削除され、代わりに28Vが追加されています。
PDの電圧は20Vが最大かと思っていましたが、調べてみるとUSB PD 3.1で追加されたEPR(Extended Power Range)によって28V、36V、48Vが供給できるようになったそうです。(36V、48Vには非対応)

I2C設定

I2Cによる設定は電圧が抵抗で設定されているときに使うことができます。
I2Cの配線はCFG2をSCL、CFG3をSDAと接続します。(CFG2、CFG3は内部プルアップされています)

今回はI2C制御をRaspberryPi Picoで行います。以下のように配線しました。

┌────────┐       ┌────────────┐      ┌─────────┐
|  Pico  |       |   CH224A   |      |  USB-C  |
|        |  SDA  |  Addr:0x23 |      |         |
|    IO4 ├───────┤ CFG3   CC1 ├──────┤ CC1     |
|    IO5 ├───────┤ CFG2   CC2 ├──────┤ CC2     |
└───┬────┘  SCL  |        VBUS├─┬────┤VBUS     |
    |          ┌─┤ CFG1   VHV ├─┘    └────┬────┘
   GND         | └──────┬─────┘           |
               ⎕ 10kΩ   |                GND
               |       GND
              GND

I2C Address

CH224Q: 0x22
CH224A: 0x23

CH224Q/A レジスタマップ

Address Description
0x09 ステータス
0x0A 電圧設定
0x50 最大電流
0x51~52 AVS 電圧設定
0x53 PPS 電圧設定
0x60~8F 対応する電圧などを取得

固定電圧の出力

I2CでPDの固定電圧を出力するときは0x0Aに以下の値を書き込みます。
(PPS, AVS modeについては後述)

0: 5V
1: 9V
2: 12V
3: 15V
4: 20V
5: 28V
6: PPSmode
7: AVS mode

サンプルコード

5V, 9V, 12V, 15V, 20V, 28Vを順に出力するコードです。
充電器が全ての電圧に対応しているとは限りません。特に28Vに対応している充電器なんてほとんどないでしょう。

#include <Wire.h>

#define CH224A_ADDRESS 0x23
#define VOLTAGE_CONTROL 0x0A

const char voltages[][6] = {"5V", "9V", "12V", "15V", "20V", "28V"};

void setup() {
  Wire.begin();
}

int voltage_config = 0;

void loop() {
  Serial.println(voltages[voltage_config]);

  Wire.beginTransmission(CH224A_ADDRESS);
  Wire.write(VOLTAGE_CONTROL);
  Wire.write(voltage_config);
  Wire.endTransmission();

  if (voltage_config == 5)
    voltage_config = 0;
  else
    voltage_config++;

  delay(5000);
}

PPS出力

データシートによるとPPSを使うには、まず電圧を設定してからPPSを有効化するそうです。その後、電圧を変更するときはPPS電圧の設定のみを行えば良いとのこと。

PPSの電圧の設定は0x53に値を書き込みます。電圧は100mV単位なので、例えば10Vを出力する場合は100を書き込みます。

PPSの有効化は固定電圧の設定で書き込んだ0x0AにPPS modeなので6を書き込みます。

サンプルコード

このサンプルでは、まずPPSの最低電圧である3.3Vを出力し、その後は5秒間隔で4Vから最大電圧の21Vを順番に出力します。

#include <Wire.h>

#define CH224_ADDRESS 0x23
// Register
#define PPS_VOLTAGE_CONFIG 0x53
#define VOLTAGE_CONTROL 0x0A
// Voltage Control
#define PPS_MODE 6


void setVoltage(float voltage) {
  Wire.beginTransmission(CH224_ADDRESS);
  Wire.write(PPS_VOLTAGE_CONFIG);
  Wire.write((int)(voltage*10));
  Wire.endTransmission();
}

void setup() {
  Wire.begin();

  setVoltage(3.3);

  Wire.beginTransmission(CH224_ADDRESS);
  Wire.write(VOLTAGE_CONTROL);
  Wire.write(PPS_MODE);
  Wire.endTransmission();
}

int voltage = 4;

void loop() {
  delay(5000);

  setVoltage(voltage);

  if (voltage == 21)
    voltage = 4;
  else
    voltage++;
}

実験に使ったAnker 511 ChargerではPPSの対応電圧が3.3~16Vのため、17V以上を要求すると16Vが出力されました。
また、PPSで範囲外の3.2Vを要求すると5V、25Vを要求すると21Vが出力されました(規格で定められているのか、メーカーによるのかはわかりません)

AVS

AVSも使ってみたいのですが、対応する充電器を持っていません。調べたところAppleがつい最近の2025年9月に発売した40Wダイナミック電源アダプタが世界初のAVS対応充電器のようです。
このためだけに6500円は払えないので今回は断念します。

余談

偶然気づいたのですが、多摩電子工業のPD充電器、本体やパッケージにはPPS対応とは一切書かれてませんが、3.3V~21VまでのPPS出力ができます。