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 コマンド送信時の動作... 8 5) 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 1
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 4 A/D_CH3 ADC_IN13 PC3 P1-14 2
3. UART に使用する信号 STM32L-Discovery の UART( 非同期シリアル通信 ) に使用する信号と接続相手との接続は以下の通りです 1) UART1 接続信号表 STM32L-Discovery の UART 信号 番号 CPU 機能名 CPU 信号名 基板コネクタピン番号 方向 接続相手の信号名 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 D-SUB 9S ストレート接続 2) RS232C ドライバ接続例 この例では DSUB-9S には TxD, RxD, GND の 3 本の信号以外は接続されません 3
3) PC との接続例 PC との接続は以下のようになります STM32L-Discovery PC RS232C ドライバ RS232C 変換ケーブル DSUB-9S 図 3. 3) RS232C ドライバと DSUB-9S との接続は以下の通りです RS232C ドライバ DSUB-9S 1 RS1_TxD --- > 2 RxD 2 RS1_RxD < --- 3 TxD 3 GND < --- > 5 GND 4
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 アプリケーションの起動画面 Access_SerialPort アプリケーションを起動すると以下のダイアログが表示されます 5
2) COM ポートと通信速度の選択 COM 選択の ComboBox で COM を選択します 確認のメッセージが表示されるので よい場合は [ はい (Y)] ボタンをクリックします 次ページに続く 6
この例では COM4 に設定しました とメッセージが表示されています 通信速度は 9600bps でよいのでこのままにしておきます 次ページに続く 7
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 データを送信します 次ページに続く 8
5) ADC Input ALL コマンド送信時の動作 CPU 基板は 0.5 秒に一回 A/D CH0 ~ A/D CH3 の 4CH の A/D データを送信します 6) ADC Input STOP コマンド送信時の動作 CPU 基板は A/D データの送信を停止します 9
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 Status LED に使用している I/O の初期設定と点滅処理を記述しています 10
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); 11
3) A/D 入力データの移動平均処理 A/D 入力データに対して各 CH ごとに移動平均処理を行います //------------------------------------------------------------- // A/D 入力データの移動平均処理 //------------------------------------------------------------- void MovingAverageADC(void); 4) 移動平均についてデータ 8 個の移動平均について説明します データ 8 個の平均を新しいデータが入力される毎に 1 データずつ ずらして平均していきます 平均するデータが移動していくので移動平均と呼びます 以下にその様子を示します Data0 Data1 Data2 Data3 Data4 Data5 Data6 Data7 Data8 Data9 Data10 Data11 Data0 ~ Data7 の平均値 Data1 ~ Data8 の平均値 Data2 ~ Data9 の平均値 Data3 ~ Data10 の平均値 Data4 ~ Data11 の平均値 移動平均は上の図のようにでこぼこしたデータを滑らかにする効果があります 平均する個数を多くするほど滑らかになりますが 応答が遅くなります 短い時間での変化が見えなくなってしまいます また 平均する個数を多くするほどグラフの形が後ろにずれていきます //------------------------------------------------------------- // A/D 入力データの移動平均処理 //------------------------------------------------------------- void MovingAverageADC(void); の処理では 移動平均の個数を 32 個に設定しています ヘッダファイル HandleADC.h のなかで #define defnumbersaverage 32 を定義しています この定義を変更すると 移動平均の個数を変更できます 12
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 初期化 void InitializeUART1(uint32_t uint32_baudrate); 13
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 点滅 void BlinkStatusLED(uint16_t uint6_timeon, uint16_t uint16_timeoff); 14
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); 15
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, uint8_t *puint8_senddata); 16
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" 17
改訂履歴 V001 2014/02/25 初版 V002 2014/02/25 1. A/D について 入力電圧値を訂正 V003 2014/03/30 説明追加 18