STM32L010と内蔵ADCで電圧をシリアルに出力 3.300Vまで (ソフトウェアシリアル)(Keil)


x Mbed2

目的
主にNJL7502L等の微小な電圧を測る。

説明
adcの値(4096)に6600掛けて8192で割ると3300にピッタリなる。




//SER_V3300_1

//電圧

#include "mbed.h"

//10の割り算 0から1028までは、正しい。主に0から999
#define DVI10(n) ((n*205)>>11)

char ch_hex_a_b[16];
char *ch_hex_a(int x)
{

        int x_bk;

        //x=1234;//debug

        ch_hex_a_b[4] = 0;

        if     ( x >= 9000 ) { x = x - 9000;   ch_hex_a_b[0] = '9';    }
        else if( x >= 8000 ) { x = x - 8000;   ch_hex_a_b[0] = '8';    }
        else if( x >= 7000 ) { x = x - 7000;   ch_hex_a_b[0] = '7';    }
        else if( x >= 6000 ) { x = x - 6000;   ch_hex_a_b[0] = '6';    }
        else if( x >= 5000 ) { x = x - 5000;   ch_hex_a_b[0] = '5';    }
        else if( x >= 4000 ) { x = x - 4000;   ch_hex_a_b[0] = '4';    }
        else if( x >= 3000 ) { x = x - 3000;   ch_hex_a_b[0] = '3';    }
        else if( x >= 2000 ) { x = x - 2000;   ch_hex_a_b[0] = '2';    }
        else if( x >= 1000 ) { x = x - 1000;   ch_hex_a_b[0] = '1';    }
        else                 {                 ch_hex_a_b[0] = '0';    }

        x_bk = x;

        x     =  DVI10(x);                           // 12 <- 123 / 10
        ch_hex_a_b[3] = '0' +  (  x_bk - (x*10)  );  // 3  <- 120 - 123
        x_bk  =  x;

        x     =  DVI10(x);                           // 1  <- 12 / 10
        ch_hex_a_b[2] = '0' +   ( x_bk - (x*10) );   // 2  <- 12 - 10

        ch_hex_a_b[1] = '0' + x;

        return(ch_hex_a_b);
	
} //ch_hex_a


//アナログ入力の設定
AnalogIn adc_vbat(A3); //PA_4


#define UART_DELAY 101 //  1/9600 98-105

DigitalOut TX(PA_2);

//仮想シリアルへの一文字出力 9600bps
int pc_putc(char ch)
{

    TX=1;
    TX=0;//Start
    wait_us(UART_DELAY);

    for(int ii=0; ii<8; ii++) { //Data x 8
        TX=(ch>>ii)&1;
        wait_us(UART_DELAY);
    }; //for

    TX=1;//Stop
    wait_us(UART_DELAY);

    return(0);

} //pc_putc

//文字列の表示 nana_seg
int pc_printf(char *str1) {

    //文字の中身がゼロか
    while(*str1){

        //一文字出力
        pc_putc(*str1 ++);

    } //while

    //戻り値
    return(0);

}//ns_printf


//メイン関数
int main() {

    int s;  //ADCの値
    //int n0; //温度 小数点以上

    //無限ループ
    while(1) {

        //adcの読み込み 0から4096
        s = (adc_vbat.read_u16()>>4);
//s=2048;
        //電圧に変換 ex 3.300 -> 3300 mVを出力
        s=(s*6600)>>13;

        //電圧の小数点以下の表示
        pc_printf(  ch_hex_a(s)  );

        //リターン
        pc_printf(  "\r\n"  );

        //1秒の待ち
        wait_ms(1000);

    } //while

} //main

//容量削減
void error(const char* format, ...){}