PPS対応のUSB-PDコントローラーIC CH224Aを使ってみる
前回の記事では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出力ができます。