STM32G031とMCP3425で0から2.048000Vまで62uV単位をソフトウェアシリアル出力
目的
シャープ測距モジュール GP2Y0A21YK等の電圧を測る
構成
STM32G031J6M6
MCP3425A0T-E/CH
1.SCLとSDAを接続、プルアップも忘れずに
2.電源の接続
3.下記のソースコードを書き込む
4.コンパイル実行で表示されたら終了
5.おわり
#include <Wire.h>
//STM32G031J6M6 i2cピンの定義
#define sdaPin PA12 // ArduinoA4
#define sclPin PA11 // ArduinoA5
//MCP3425A0T-E/CHのアドレス
#define ADD 0x68
//#define in7 1 //uno
#define in7 PB7 // 1pin
#define DW digitalWrite
//#define UART_DELAY 832 // 1200bps ok 031
#define UART_DELAY 102 // 9600bps ok 031
//10の割り算 0から1028までは、正しい。主に0から999
//#define DVI10(n) ((n*205)>>11)
//16ビットadcの4ビットの変換テーブル
#define ADC4BIT { 0 , 62 ,125 ,187 ,250 ,312 ,375 ,437 ,500 ,562 ,625 ,687 ,750 ,812 ,875 ,937 }
//仮想シリアルへの一文字出力 9600bps
int pc_putc(char ch) {
DW(in7, HIGH);
//q_st = micros(); //debug
DW(in7, LOW);//START
delayMicroseconds(UART_DELAY);
for(int ii=0;ii<8;ii++){
DW(in7, (ch>>ii)&1 );
delayMicroseconds(UART_DELAY);
}//for
DW(in7, HIGH);//Stop
delayMicroseconds(UART_DELAY);
//q_et = micros(); //debug 引いた数が0で1041usなら正解
return(0);
}//pc_putc
//文字列の表示
int pc_printf(char *str1) {
//文字の中身がゼロか
while(*str1){
//一文字出力
pc_putc(*str1 ++);
//Serial.print( *str1 ++ ); //uno
} //while
//戻り値
return(0);
}//pc_printf
//0から999まで文字列に変換
char ch_hex_a_b[5];
char *ch_hex_a(int l_num)
{
int a,b,c;
b=l_num/10;
c=l_num-(b*10); //1の桁
a=b/10; //100の桁
b=b-(a*10); //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
void setup()
{
//ポートをhiにする 初期化
pinMode(in7, OUTPUT);
DW(in7, HIGH);
delayMicroseconds(UART_DELAY*10);
//while(1){pc_putc('A');delay(1000);} //debug
//pc_printf("\r\nSTART\r\n"); //debug
//Wire.begin(); //i2cの初期化 uno
Wire.begin(sdaPin,sclPin); //STM32G031J6M6
//Serial.begin(9600);
// 7 *(1)待ち
// 6 *(0)
// 5 *(0)
// 4 (0)ワンショット,*(1)連続
// 3 | (00)12ビット,(01)14ビット
// 2 | *(10)16ビット
// 1 I *(00)x1,(01)x2
// 0 I (10)x4,(11)x8
//初期値の書き込み
Wire.beginTransmission(ADD);
Wire.write(0b10011000); //16bit 15sps PGA x1
Wire.endTransmission();
} //setup
int read_data()
{
//2文字の読み込み
Wire.requestFrom(ADD, 2);
//戻し
return ( (Wire.read() << 8 ) + Wire.read() );
}//read_data
int s; //101
int ii; //ループカウンタ
int bit4[]=ADC4BIT;
void loop()
{
s = read_data();
//s = (65536/2)-1;
//s = 65536/4;
char *gk;
ii=(s >> 4);
if ( ii >= 2000 ) { ii = ii - 2000; gk="2."; }
else if( ii >= 1000 ) { ii = ii - 1000; gk="1."; }
else { gk="0."; }
//Serial.print( gk ); //uno
pc_printf( gk );
//Serial.print( ch_hex_a( ii ) ); //uno
pc_printf( ch_hex_a( ii ) );
ii = bit4[ s & 0xf ];
//Serial.print( ch_hex_a( ii ) ); //uno
pc_printf( ch_hex_a( ii ) );
//Serial.println(""); //uno
pc_printf("\r\n");
delay(1000);
} //loop
Author And Source
この問題について(STM32G031とMCP3425で0から2.048000Vまで62uV単位をソフトウェアシリアル出力), 我々は、より多くの情報をここで見つけました https://qiita.com/caa45040/items/7b4a03ade974641d41ec著者帰属:元の著者の情報は、元の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 .