ch32v003-getting-started-ja

MounRiver Studioで使う CH32V003 はじめの一歩

View on GitHub

目次に戻る

ADC

ADCが妙に多機能だけれど、余計な機能は使わなければ良い。

(オペアンプの設定は、拡張構成 EXTEND

内部チャンネル

キャリブレーション

  1. CTLR2の RSTCALに 1を書くことでキャリブレーションレジスタを初期化する。RSTCALがハードウェアによって 0にクリアされるのを待つことで初期化完了を確認する。
  2. CALに 1を書くことでキャリブレーションを開始する。キャリブレーションが完了すると、ハードウェアはCALビットを自動的にクリアし、キャリブレーションコードを ADC_RDATARに格納する。

ADCモジュールの電源投入時にキャリブレーションを実行することが推奨される。

キャリブレーションを開始する前に、ADCモジュールが電源投入状態(ADON==1)であることを、少なくとも2クロックサイクル以上維持している必要がある。

変換モード

単一変換モード

1チャンネルの変換を行い動作を終了する。

単一スキャンモード

選択された複数のチャンネルを順番に変換を行い動作を終了する。

トリガインジェクション

通常グループのスキャン中にインジェクショングループの変換が開始されると、現在の変換はキャンセルされ、インジェクショングループの変換が行われる。インジェクショングループの変換がすべて終了すると、中断されていた通常チャンネルの変換が再開される。

インジェクショングループの変換中に通常グループの変換開始イベントが発生した場合、インジェクショングループの変換が終了したあとに通常グループの変換が開始される。

自動インジェクション

通常グループの変換が終了した後、自動的にインジェクショングループの変換が実行される。

単一間欠モード

変換トリガで、グループ内の数チャンネルずつ変換を行う。変換するチャンネル数を設定可能。

連続変換モード

変換が終了すると、直ちに次の変換を開始する。

アナログウォッチドッグ

AD変換結果が、設定したしきい値より低いまたは高い時にステータスビットをセットする。割り込み生成も可能。

ADCレジスタ

ADC1->STATR
ADC1->CTLR1
ADC1->CTLR2
ADC1->SAMPTR1
ADC1->SAMPTR2
ADC1->IOFR1
ADC1->IOFR2
ADC1->IOFR3
ADC1->IOFR4
ADC1->WDHTR
ADC1->WDLTR
ADC1->RSQR1
ADC1->RSQR2
ADC1->RSQR3
ADC1->ISQR
ADC1->IDATAR1
ADC1->IDATAR2
ADC1->IDATAR3
ADC1->IDATAR4
ADC1->RDATAR
ADC1->DLYR
STATR ADCステータスレジスタ 初期値 0x00000000
[31: 5]       RO  Reserved
[    4] STRT  RW0 通常チャンネル変換開始状態 1:変換開始された
[    3] JSTRT RW0 インジェクションチャンネル変換開始状態 1:変換開始された
[    2] JEOC  RW0 インジェクションチャンネル変換完了状態 1:すべてのチャンネルの変換完了した
[    1] EOC   RW0 通常・インジェクション変換完了状態 1:いずれかの変換完了した
                  0を書くか、RDATARレジスタの読み出しでクリアされる
[    0] AWD   RW0 アナログウォッチドッグフラグ 1:イベントが発生した
CTLR1 ADCコントロールレジスタ1 初期値 0x02000000
[31:27]              RO Reserved
[26:25] CALVOL[1:0]  RW キャリブレーション電圧選択 01:AVDD*(2/4) 10:AVDD*(3/4) 他の値禁止
[   24]              RO Reserved
[   23] AWDEN        RW 通常チャンネルアナログウォッチドッグ有効化 1:有効
[   22] JAWDEN       RW インジェクションチャンネルアナログウォッチドッグ有効化 1:有効
[21:16]              RO Reserved
[15:13] DISCNUM[2:0] RW 間欠モードで変換するチャンネル数 000:1 ~ 111:8
[   12] JDISCEN      RW インジェクションチャンネル間欠モード有効化 1:有効
[   11] DISCEN       RW 通常チャンネル間欠モード有効化 1:有効
[   10] JAUTO        RW 自動インジェクション自動切り替え有効化 1:有効
[    9] AWDSGL       RW スキャンモードでのアナログウォッチドッグチャンネル選択
                        1:単一のチャンネルで有効 AWDCH[4:0]でチャンネルを選択
                        0:全てのチャンネルで有効
[    8] SCAN         RW スキャンモード有効化 1:有効
                        IOFRx, RSQRxで選択されたチャンネルをすべてのチャンネルを連続変換
[    7] JEOCIE       RW インジェクションチャンネル変換終了割り込み有効化 1:有効
[    6] AWDIE        RW アナログウォッチドッグ割り込み有効化 1:有効
[    5] EOCIE        RW 変換終了割り込み有効化 1:有効 (通常、インジェクションどちらでも発生)
[ 4: 0] AWDCH[4:0]   RW アナログウォッチドッグチャンネル選択 0~9
CTLR2 ADCコントロールレジスタ2 初期値 0x00000000
[31:23] RO Reserved
[   22] SWSTART      RW 通常チャンネル変換開始 1:開始 (ハードウェアでクリアされる)
[   21] JSWSTART     RW インジェクションチャンネル変換開始 1:開始 (ハードウェアでクリアされる)
[   20] EXTTRIG      RW 通常チャンネル外部トリガ有効化 1:有効
[19:17] EXTSEL[2:0]  RW 通常チャンネル外部トリガ選択
                        000:TIM1_TRGO  011:TIM2_TRGO  110:PC3 / PC2
                        001:TIM1_CC1   100:TIM2_CC1   111:SWSTART
                        010:TIM1_CC2   101:TIM2_CC2
[   16]              RO Reserved
[   15] JEXTTRIG     RW インジェクションチャンネル外部トリガ有効化 1:有効
[14:12] JEXTSEL[2:0] RW インジェクションチャンネル外部トリガ選択
                        000:TIM1_CC3  100:予約
                        001:TIM1_CC4  101:予約
                        010:TIM2_CC3  110:PD1 / PA2
                        011:TIM2_CC4  111:JSWSTART
[   11] ALIGN        RW データアライメント設定 1:左詰め 0:右詰め
[10: 9]              RO Reserved
[    8] DMA          RW DMA有効化 1:有効
[ 7: 4]              RO Reserved
[    3] RSTCAL       RW キャリブレーションレジスタを初期化 1:初期化 (ハードウェアでクリアされる)
[    2] CAL          RW キャリブレーション開始 1:開始 (ハードウェアでクリアされる)
[    1] CONT         RW 連続変換モード有効化 1:有効 0を書くまで変換を続ける
[    0] ADON         RW ADCオンオフ制御
                        0の状態で 1を書くと ADCはパワーダウンモードから復帰する
                        1の状態で 1を書くと変換を開始する(ADON以外のビットを変更すると開始されない)
                        0を書くと ADCはパワーダウンモードへ移行する
SAMPTR1 ADCサンプルタイムレジスタ1 初期値 0x00000000
[31:18]        RO Reserved
[17:15] SMP15  RW CH15 のサンプル時間設定ビット
                  000: 3 cycles   100: 43 cycles
                  001: 9 cycles   101: 57 cycles
                  010:15 cycles   110: 73 cycles
                  011:30 cycles   111:241 cycles
[14:12] SMP14  RW CH14 のサンプル時間設定ビット
[11: 9] SMP13  RW CH13 のサンプル時間設定ビット
[ 8: 6] SMP12  RW CH12 のサンプル時間設定ビット
[ 5: 3] SMP11  RW CH11 のサンプル時間設定ビット
[ 2: 0] SMP10  RW CH10 のサンプル時間設定ビット

SAMPTR2 ADCサンプルタイムレジスタ2 初期値 0x00000000
[31:30]        RO Reserved
[29:27] SMP9   RW CH9 のサンプル時間設定ビット
                  000: 3 cycles   100: 43 cycles
                  001: 9 cycles   101: 57 cycles
                  010:15 cycles   110: 73 cycles
                  011:30 cycles   111:241 cycles
[26:24] SMP8   RW CH8 のサンプル時間設定ビット
[23:21] SMP7   RW CH7 のサンプル時間設定ビット
[20:18] SMP6   RW CH6 のサンプル時間設定ビット
[17:15] SMP5   RW CH5 のサンプル時間設定ビット
[14:12] SMP4   RW CH4 のサンプル時間設定ビット
[11: 9] SMP3   RW CH3 のサンプル時間設定ビット
[ 8: 6] SMP2   RW CH2 のサンプル時間設定ビット
[ 5: 3] SMP1   RW CH1 のサンプル時間設定ビット
[ 2: 0] SMP0   RW CH0 のサンプル時間設定ビット
IOFR1 ADCインジェクションチャンネルデータオフセットレジスタ1 初期値 0x00000000
[31:10]               RO Reserved
[ 9: 0] JOFFSET1[9:0] RW インジェクションチャンネル1 データオフセット値
                         変換後、変換データからこの値を減算して IDATAR1に書き込まれる
                         (減算でラップアラウンドするか要確認。しないっぽい)

IOFR2 ADCインジェクションチャンネルデータオフセットレジスタ2 初期値 0x00000000
[31:10]               RO Reserved
[ 9: 0] JOFFSET2[9:0] RW インジェクションチャンネル2 データオフセット値

IOFR3 ADCインジェクションチャンネルデータオフセットレジスタ3 初期値 0x00000000
[31:10]               RO Reserved
[ 9: 0] JOFFSET3[9:0] RW インジェクションチャンネル3 データオフセット値

IOFR4 ADCインジェクションチャンネルデータオフセットレジスタ4 初期値 0x00000000
[31:10]               RO Reserved
[ 9: 0] JOFFSET4[9:0] RW インジェクションチャンネル4 データオフセット値
WDHTR ADCウォッチドッグ 高しきい値レジスタ 初期値 0x000003ff
[31:10]          RO Reserved
[ 9: 0] HT[9:0]  RW 上側しきい値

WDLTR ADCウォッチドッグ 低しきい値レジスタ 初期値 0x00000000
[31:10]          RO Reserved
[ 9: 0] LT[9:0]  RW 下側しきい値
RSQR1 ADCレギュラーシーケンスレジスタ1 初期値 0x00000000
[31:24]           RO Reserved
[23:20] L[3:0]    RW 通常変換での変換チャンネル数設定 0000:1 ~ 1111:16
[19:15] SQ16[4:0] RW 通常変換での 16番目の変換チャンネル 0 ~ 9
[14:10] SQ15[4:0] RW 通常変換での 15番目の変換チャンネル 0 ~ 9
[ 9: 5] SQ14[4:0] RW 通常変換での 14番目の変換チャンネル 0 ~ 9
[ 4: 0] SQ13[4:0] RW 通常変換での 13番目の変換チャンネル 0 ~ 9

RSQR2 ADCレギュラーシーケンスレジスタ2 初期値 0x00000000
[31:30]           RO Reserved
[29:25] SQ12[4:0] RW 通常変換での 12番目の変換チャンネル 0 ~ 9
[24:20] SQ11[4:0] RW 通常変換での 11番目の変換チャンネル 0 ~ 9
[19:15] SQ10[4:0] RW 通常変換での 10番目の変換チャンネル 0 ~ 9
[14:10] SQ9[4:0]  RW 通常変換での  9番目の変換チャンネル 0 ~ 9
[ 9: 5] SQ8[4:0]  RW 通常変換での  8番目の変換チャンネル 0 ~ 9
[ 4: 0] SQ7[4:0]  RW 通常変換での  7番目の変換チャンネル 0 ~ 9

RSQR3 ADCレギュラーシーケンスレジスタ3 初期値 0x00000000
[31:30]           RO Reserved
[29:25] SQ6[4:0]  RW 通常変換での  6番目の変換チャンネル 0 ~ 9
[24:20] SQ5[4:0]  RW 通常変換での  5番目の変換チャンネル 0 ~ 9
[19:15] SQ4[4:0]  RW 通常変換での  4番目の変換チャンネル 0 ~ 9
[14:10] SQ3[4:0]  RW 通常変換での  3番目の変換チャンネル 0 ~ 9
[ 9: 5] SQ2[4:0]  RW 通常変換での  2番目の変換チャンネル 0 ~ 9
[ 4: 0] SQ1[4:0]  RW 通常変換での  1番目の変換チャンネル 0 ~ 9
ISQR ADCインジェクションシーケンスレジスタ 初期値 0x00000000
[31:22]           RO Reserved
[21:20] JL[1:0]   RW インジェクション変換での変換チャンネル数設定 00:1 ~ 11:4
[19:15] JSQ4[4:0] RW インジェクション変換での 4番目の変換チャンネル 0 ~ 9
[14:10] JSQ3[4:0] RW インジェクション変換での 3番目の変換チャンネル 0 ~ 9
[ 9: 5] JSQ2[4:0] RW インジェクション変換での 2番目の変換チャンネル 0 ~ 9
[ 4: 0] JSQ1[4:0] RW インジェクション変換での 1番目の変換チャンネル 0 ~ 9
通常変換シーケンスとは異なり、シーケンスの開始位置は(4 - JL)からとなる。
- 変換数 = 4 の場合:変換順序は JSQ1 - JSQ2 - JSQ3 - JSQ4
- 変換数 = 3 の場合:変換順序は JSQ2 - JSQ3 - JSQ4
- 変換数 = 2 の場合:変換順序は JSQ3 - JSQ4
- 変換数 = 1 の場合:変換順序は JSQ4 のみ
IDATAR1 ADCインジェクションデータレジスタ1 初期値 0x00000000
[31:16]             RO Reserved
[15: 0] JDATA[15:0] RO インジェクションチャンネル変換データ(左詰めまたは右詰め)

IDATAR2 ADCインジェクションデータレジスタ2 初期値 0x00000000
[31:16]             RO Reserved
[15: 0] JDATA[15:0] RO インジェクションチャンネル変換データ(左詰めまたは右詰め)

IDATAR3 ADCインジェクションデータレジスタ3 初期値 0x00000000
[31:16]             RO Reserved
[15: 0] JDATA[15:0] RO インジェクションチャンネル変換データ(左詰めまたは右詰め)

IDATAR4 ADCインジェクションデータレジスタ4 初期値 0x00000000
[31:16]             RO Reserved
[15: 0] JDATA[15:0] RO インジェクションチャンネル変換データ(左詰めまたは右詰め)
RDATAR ADCレギュラーデータレジスタ 初期値 0x00000000
[31:16]             RO Reserved
[15: 0] DATA[15:0]  RO 通常チャンネル変換データ(左詰めまたは右詰め)
DLYR ADCディレイドデータレジスタ 初期値 0x00000000
[31:10]             RO Reserved
[    9] DLYSRC      RW 外部トリガソース遅延選択 1:インジェクションチャンネル 0:通常チャンネル
[ 8: 0] DLYVLU[8:0] RW 遅延時間 (単位:ADCクロック)
外部トリガ信号入力から変換開始までの待機時間を設定する

ADCクロックは RCCで設定する

この文章のライセンス

CC0 1.0 Universal

2026-02-22作成 2026-03-14更新 佐藤恭一 kyoutan.jpn.org

目次に戻る