RTOS:ADC14

  MSP内のADCを使ってみる。前回までに付け足す形にするので、プロジェクトをコピーし適当な名前をつける。

syscfgを開いて、ADCの+マークを押してADCをつけくわえる。
Nameに適当な名前をつける。ここではデフォルトのまま。Referenceソースを外部にするか内部にするかが選択できるがinternalとそのまま。

ここでは、ADCのピンとしてどのピンをアサインするかの部分を自分が設定したいピンを選択する。同じ要領で、今回は2つのピンをADCの入力にアサイン。

スレッドのcファイルの編集を行う。

    /* Driver Header files */
#include <ti/drivers/GPIO.h>
// #include <ti/drivers/I2C.h>
// #include <ti/drivers/SPI.h>
 #include <ti/drivers/UART.h>
#include <ti/drivers/ADC.h>
// #include <ti/drivers/Watchdog.h>

Driver Header filesの部分のADC.hのコメントアウトをはずすか、無い場合は、includeする。

あと、一番冒頭に後で、memset(配列に指定バイト数分の値をセットする関数)と、sprintf(書式付文字列を文字配列に格納するための関数)を使うので下記のincludeファイルを参照しておく。

#include <string.h>/* to use memset and strcmp*/
#include <stdio.h> /* to use sprintf */
#include <stdlib.h>/* to use sprintf */

mainThread4を以下のように編集する。

void *mainThread4(void *arg0)
{
    const char  echoPrompt[] = "Thread4\n";

    /* ADC conversion result variables */
    uint16_t adcValue0;
    float adcValue0Volt;

    ADC_init();
    ADC_Handle   adc; //adc handle
    ADC_Params   params; //adc parameters

    ADC_Params_init(&params); //initialization of parameters
    adc = ADC_open(CONFIG_ADC_0, &params); //open adc

    int_fast16_t res; //for checking adc converting
    char  UART_TX_buffer[32];
    while (1) {
        UART_write(uart, echoPrompt, sizeof(echoPrompt));

        res=ADC_convert(adc, &adcValue0); //second argument should set address.
        if (res == ADC_STATUS_SUCCESS) {
        adcValue0Volt = (float)ADC_convertRawToMicroVolts(adc, adcValue0)/1000000.0;
        sprintf(UART_TX_buffer,"V=%f\n",adcValue0Volt);
        UART_write(uart, UART_TX_buffer, sizeof(UART_TX_buffer));
        }
        Task_sleep(500 * (1000 / Clock_tickPeriod));
    }
}

上から解説をしていくと、
    /* ADC conversion result variables */
    uint16_t adcValue0;
    float adcValue0Volt;
ここの部分は、AD変換後の結果を格納する変数を用意している。
 ADC_init();
はADCを使うときスレッド内で呼び出す。GPIOとかもGPIO_init()を呼び出していたのと同じ。
   ADC_Handle   adc; //adc handle
    ADC_Params   params; //adc parameters
    int_fast16_t res; //for checking adc converting
ADCのハンドルの定義adcの所は任意で名前をつければよい。paramsも同じで設定パラメーター構造体の名称で適当な名称を与える。
ADCのparamsは、2つしか設定はない。カスタム引数というのと、ADC途中に他のスレッドからの割り込みを安全に保証するためのパラメーター。いずれも動かす事はほぼない。

    ADC_Params_init(&params); //initialization of parameters
このあまり意味のないパラメーターをイニシャライズする一行。

    adc = ADC_open(CONFIG_ADC_0, &params); //open adc
そして、ADCをハンドル名としてオープンする。CONFIG_ADC_0は、cfgファイルで設定した名称をここに入れる。

 int_fast16_t res; //for checking adc converting
 char  UART_TX_buffer[32];

ADC変換が完了したかの戻り値を格納する変数と、UARTに出力するchar型の変数の定義
int_fast16_tは、ADCの結果がこの形で定義されているから。

ここからがwhileの中身
 res=ADC_convert(adc, &adcValue0);
第一引数のadcは使うADCのハンドル名、第二引数は、結果を格納する変数のポインタを入れる。
戻り値は、resで受ける。 int_fast16_tという型は、戻り値が少なくとも 16ビットの大きさを持ち、最も速く処理できる符号付き整数型との事だが、最速が保証されているものでもないらしい。
if (res == ADC_STATUS_SUCCESS) 
で結果が、ADC_STATUS_SUCCESSなら・・・とADC変換が完了しているなら以下の処理とつづけている。#define ADC_STATUS_SUCCESS   (0)と定義されているので、戻りがゼロなら上手く変換されている事になる。

adcValue0Volt = (float)ADC_convertRawToMicroVolts(adc, adcValue0)/1000000.0;

ADC_convertRawToMicroVoltsは、変換された生値adcValue0をリファレンス電圧と、分解能からマイクロボルトの単位で結果を返してくれる。ここではV単位にするために、10の6乗で割り算してから、キャストしてフロート型に変換し変数に格納している。

        sprintf(UART_TX_buffer,"V=%f\n",adcValue0Volt);
        UART_write(uart, UART_TX_buffer, sizeof(UART_TX_buffer));

sprintfでUART_TX_bufferに形式を指定して、adcValue0Voltを文字に置き換えてから、UART_writeでシリアル送信をしている。

この状態で実行すると、

?のひっくり返ったマークが表示される。デバッグで確認すればよいが、UART_TX_bufferははじめ”.”とデバッグでは示される何かが入っているので、このようになる。

そこで、
        memset(UART_TX_buffer, 0x00, sizeof(UART_TX_buffer));
        sprintf(UART_TX_buffer,"V=%f\n",adcValue0Volt);
とsprintの前に、UART_TX_bufferに値を代入する前に、memsetで0x00で32個のバッファを埋めるよにしてやる。
こうしておくと、文字列長さが異なるものをUART_TX_bufferに代入しても前のものが残っているということはなくなる。

所望の表示を得る事ができた。








コメント

このブログの人気の投稿

Attiny85とAQM0802A(LCD)のI2C接続

CH9329で日本語キーボード109で正しく表示する方法