LPC1114と内蔵ADCで電圧をソフトウェアシリアルに出力 3.300Vまで (ハードはichigojam)
目的
adcの練習用
工夫点は、書き込み用シリアルとデータ出力用シリアルを
分ける事によつて開発の効率を上げた。
データ出力用シリアルの出力先は、dp9
標準シリアルに出力を出したい場合は、dp16に変えればよい
速度は9600bps
#include "mbed.h"
//10の割り算 0から1028までは、正しい。主に0から999
#define DVI10(n) ((n*205)>>11)
//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
//Serial pc(dp16, dp15); // tx, rx 1114
#define UART_DELAY (96) // 1/9600
//仮想シリアルの出力ポート
//DigitalOut TX(PA_9); //010
//DigitalOut TX(PA_2); //010
//DigitalOut TX(dp16); //1114 標準シリアルポートTX
DigitalOut TX(dp9); //1114
//DigitalOut myled(D13); //767
//DigitalOut myled(PA_4); //010
//DigitalOut myled(dp14); //1114
//アナログ入力の設定
//AnalogIn adc_vbat(A3); //PA_4
//AnalogIn adc_vbat(A0); //767
AnalogIn adc_vbat(dp4); //1114
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);
a=DVI10(b);
b=b-(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
//タイマーの定義
Timer t;
int q_st; //スタートタイム debug
int q_et; //エンドタイム debug
//仮想シリアルへの一文字出力 9600bps
int pc_putc(char ch) {
TX=1;
q_st = t.read_us(); //debug
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);
q_et = t.read_us(); //debug 引いた数が0で1041ufなら正解
return(0);
} //pc_putc
//文字列の表示
int pc_printf(char *str1) {
//文字の中身がゼロか
while(*str1){
//一文字出力
pc_putc(*str1 ++);
} //while
//戻り値
return(0);
}//pc_printf
char buffer[30];
int main() {
//初期化
TX=1;wait_ms(2); //文字分のウエート
pc_printf("\r\n"); //ゴミの吐き出し
//タイマーの開始
t.start();
//最初のウエート
wait_ms(1000);
//無限ループ
while(1) {
//adcの読み込み 0から4096 (精度は10bitのはず)
int s = (adc_vbat.read_u16()>>4);
//d sprintf(buffer,"%d",s); //debug
//d pc_printf( buffer ); //debug
//d pc_printf( "\r\n" ); //debug
//電圧に変換 ex 3.300 -> 3300 mVを出力
s=(s*6600)>>13;
//d sprintf(buffer,"%d",s); //debug
//d pc_printf( buffer ); //debug
//d pc_printf( "\r\n" ); //debug
//小数点以上と小数点以下を分ける iiは1の桁 sは小数点以上の桁
int ii = s;
if ( ii >= 3000 ) { ii = (ii - 3000); s = 3;}
else if( ii >= 2000 ) { ii = (ii - 2000); s = 2;}
else if( ii >= 1000 ) { ii = (ii - 1000); s = 1;}
else { ; s = 0;}
//電圧の小数点以上の表示
ch_hex_a( s*10 );
ch_hex_a_b[0] = '+';
//ch_hex_a_b[1] = '0' + s;
ch_hex_a_b[2] = '.';
pc_printf( ch_hex_a_b );
//電圧の小数点以下の表示
pc_printf( ch_hex_a(ii) );
//リターン
pc_printf( "\r\n" );
//約1秒を待つ
wait_ms(1000);
} //while
} //main
////容量削減
//void error(const char* format, ...){}
Author And Source
この問題について(LPC1114と内蔵ADCで電圧をソフトウェアシリアルに出力 3.300Vまで (ハードはichigojam)), 我々は、より多くの情報をここで見つけました https://qiita.com/caa45040/items/dd768fabc1009e7dae91著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .