# adc.c

adc.c は、多くのサンプルコードの common/Source/adc.c として含まれています。

以下のコードが関係します。

| ファイル名            | 内容                  |
| ---------------- | ------------------- |
| sensor\_driver.h | センサー処理を抽象化（ヘッダファイル） |
| sensor\_driver.c | 状態遷移を用いたセンサー処       |
| adc.h            | ADC処理部（ヘッダファイル）     |
| adc.c            | ADC処理部              |

{% hint style="warning" %}
サンプルごとにコードに違いがある場合があります。
{% endhint %}

### 利用方法

以下のコード中のコメントを参照してください。

```c
#include "sensor_driver.h"
#include "adc.h"

tsObjData_ADC sObjADC; // ADC管理構造体（データ部）
tsSnsObj sADC; // ADC管理構造体（制御部）
int16 a1,a2,ab; // 結果格納用

...
	// ADC 初期化
	vSnsObj_Init(&sADC);
	vADC_Init(&sObjADC, &sADC, TRUE);
	vADC_WaitInit(); // ハード初期化待ちを行う

...
	// ADC計測したいポートの指定（以下では電源電圧とADC1,2）
	sObjADC.u8SourceMask = TEH_ADC_SRC_VOLT
    	| TEH_ADC_SRC_ADC_1 | TEH_ADC_SRC_ADC_2;
    
	// ADC開始
	vSnsObj_Process(&sADC, E_ORDER_KICK); // 開始の号令

// ADCの１チャネル処理が終わるのを待って(=E_AHI_DEVICE_ANALOGUE割り込み)
// vSnsObj_Process() を順次呼び出す。
void cbToCoNet_vHwEvent(uint32 u32DeviceId, uint32 u32ItemBitmap) {
	switch (u32DeviceId) {
	case E_AHI_DEVICE_ANALOGUE:
		// ADC完了割り込み
		vSnsObj_Process(&sADC, E_ORDER_KICK);
		if (bSnsObj_isComplete(&sADC)) {
			// 全チャネルの処理が終わった。
			// 値は以下に格納される
			a1=sObjADC.ai16Result[TEH_ADC_IDX_ADC_1]; // ADC1[mV]
			a2=sObjADC.ai16Result[TEH_ADC_IDX_ADC_2]; // ADC2[mV]
			ab=sObjADC.ai16Result[TEH_ADC_IDX_VOLT]; // 電源電圧[mV]
			
			// ADC開始前の初期状態に戻す
			vSnsObj_Process(&sADC, E_ORDER_KICK);
			
			// 連続して実行する場合はもう一度E_ORDER_KICK
			vSnsObj_Process(&sADC, E_ORDER_KICK);
		}
		break;

	default:
		break;
	}
}
```

### 関数

#### void vSnsObj\_Init(tsSnsObj \_\*\_pSnsObj)

センサー管理構造体を初期化します。vADC\_Init()の直前に呼び出します。

#### void vADC\_Init(tsObjData\_ADC \*pData,\_ \_tsSnsObj \_\*\_pSnsObj, bool\_t bInitAPR)

ADCの初期化を行います。tsObjData構造体(結果格納用)とtsSnsObj構造体(ADC管理)はあらかじめ用意しておきます。

bInitAPRはTRUEの場合、ADCハードウェアの初期化を行います。ハードウェアの初期化には若干の時間が必要ですので、必ずvADC\_WaitInit()を実行して初期化を待ちます。

#### void vSnsObj\_Process(tsSnsObj \*pObj, teEvent eEv)

ADC処理の進捗させる。具体的には、ADCの１ポート分の変換完了するたびに本処理を呼び出す。ADCの変換完了を待つには、E\_AHI\_DEVICE\_ANALOGUE割り込みを用いる。単純に一定時間(概ね100usec)経過した後でも構わない。

本処理中で、ADC値の取得と mV値への演算処理が行われ、tsSnsObj構造体中に値が格納される。

本処理は、tsSnsObj構造体で管理される状態遷移に対するイベント処理になる。本処理直後にbSnsObj\_isComplete()を呼び出し処理が完了したかを確認する。再び初期状態に戻すには、改めてE\_ORDER\_KICKを引数として本処理を実行する（つまりADCを再度実行するには完了後に E\_ORDER\_KICK を２回実行することになる）。

#### tsObjData\_ADC構造体

| メンバー             |                                                                                                          |
| ---------------- | -------------------------------------------------------------------------------------------------------- |
| u8SourceMask     | ADC対象のポートを指定するビットマップ。指定したポートがADC対象となる。- TEH\_ADC\_SRC\_VOLT : 電源電圧- TEH\_ADC\_SRC\_ADC\_1-4 : ADC1,2,3,4 |
| u8InputRangeMask | ADC対象のポートのレンジ(0-Vrefまたは0-2Vref)を指定する。指定したポートは0-Vrefとなる。未指定の場合 0-2Vref となる。                               |
| ai16Result\[]    | ADC値を保存する構造体。結果はmV値として格納される。- TEH\_ADC\_IDX\_VOLT : 電源電圧- TEH\_ADC\_IDX\_ADC\_1-4: ADC1,2,3,4            |

####


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://sdk.twelite.info/hw-api-ref/perifuraru/adc/adc.c.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
