2361976_ja-JP

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

2361976_ja-JP

2361976_ja-JP

RW612 GAU GPADC0 — 高インピーダンス源での不整合/非単調な読み取り値

設定

  • MCU :村田製作所製2FRモジュール上のNXP RW612
  • ソフトウェア:Zephyr RTOS(GAU ADCドライバ adc_mcux_gau_adc)
  • ADC :GAU_GPADC0、ベース0x40038000、 GPIO_45上のチャネル3(シングルエンド)
  • 使用例:バッテリー電圧監視(22V~29Vの範囲)

アナログ入力の分圧回路

  Vbat ──[R1 = 243 kΩ]──┬──[R2 = 10 kΩ]── GND
                          │
                         GPIO_45 / ADC0_CH3
  
  • テブナンインピーダンス:約9.6 kΩ
  • Vbat = 25 Vにおけるパッド電圧の予測値 → 988 mV
  • Vbat範囲:22~29V → パッド範囲:869~1146mV(Vrefの余裕範囲内)

Zephyrデバイスツリー構成

&adc0 {
      status = "okay";
      /delete-property/ nxp,input-buffer;   /* try to disable INBUF via DT */

      channel@3 {
          reg = <3>;
          zephyr,gain = "ADC_GAIN_1";
          zephyr,reference = "ADC_REF_INTERNAL";   /* maps to VREF_SEL=01 (1.2V) */
          zephyr,vref-mv = <1200>;
          zephyr,acquisition-time = ;
          zephyr,resolution = <12>;
          zephyr,input-positive = ;
      };
  };
  

アプリケーションレベルの設定

static struct adc_channel_cfg channel_cfg = {
      .gain = ADC_GAIN_1,
      .reference = ADC_REF_INTERNAL,
      .acquisition_time = ADC_ACQ_TIME_DEFAULT,
      .channel_id = 3,
      .input_positive = 3,           /* GAU_ADC_CH3 */
  };

  static int16_t adc_buffer;
  static struct adc_sequence adc_seq = {
      .channels      = BIT(3),
      .buffer        = &adc_buffer,
      .buffer_size   = sizeof(adc_buffer),
      .resolution    = 12,
      .calibrate     = true,
      .oversampling  = 4,            /* 16x HW averaging */
  };
  

まともな読み取り値を得るために手動で修正しなければならなかったこと

以下は、私たちが遭遇し、対処した問題点です。万が一、これらの問題が実際のバグや誤用を示している場合に備えて、ここに記載しておきます。

1. INBUF_ENは実際にはクリアされていませんでした

Zephyrドライバは、このSoC上でDTから/delete-property/ nxp,入力バッファ;をハードウェアに伝播しないため、ADC_REG_ANA[14]を直接クリアしました。

/* GAU_GPADC0 base 0x40038000, ADC_REG_ANA at offset 0x10 */
  volatile uint32_t *p = (volatile uint32_t *)0x40038010;
  *p &= ~(1U << 14);   /* clear INBUF_EN */
  

これがないと、入力バッファが高インピーダンス分圧器にバイアスをかけ、系統的なオフセットが生じる。

2. GPIO_45のデフォルトパッドプルアップにより、分圧ノードは約200mVのバイアスがかかります。

リセット時、SOCCIU_PAD_PU_PD_EN2 (SOCCTRL 非セキュアベース 0x45001000 のオフセット 0x78) のビット [27:26] = 01 → GPIO_45 で VDDIO への約 100 kΩ のプルアップが有効になっていました。9.6 kΩのテブナン電源では、これによりVadcは約200 mVオフセットされます。

nxp,mci-io-mux Zephyr pinctrlドライバはアナログピンのバイアス無効化プロパティを公開していないため、起動時に手動でビットをクリアします。

/* Clear GPIO_45 pad pull (PAD_PU_PD_EN2 bits [27:26]) */
  volatile uint32_t *p = (volatile uint32_t *)0x45001078;
  *p &= ~(0x3U << 26);
  

この後、パッド上のマルチメーターは正確にVbat × 10 / 253(抵抗器の許容誤差の範囲内で約2%以内)を示すため、分圧器自体とパッドバイアスは正常であることがわかります。

3. 設定/常時表示の仕切り

診断目的のため、分圧器は(MOSFETを介してスイッチングされるのではなく)常時電源供給されているため、安定化の問題は発生しません。各ADCサンプリングの前に、マルチメーターを使用してパッド電圧が安定していることを確認します。

測定時のレジスタの状態を確認済み

