STM32L010と内蔵ADCで電流をソフトウェアシリアルに出力 330.0uAまで 10kΩ上側または10kΩ下側


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

説明
主な変更点は、電圧表示の計算式を次の計算式にした

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

どして、こうなったは、STM32L010を参照


//電流

#include "mbed.h"

//10k6Ωの上側 下側フラグ 1は上側 0は下側
#define DO_UP  0

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

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

//Serial pc(USBTX, USBRX); // tx, rx
//Serial pc(SERIAL_TX, SERIAL_RX); //767
//Serial pc(PA_2, PA_3); //010
//Serial pc(PA_9, PA_10); //010

#define UART_DELAY 96 //  1/9600

//仮想シリアルの出力ポート
//DigitalOut TX(PA_9);
DigitalOut TX(PA_2);

char ch_hex_a_b[5];
char *ch_hex_a(int l_num)
{
    int a,b,c;

    b=DVI10(l_num);
    c=l_num-(b*10);
    l_num=b;
    a=DVI10(l_num);
    b=l_num-(a*10);

    ch_hex_a_b[0] = '0' + a;
    ch_hex_a_b[1] = '0' + b;
    ch_hex_a_b[2] = '0' + c;
    ch_hex_a_b[3] = 0;

    return(ch_hex_a_b);
} //ch_hex_a




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

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

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

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

    return(0);

} //pc_putc

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

    int ii = 0; //ループカウンター
    while(str1[ii]!=0){

        //一文字出力
        pc_putc(str1[ii]);ii++;

    } //while

    //戻り値
    return(0);
}

int main() {

    //ポートをhiにする 初期化
    TX=1;

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

        //adcの読み込み 0から4096
        int s = (adc_vbat.read_u16()>>4);

//        pc.printf("\r\n -S=%d",s); //767

        //電圧を電流に変換 ex 330.0uA -> 3300 uAの十倍を出力
        if(1 == DO_UP) { s=4095-s; }
        s=(s*6600)>>13;

//        s = 3300;
//        pc.printf("\t c=%d",s); //767

//小数点以上と小数点以下を分ける iiは10の桁 sは1の桁
int ii = s;
if     ( ii >= 3000 ) { ii = DVI10( (ii - 3000)  ) + 300; }
else if( ii >= 2000 ) { ii = DVI10( (ii - 2000)  ) + 200; }
else if( ii >= 1000 ) { ii = DVI10( (ii - 1000)  ) + 100; }
else                  { ii = DVI10( (ii       )  )      ; }
s = s - (ii*10);

//        pc.printf("\t t=%d %d",ii,s); //767
//        pc.printf("\r\n"); //767 リターン

        pc_printf(  ch_hex_a(ii)  );

        //電流の小数点以下の表示
        ch_hex_a( s*10 );
        ch_hex_a_b[0] = '.';
      //ch_hex_a_b[1] = '0' + s;
        ch_hex_a_b[2] = 'u';      
        pc_printf(  ch_hex_a_b  );

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

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

    } //while

} //main

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