1 STM32L_ADC の説明 V003 2014/03/30
STM32L-Discovery の A/D 入力を行うプログラムです。 A/D CH0 ~ A/D CH3 の 4 本の入力が可能です。 提供する PC のアプリケーション Access_SerialPort を使用して UART(非同期シリアル通信)により、A/D 入力の表示を 行うことができます。
無料の開発ツール Atollic TrueSTUDIO for ARM Lite (試用版) で作成したプロジェクトです。 プログラムの開始番地は 0x08000000 です。デバッグが可能です。
目次
1. A/D 入力について ... 2 2. A/D 入力に使用する信号 ... 2 3. UART に使用する信号 ... 3 4. プログラム実行時の動作と確認 ... 5 4.1. 実行時の動作 ... 5 4.2. 動作確認 ... 5 1) Access_SerialPort アプリケーションの起動画面 ... 5 2) COM ポートと通信速度の選択 ... 6 3) A/D データ入力コマンド ... 8 4) ADC Input CH0 コマンド送信時の動作 ... 85) ADC Input ALL コマンド送信時の動作 ... 9
6) ADC Input STOP コマンド送信時の動作 ... 9
5. プロジェクトの構成 ... 10 5.1. 独自に追加したソースフォルダ ... 10 5.2. ソースフォルダ src のファイル... 11 6. 主なモジュールの説明 ... 11 6.1. HandleADC ... 11 1) ADC の初期化 ... 11 2) A/D 入力開始 ... 11 3) A/D 入力データの移動平均処理 ... 12 4) 移動平均について ... 12 6.2. HandleTIM ... 13 6.3. HandleUART ... 13 6.4. main.c ... 14 6.5. UserPrograms ... 14 6.6. CommunicateHOST ... 15
2 1. A/D 入力について 分解能 12bit の A/D コンバータ入力です。 A/D 入力電圧 と ディジタル値 との対応は理論上、 入力電圧 0V : 0 入力電圧 +3V : 4095 です。 実際はオフセットと傾きがあり、ぴったり この数値にはなりません。 2. A/D 入力に使用する信号
STM32L_ADC プロジェクトにおける STM32L-Discovery の A/D 入力に使用する信号は A/D_CH0 ~ A/D_CH3 の 4 本です。
以下に、A/D 信号表を示します。 A/D 信号表
ピン番号 信号名 CPU 機能名 CPU 信号名 STM32L-Discovery
コネクタピン番号
1 A/D_CH0 ADC_IN10 PC0 P1-11
2 A/D_CH1 ADC_IN11 PC1 P1-12
3 A/D_CH2 ADC_IN12 PC2 P1-13
3 3. UART に使用する信号 STM32L-Discovery の UART(非同期シリアル通信)に使用する信号と接続相手との接続は以下の通りです。 1) UART1 接続信号表 STM32L-Discovery の UART 信号 番号 CPU 機能名 CPU 信号名 基板コネクタピン番号 方向 接続相手の 信号名 D-SUB 9S ストレート接続 1 USART1_TX PA9 P2-22 --- > RxD 2 2 USART1_RX PA10 P2-21 < --- TxD 3 3 GND GND P1-2, P1-9, P1-28 P2-2, P2-5, P2-28 < --- > GND 5 2) RS232C ドライバ接続例 この例では DSUB-9S には TxD, RxD, GND の3本の信号以外は接続されません。
4 3) PC との接続例 PC との接続は以下のようになります。 RS232C ドライバと DSUB-9S との接続は以下の通りです。 RS232C ドライバ DSUB-9S 1 RS1_TxD --- > 2 RxD 2 RS1_RxD < --- 3 TxD 3 GND < --- > 5 GND RS232C ドライバ D S U B -9S PC RS232C 変換ケーブル STM32L-Discovery 図3. 3)
5 4. プログラム実行時の動作と確認
4.1. 実行時の動作
1) プログラムを実行すると基板上の LED LD3(緑)が 1 秒点灯、2 秒消灯 で点滅します。 2) UART1 ポートで A/D 入力コマンドを受信すると指定された A/D の CH の A/D 値を出力します。
4.2. 動作確認
UART(非同期シリアル通信)のツール Access_SerialPort アプリケーションを使用して、CPU 基板が送出する A/D 入力値を表示することができます。
1) Access_SerialPort アプリケーションの起動画面
6 2) COM ポートと通信速度の選択
COM 選択の ComboBox で COM を選択します。
確認のメッセージが表示されるので、よい場合は [はい(Y)] ボタンをクリックします。
7
この例では、”COM4 に設定しました。” とメッセージが表示されています。 通信速度は 9600bps でよいのでこのままにしておきます。
8 3) A/D データ入力コマンド
A/D 入力コマンドには以下の8種類があります。 a) ADC Input STOP : A/D データ送信停止 b) ADC Input CH0 : A/D CH0 データ送信 c) ADC Input CH1 : A/D CH1 データ送信 d) ADC Input CH2 : A/D CH2 データ送信 e) ADC Input CH3 : A/D CH3 データ送信 f) ADC Input ALL : A/D 全 CH データ送信
コマンドを送信すると、CPU 基板はコマンドに応じて動作します。
コマンド以外の文字列を送信すると、文字列がそのままエコーバックされます。
4) ADC Input CH0 コマンド送信時の動作
CPU 基板は 0.5 秒に一回 A/D CH0 の A/D データを送信します。
9 5) ADC Input ALL コマンド送信時の動作
CPU 基板は 0.5 秒に一回 A/D CH0 ~ A/D CH3 の 4CH の A/D データを送信します。 6) ADC Input STOP コマンド送信時の動作
10 5. プロジェクトの構成 プロジェクトを開いて、左側のプロジェクト・エクスプローラーを開いた状態です。 5.1. 独自に追加したソースフォルダ 独自に追加したソースフォルダについて簡単に説明します。 1) CommonModules 共通処理を記述しています。 2) CommunicateHOST UART の通信処理を記述しています。A/D 入力のコマンドを受信して処理を行います。 3) Handles Peripheral の設定などを行っています。 a) HandleTIM.h HandleTIM.c タイマ割り込みを使用するために、タイマの初期設定を記述しています。 b) HandleUART.h HandleUART.c UART の初期設定と送受信の処理を記述しています。 c) HandleADC.h HandleADC.c A/D の初期化と A/D 入力の処理を記述しています。 4) UserPrograms
11 5.2. ソースフォルダ src のファイル
フォルダ src の中の特に重要なファイルについて説明します。 1) main.c
main モジュールが記述されています。プログラムはここから開始します。
I/O と A/D の初期設定と UART による送受信モジュールの呼び出しを記述しています。 2) stm32f4xx_it.c
Timer2 割り込みと UART 割り込み および A/D の割り込み処理を記述しています。
6. 主なモジュールの説明 6.1. HandleADC 1) ADC の初期化
ADC の初期化を行います。 //Initialize A/D Converter void InitializeADC(void); 2) A/D 入力開始 指定されたA/D CHの入力を開始します。 //--- // A/D入力開始 //--- //引数 :
// int8_t int8_CH : A/D CHの指定
//--- void StartAD(int8_t int8_CH);
12 3) A/D 入力データの移動平均処理 A/D 入力データに対して各 CH ごとに移動平均処理を行います。 //--- // A/D入力データの移動平均処理 //--- void MovingAverageADC(void); 4) 移動平均について データ 8 個の移動平均について説明します。 データ 8 個の平均を新しいデータが入力される毎に 1 データずつ、ずらして平均していきます。 平均するデータが移動していくので移動平均と呼びます。以下にその様子を示します。 移動平均は上の図のようにでこぼこしたデータを滑らかにする効果があります。平均する個数を多くするほど 滑らかになりますが、応答が遅くなります。短い時間での変化が見えなくなってしまいます。 また、平均する個数を多くするほどグラフの形が後ろにずれていきます。 //--- // A/D入力データの移動平均処理 //--- void MovingAverageADC(void); の処理では、移動平均の個数を 32 個に設定しています。
ヘッダファイル HandleADC.h のなかで #define defNumbersAverage 32 を定義しています。 この定義を変更すると、移動平均の個数を変更できます。
Data0 ~ Data7 の平均値
Data2 ~ Data9 の平均値
Data3 ~ Data10 の平均値
Data4 ~ Data11 の平均値
Data0 Data1 Data2 Data3 Data4 Data5 Data6 Data7 Data8 Data9 Data10 Data11
13 6.2. HandleTIM 1) Timer2 初期化 //--- //Timer2初期化 //--- //引数 :
// uint16_t uint16_TIM_Pulse1 : Timer2 CH1 インターバル // uint16_t uint16_TIM_Pulse2 : Timer2 CH2 インターバル // uint16_t uint16_TIM_Pulse3 : Timer2 CH3 インターバル // uint16_t uint16_TIM_Pulse4 : Timer2 CH4 インターバル
//--- void InitializeTimer2(uint16_t uint16_TIM_Pulse1, uint16_t uint16_TIM_Pulse2,
uint16_t uint16_TIM_Pulse3, uint16_t uint16_TIM_Pulse4);
2) Timer2 割り込み禁止 //Timer2割り込み禁止 void DisableIrqTim2(void); 3) Timer2 割り込み許可 //Timer2割り込み許可 void EnableIrqTim2(void); 6.3. HandleUART 1) UART の初期化 //UART1初期化
14 6.4. main.c 1) 使用するクロックの初期化 void RCC_Configuration(void); 2) I/O の初期化 void Init_GPIOs(void); 6.5. UserPrograms 1) LED に使用する I/O の初期化 // Status LEDポート初期化 void InitializePortStatusLED(void); // Action LEDポート初期化 void InitializePortActionLED(void); 2) StatusLED の点滅 点滅一回の処理 // Status LED点滅
15 6.6. CommunicateHOST 1) UART の初期化 //--- // HOST通信パラメータ初期化 //--- //引数 : // uint32_t uint32_BaudRate : 通信速度 //--- void InitializeCommunicateHOST(uint32_t uint32_BaudRate);
2) HOST 通信処理 受信処理を行い、受信コマンドを処理して応答データを送信します。 //--- // HOST通信処理 //--- //戻り値 : // -1 : 処理中 // 0 : 終了 //--- int16_t CommunicateHOST(void) 3) UART 送信 設定された送信データを送信します。 //---//UART 送信処理 //---//引数 : // uint16_t uint16_Length : 送信データ数 //戻り値 : // 0 : 送信終了 // 1 : エラー //---void SendUART(uint16_t uint16_Length);
16 4) UART 受信 受信の有無をチェックして、受信があったら受信データを受信 Buffer に格納して受信データ数を返します。 //---// UART 受信処理 //---//引数 :
// uint8_t *puint8_ReceiveBuffer : 受信データを格納するBufferのポインタ //戻り値 :
// -1 : 受信なし // 0 : 受信なし // 1以上 : 受信byte数
//---int16_t ReceiveUART(uint8_t *puint8_ReceiveBuffer);
5) HOST コマンドの実行 受信コマンドを判定してそれぞれの処理モジュールを呼び出します。 //--- // HOSTコマンドを実行する。 //--- //引数 : // uint16_t uint16_ReceiveLength : 受信データ数
// uint8_t *puint8_ReceiveData : 受信データが格納されているBufferのポインタ // uint8_t *puint8_SendData : 応答送信データを格納するBufferのポインタ //戻り値 : 応答送信データ数
//--- uint16_t ExecuteCommandHOST(uint16_t uint16_ReceiveLength, uint8_t *puint8_ReceiveData,
17 6) A/D 入力処理 //--- // A/D入力コマンド処理 //--- //引数 : // uint16_t uint16_DataLength : パラメータのデータ数 // uint8_t *puint8_Parameter : A/D入力パラメータのポインタ // "CH0" ~ "CH5" : 単独CHのA/D入力開始 // "ALL" : 6CH全てのA/D入力開始 // "STOP" : A/D入力の停止
// uint8_t *puint8_SendData : 応答データを格納するBufferのポインタ //戻り値 : 応答送信データ数
//---
uint16_t ComActInputADC(uint16_t uint16_DataLength, uint8_t *puint8_Parameter, uint8_t *puint8_SendData);
// Command : "ADC Input [Parameter]"
の [Parameter] の部分を判定して、A/D データの送信を決定する。
//--- // パラメータを判定してA/Dデータ送信状態フラグをセット
//--- //volatile int16_t GLB_intCommunicateADC = -1; // A/Dデータ送信状態フラグ //--- [Parameter] // -1 : A/D送信停止 "STOP" // 0 : A/D CH0データ送信 "CH0" // 1 : A/D CH1データ送信 "CH1" // 2 : A/D CH2データ送信 "CH2" // 3 : A/D CH3データ送信 "CH3" // 4 : A/D CH4データ送信 "CH4" : STM32L-Discoveryはなし // 5 : A/D CH5データ送信 "CH5" : STM32L-Discoveryはなし // 6 : A/D 全CHデータ送信 "ALL" //---
18 改訂履歴
V001 2014/02/25 初版
V002 2014/02/25 1. A/D について 入力電圧値を訂正 V003 2014/03/30 説明追加