LPCXpresso: 簡易電圧ロガー

今回は、LPCXpressoを使用して簡易電圧ロガーを構成する例をご紹介したいと思います。簡易電圧ロガーでは、今まで本サイトで取り上げてきた幾つかの内容を利用して構成していきます。

簡易電圧ロガーの仕様

まず最初に簡易電圧ロガーの仕様を簡単にまとめておきます。
(a)ADC0とADC1で電圧測定を行う
(b)測定間隔は、Systick Timerを利用したディレイで約1秒とする
(c)測定値は、UARTでパソコンへ送信する
(d)送信文字列は、sprintfを利用して文字配列に格納する。
(e)ADCのコードか電圧値のどちらかを選択して送信可能

使用する要素技術

各要素技術については、過去の記事で取り上げていますので、各々参照して下さい。

(a)ADC0とADC1で電圧測定を行う
→ADCの使い方

(b)測定間隔は、Systick Timerを利用したディレイで約1秒とする
→SysTickタイマーを利用したdelay

(c)測定値は、UARTでパソコンへ送信する
→UART通信

(d)送信文字列は、sprintfを利用して文字配列に格納する。
→sprintfの使い方

ドライバとソースファイル構成

プロジェクトには、以下のドライバやソースファイルを使用します。
lpc_adc_2

以下のファイルは、サンプルプログラムに付属しているものを、そのまま使用します。サンプルプログラムをインポートしていない場合は、「サンプルプログラムのインポート」を参照してプログラムをインポートして下さい
adc.c/h
type.h

次の2つのファイルは、過去記事で取り上げたものを使用します。
timer_systick.c/h
uart_small.c/h

それぞれ
→SysTickタイマーを利用したdelay
→UART通信
を参照して下さい。

以下のものは、プロジェクト作成時に自動生成されるものを使用します。
cr_startup_lpc11xx/c
crp.c
system_LPC11xx/h

driver_config.hは、以下のものを記述しておきます。

#ifndef DRIVER_CONFIG_H_
#define DRIVER_CONFIG_H

#ifdef __USE_CMSIS
#include 
#endif

#define CONFIG_ENABLE_DRIVER_CRP						1
#define CONFIG_CRP_SETTING_NO_CRP						1

#define CONFIG_ENABLE_DRIVER_ADC						1

#define CONFIG_ENABLE_DRIVER_PRINTF						1

#define CONFIG_ENABLE_DRIVER_UART_SMALL                 1

 /* DRIVER_CONFIG_H_ */
#endif

main.cについては、次節で詳しく説明していきます。以上で必要なファイルの準備が整いました。

メイン・プログラム

簡易電圧ロガーのメイン・プログラムは以下の通りです。

/*
===============================================================================
 Name        : main.c
 Author      : easy labo
 Version     : 1.0
 Date        : 2014/07/05
 Copyright   : easy labo
 Description : main definition
===============================================================================
*/

#ifdef __USE_CMSIS
#include "LPC11xx.h"
#endif

#include 

// TODO: insert other include files here
#include 
#include 
#include "driver_config.h"
#include "adc.h"
#include "timer_systick.h"
#include "uart_small.h"

// TODO: insert other definitions and declarations here
#define UART_BAUD 9600       //Baud rate
#define SUPPLY_VOLTAGE 3300  //VIN=3300mV
#define ADC_COUNT_MAX 1023   //10bit ADC
#define ADC_INT_TIME 100     //Delay 100*10ms by timer_systick
#define OUTPUT_CODE 0        //Output is 1:ADC Code, 0:Voltage (mV)

int main(void) {

    // TODO: insert code here
	UartInit(UART_BAUD);    //UART initialization
	SysTickInit();          //Systic timer initialization
	ADCInit( ADC_CLK );     //ADC initialization

	uint32_t adc_val_0;     //Code of ADC0
	uint32_t adc_val_1;     //Code of ADC1

	double adc_voltage_0;   //Voltage value of ADC0
	double adc_voltage_1;   //Voltage value of ADC1

	char uart_string_0[10] = {'\0'}; //String for UART (ADC0)
	char uart_string_1[10] = {'\0'}; //String for UART (ADC1)

    // Force the counter to be placed into memory

    // Enter an infinite loop, just incrementing a counter
    while(1) {

    	//Read ADC0 value
        ADCRead( 0 );
        adc_val_0 = ADCValue[0];
        while ( !ADCIntDone );
        ADCIntDone = 0;

        //Read ADC1 value
        ADCRead( 1 );
        adc_val_1 = ADCValue[1];
        while ( !ADCIntDone );
        ADCIntDone = 0;

        //Voltage Value
        adc_voltage_0 = SUPPLY_VOLTAGE*adc_val_0/ADC_COUNT_MAX;
        adc_voltage_1 = SUPPLY_VOLTAGE*adc_val_1/ADC_COUNT_MAX;

        //uint32_t, double to string
        if(OUTPUT_CODE){
        	sprintf( uart_string_0, "%d", adc_val_0 );
        	sprintf( uart_string_1, "%d", adc_val_1 );
        }else{
        	sprintf( uart_string_0, "%.4d", (int)adc_voltage_0 );
        	sprintf( uart_string_1, "%.4d", (int)adc_voltage_1 );
        }

        //Send data on UART
		UartPutS( "ADC0 = " );
		UartPutS( uart_string_0 );
		if(OUTPUT_CODE==0){
			UartPutS("mV , ");
		}
		UartPutS( "ADC1 = " );
		UartPutS( uart_string_1 );
		if(OUTPUT_CODE==0){
			UartPutS("mV");
		}
		UartPutS("\r\n");

		//Interval
        delaySysTick(ADC_INT_TIME);
    }
    return 0 ;
}

順にメインプログラムの内容を追っていきます。

18行目から
必要なファイルをインクルードします。

26行目から
必要な宣言を行います。OUTPUT_CODEでUART出力フォーマットを設定します。
OUTPUT_CODE=0:ADCのコードをそのまま出力
OUTPUT_CODE=1:ADCのコードを電圧値に変換し出力

36行目から
各種の初期化を行います

40行目から
必要な変数を宣言します

46行目から
格納用の文字配列を宣言します。

55行目から
ADC0とADC1で電圧測定を行います。

66行目から
ADCコンバータのコードを電圧値に変換します。

70行目から
出力フォーマットに従って、文字列配列に値を格納します。ここで、sprintfを使用します。

79行目から
UARTへ文字列を送信します。

92行目から
Systic Timerを利用したDelayで、測定間隔を約1秒にします。

簡易電圧ロガーの実行

LPCXpressoのTXDとRXDをUSBシリアル変換ボードなどでパソコンへ接続すれば、簡易電圧ロガーの動作を確認できます。
TXDとRXDの接続については、記事「RS232規格」を参照して下さい。なお、LPCXpressoのTXD、RXDは3.3Vレベルなので注意しましょう。

UART通信には、記事「シリアル通信に使用できるターミナルソフト Tera Term」で紹介した、Tera Termなどの通信ソフトを使用します。

lpc_adc_1

上記の例では、電圧値に変換したものを表示させています。

まとめ

以上、LPCXpressoを利用した簡易電圧ロガーについて説明してきました。3.3Vより高い電圧を測定したい場合は、ADC端子に直接入力せず抵抗分圧する等、状況に応じてカスタマイズすれば、様々な用途で使用できる筈です。

→その他のLPCXpresso関連情報

Sponsored Link