GAU_GPADC0 (0x40038000):
    ADC_REG_ANA    [0x40038010] = 0x0000A810   → INBUF_EN=0, VREF_SEL=01 (1.2 V),
                                                 INBUF_GAIN=01, INBUF_CHOP_EN=1,
                                                 ADC_CHOP_EN=1, RES_SEL=00 (12-bit)
    ADC_REG_CONFIG [0x40038014] = 0x00000000

  MCI_IO_MUX (0x40004000):
    GPIO_GRP0      [0x40004030] = 0x001C1C02
    GPIO_GRP1      [0x40004034] = 0x201EDBD8

  SOCCIU PAD_PU_PD_EN2:
    [0x45001078] = 0x01152400                  → GPIO_45 PU/PD bits = 00 (no pull)
  

投稿前に試したこと

以下のすべての組み合わせは、分圧器に常時電源を供給した状態でテストされ、マルチメーターによってアナログ入力が定常状態の期待値であることを確認しました。

ノブの値を試した結果、RAWに及ぼす影響

VREF_SEL(参照)1.2 V (01) → 1.8 V (00)RAW値は予想通り約1.2/1.8倍にスケーリングされるが、マルチメーターとの不一致は同じ係数で解消されない。
INBUF_GAIN(ゲイン)ゲイン=1 (01)、ゲイン=0.5 (00)、ゲイン=2 (10)効果なし— INBUF_EN=0 の場合、INBUF_GAIN は何も作用しないことを示唆しています。
バイパス_ウォームアップ / ウォームアップ時間0(バイパス)~最大32サイクルRAWには測定可能な影響なし
ADC_CHOP_EN および INBUF_CHOP_EN両方ともオン、両方ともオフ無効
Zephyr .calibrate真/偽無効

 

残りの問題

上記すべてが正しそうに見えても、RAWは入力電圧を適切に追跡しません。測定シーケンス(Vbatは安定したベンチ電源から供給され、各ポイントでマルチメーターにより分圧器が検証されている):

Vbat (V)パッド(マルチメーター、mV)パッドの期待値 = Vbat·10/253 (mV)adc_read() からのRAWデータ
228488691682
249289491708
26100710282413
28108411071745
29112211461860

  • マルチメーターの列は単調であり、除算理論と約2%以内の誤差で一致する。
  • RAW列は単調増加ではない(26Vで2413まで上昇し、その後28Vで1745まで低下する)。
  • 2413の外れ値を無視しても、22Vと28Vの間のΔRAWは、パッドで+236mVの場合、わずか+63LSBです。Vref = 1.2 V、12ビットの場合、予想されるΔRAW ≈ 805 LSB。つまり、見かけ上の利得は理論値の約0.08倍ということになるが、これは明らかに間違っている。
  • 以前の個々の設定値での測定値では、Vbat ≈ 25 V (マルチメーターパッド ≈ 990 mV) で RAW ≈ 2415 という値が得られており、これは設定値の 1.2 V ではなく、実効 Vref ≈ 1.68 V であることを示唆しているが、これも説明がつかない。

 

私の質問


  1. GAU GPADCのシングルエンド入力パスには、INBUF_EN = 0の場合、INBUF_GAINの値に関係なく常にアクティブになるフロントエンド アッテネータまたは固定ゲインはありますか?私が確認した比率(約0.6~0.7倍)は、VREF_SELとINBUF_GAINとは無関係です。
  2. INBUF_EN = 0(直接サンプリング)は、RW612のシングルエンド測定において実際にサポート/特性化されたモードなのでしょうか、それとも差動モードでのみ有効なのでしょうか?リファレンスマニュアルでは、入力バッファは通常有効にしておくべきだと示唆されているが、有効にするとバイアス電流のために高インピーダンスのソースが使用できなくなる。
  3. シングルエンド直接サンプリングモードにおけるADC0_CH3の推奨最大ソースインピーダンスはどれくらいですか?9.6 kΩのテブナンインピーダンスは許容範囲内でしょうか、それとも外部バッファが必要でしょうか?
  4. GPIO_45は「特別な」チャネルですか(外部参照用のEXT_VREFも伝送できます)?VREF_SEL = 01(内部1.2V)の場合でもEXT_VREFアナログパスは接続されたままで、入力に負荷をかけている可能性がありますか?
  5. 高インピーダンス・低周波DC入力に対応するGAU GPADCに、既知の不具合やチョッパー関連のアーティファクトはありますか?

よろしくお願いします!

Re: RW612 GAU GPADC0 — inconsistent / non-monotonic readings on a high-impedance source

こんにちは、 @_arthur_ さん。お元気でお過ごしでしょうか。

これらのテストはどのZephyrバージョンで実施されたか、確認させていただけますでしょうか?Zephyrのバージョンに関してですが、弊社のダウンストリームリポジトリにZephyr 4.4.0がリリースされました。お客様が観察されている現象は、このバージョンでも発生するかどうかご確認いただけますでしょうか?

さらに、これらのテストはカスタムアプリケーションで実施しましたか?それとも、リポジトリの例から引用したものでしょうか?

タグ(1)
評価なし
バージョン履歴
最終更新日:
‎05-10-2026 02:44 AM
更新者: