日々の記録

ほどよく書いてきます。

メモ S8100Bを使った温度計

2023-09-17 00:00:53 | Arduino

S-8100Bというセイコーエプソンの温度計がある。出力インピーダンスが高いので出力を1MΩでプルアップせよとあるが、オープンコレクタ出力なのだろうか。1MΩでプルアップしないと直接マイコン端子に接続ではうまく温度測定できなかった。

小数点表示はおいといて、ダイナミック点灯で表示できるところまではいった。

校正してないが、28.7℃ほどの気温のようだ。あつい。

ノイズが大きいのかADCの読み取り値が大きく変動するので、平均化をガッツリしてみた。15000回ほど・・・
150回のADC変換で0.99倍しながらADCの値を加算するので、150x100=15000回平均値となる。

 

Arduinoで作ったProMicroのコードをメモがてら載せておく。
======以下コード======

//使うデジタルピンの番号を入れておく。
//DDRx, PINx, PORTxレジスタで操作したかったが、ピン足りなかった

uint8_t Channels[]={2,3,4,5,6,7,8}; //ドットは別で定義しておこう
//        /-a-/
//       f   b
//      /-g-/0
//     e   c
//    /-d-/ .
//Channels 23456789
//7segment abcdefg.
//       0 11111100
//       1 01100000
//       2 11011010
//       3 11110010
//       4 01100110
//       5 10110110
//       6 10111110
//       7 11100100
//       8 11111110
//       9 11110110


//7セグの配列を入れてある
uint8_t SegmentArray[10][7]=
    {
        {1,1,1,1,1,1,0},
        {0,1,1,0,0,0,0},
        {1,1,0,1,1,0,1},
        {1,1,1,1,0,0,1},
        {0,1,1,0,0,1,1},
        {1,0,1,1,0,1,1},
        {1,0,1,1,1,1,1},
        {1,1,1,0,0,1,0},
        {1,1,1,1,1,1,1},
        {1,1,1,1,0,1,1},
    };

// 0を表示したい場合、次のように値を入れるのがいいだろう
// for(i=0,i<8,i++){
//   digitalWrite(Channels[i],Segment[0][i]);
// }

long ADCValue;
long LN2;
long tempVal;
uint8_t A;
uint8_t B;
uint8_t C;

void ShowNone(){
  //7セグLED消灯
  for(uint8_t i=0;i<sizeof(Channels);i++){
    digitalWrite(Channels[i],0);
  }  
}
void ShowNum(uint8_t X) {
  if(X>9){
    ShowNone();
  }
  else{
    //7セグLEDに数字を表示する
    for(uint8_t i=0;i<sizeof(Channels);i++){
      digitalWrite(Channels[i],SegmentArray[X][i]);
    }  
  }
}


void setup() {
  // put your setup code here, to run once:
  // Serial port setting
  Serial.begin(9600);

  //pinMode Setting for a to g LEDs
  for(unsigned char i=0;i<sizeof(Channels);i++){
    pinMode(Channels[i],OUTPUT);
  }

  //Digit Position
  pinMode(9,OUTPUT);
  pinMode(10,OUTPUT);
  pinMode(16,OUTPUT);

  // 7セグLEDの点灯テスト
  for(unsigned char i=0;i<sizeof(Channels);i++){
    digitalWrite(Channels[i],HIGH);
    delay(100);
    Serial.println(Channels[i]);
    digitalWrite(Channels[i],LOW);
  }

  //0から9までの数字表示の確認をする
  for(uint8_t j=0;j<10;j++){
    ShowNum(j);
    delay(100);
  }
  ShowNone();
  
  ADCValue=0;
  for(int i=0;i<15000;i++){
    ADCValue += analogRead(A0);
  }
}

void loop() { 
  // put your main code here, to run repeatedly:
  //ADCで電圧を読んでくる
  // 1V-5Vを0-99%に割り付けた値をXとする(100%表示はしない)
  // Xを10で割った商Aが10の位、余りBが1の位になる。
  // Aを表示,Bを表示,ブランク表示を繰り返す。

  LN2 = map(ADCValue,3363900,5861400,800,-200);  //1-5Vを0-99に割付
  A = LN2 / 100;  //10の位
  tempVal = LN2 % 100;  //1の位
  B = tempVal /10;
  C = tempVal % 10;

  //シリアル通信で計算している中身を送信
//  Serial.print(millis());
  Serial.print("ADC Value:");
  Serial.print(ADCValue);
  Serial.print(",AR:");
  Serial.println(analogRead(A0));
//  Serial.print(",ABC:");
//  Serial.print(A);
//  Serial.print(",");
//  Serial.print(B);
//  Serial.print(",");
//  Serial.println(C);

  digitalWrite(9,HIGH);
  digitalWrite(10,HIGH);  
  digitalWrite(16,HIGH);  
  if(A>0){
    ShowNum(A); //100の位を表示
  }
  else{
    ShowNone();
  }
  digitalWrite(9,LOW);

  ADCValue=ADCValue-ADCValue/100;

  //delayの代わりにADC変換する
  for(uint8_t i=0;i<50;i++){
    ADCValue += analogRead(A0);
  }
  digitalWrite(9,HIGH);

  ShowNum(B); //10の位を表示
  digitalWrite(10,LOW);  //点灯
  
  //delayの代わりにADC変換する
  for(uint8_t i=0;i<50;i++){
    ADCValue += analogRead(A0);
  }
  digitalWrite(10,HIGH);  

  ShowNum(C);
  digitalWrite(16,LOW);
  //delayの代わりにADC変換する
  for(uint8_t i=0;i<50;i++){
    ADCValue += analogRead(A0);
  }
  digitalWrite(16,HIGH);
}

 

コメント (1)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

マイコンADCの移動平均っぽい計算

2023-09-13 22:08:28 | AVR

時々使っているマイコンのADCは10bitなので1024段階(0-1023)での出力が得られるが、時間応答を犠牲にしてももうちょっと分解能を高くしたいときがある。温度計とか。

ArduinoではAnalogRead(A0)といった関数でA0端子のアナログ値を得られるのでコレを使って書くと、

ADC = r* ADC  + AnalogRead(A0);

という加算をしていくと、ADCの値にはAnalogRead(A0)/(1-r)の値が入るので、コレをつかうことでADCの見かけ上の分解能を増大させることができる、はず。

 

解説:

ADC += AnalogRead(A0);

というコードを書くとADCの値は無限に増大していく。なので、ある程度値を抜いてやると値がある値に収束するであろうことがわかる。

例えば、

ADC = 0.9*ADC+AnalogRead(A0);

と計算をすると、現在の加算値の0.9倍に読み取りの値を加算するので、感覚的に、AnalogRead(A0)の10倍の値に収束する感じがわかる。

で、0.9のところをr(0<r<1)にして見ると、

ADC = r*ADC + AnalogRead(A0);

で、AnalogRead(A0)の値が一定で、ADCが一定にに収束した状態では、左辺と右辺が等しいので、
(1-r)*ADC = AnalogRead(A0)となり、ADC = AnalogRead(A0) / (1-r)となる。

r=0.9の場合が、上の例なので、そのとおりである。

次に、マイコンの演算として浮動小数点演算は重い場合があるので、ビットシフトで除算相当をやるといいのではないだろうかと思うと・・・・

r=3/4, 7/8, 15/16, 31/32といった(2^n-1)/2^nという値にするとビットシフトで計算できて良いのではと思う。

実際には、
ADC = ADC - ADC>>4 + AnalogRead(A0);
とやると、4bitシフトなので、ADC*(1-1/16)+AnalogRead(A0)という演算と等価のはず。

と、ここまで思ったが、四捨五入問題どうなるんだろうか?

16>>4は1なので16で割ってもビットシフトしても同じ値。
24>>4はやはり1ではあるものの、24/16=1.50なので、四捨五入を食らってしまうので値がずれる。

少数第一まで計算するので、例えば4ビットシフトは16で除算、なので16の半分の8を加算してからビットシフトするとちょうど良くなるのでは無いだろうか。

そうすると、ビットシフト量をsとすると、次のような演算をするのが四捨五入にも対応するようだ。きっとsは固定値だからコンパイラがうまく処理してくれるだろう。

ADC = ADC - (ADC + 2^(s-1))>>s + AnalogRead(A0);

これが、読み取り値の、2^s倍の値になっていることにだけ気をつけたらいい。

 

10進数でも全くおなじことが言える。
1025を100で割ったら10.25で四捨五入して整数にすると10
1051を同上で11
除算前に四捨五入相当するとなると、除算する100の半分の値の50を加算しておいてから100で割って切り捨てると同じことになる。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

メモ(7セグLEDの点灯)

2023-09-10 15:10:43 | Arduino

SpartkFun ProMicroで読み取った電圧を表示するプログラムができた。
ポートの8bitのレジスタを直接いじろうかなとも思ったが、Arduinoのプログラムでは各ボードにデジタルピンなどが割り振られているのでdigitalWrite(pinNo, Bool)のほうが移植性が良いらしいとか。

作って思った、表示桁数は必要な分だけ確保するべきであった。

 

uint8_t Channels[]={2,3,4,5,6,7,8}; //デジタル出力ピンの設定。ドットは別で定義しておこう
//        /-a-/
//       f   b
//      /-g-/
//     e   c
//    /-d-/ .
//Channels 23456789
//7segment abcdefg.
//7セグの配列を入れてある
uint8_t SegmentArray[10][7]=
    {
        {1,1,1,1,1,1,0},
        {0,1,1,0,0,0,0},
        {1,1,0,1,1,0,1},
        {1,1,1,1,0,0,1},
        {0,1,1,0,0,1,1},
        {1,0,1,1,0,1,1},
        {1,0,1,1,1,1,1},
        {1,1,1,0,0,1,0},
        {1,1,1,1,1,1,1},
        {1,1,1,1,0,1,1},
    };

int ADCValue;
int LN2;
uint8_t A;
uint8_t B;

void ShowNum(uint8_t X) {
  //7セグLEDに数字を表示する
  for(uint8_t i=0;i<sizeof(Channels);i++){
    digitalWrite(Channels[i],SegmentArray[X][i]);
  }  
}
void ShowNone(){
  //7セグLED消灯
  for(uint8_t i=0;i<sizeof(Channels);i++){
    digitalWrite(Channels[i],0);
  }  
}

void setup() {
  // put your setup code here, to run once:
  // Serial port setting
  Serial.begin(9600);
//  delay(3000);
  Serial.println("Hello World!");

  //pinMode Setting for a to g LEDs
  for(unsigned char i=0;i<sizeof(Channels);i++){
    pinMode(Channels[i],OUTPUT);
  }

  //Dot Position
  pinMode(9,OUTPUT);

  // 7セグLEDの点灯テスト
  for(unsigned char i=0;i<sizeof(Channels);i++){
    digitalWrite(Channels[i],HIGH);
    delay(100);
    Serial.println(Channels[i]);
    digitalWrite(Channels[i],LOW);
  }

  //0から9までの数字表示の確認をする
  for(uint8_t j=0;j<10;j++){
    ShowNum(j);
    delay(100);
  }
  ShowNone();
  delay(1000);
}

void loop() { 
  // put your main code here, to run repeatedly:
  //ADCで電圧を読んでくる
  // 1V-5Vを0-99%に割り付けた値をXとする(100%表示はしない)
  // Xを10で割った商Aが10の位、余りBが1の位になる。
  // Aを表示,Bを表示,ブランク表示を繰り返す。

  ADCValue = analogRead(A0);          //電圧読み取り
  LN2 = map(ADCValue,205,1023,0,99);  //1-5Vを0-99に割付
  A = LN2 / 10;  //10の位
  B = LN2 % 10;  //1の位

  //debug zone
  Serial.print(millis());
  Serial.print(",ADC Value:");
  Serial.print(ADCValue);
  Serial.print(",LN2 Level:");
  Serial.print(LN2);
  Serial.print(",AandB:");
  Serial.print(A);
  Serial.print(",");
  Serial.println(B);

  ShowNum(A);
  delay(600);
  ShowNone();
  delay(50);
  ShowNum(B);
  delay(400);
  ShowNone();
  delay(300);
}

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

故障した電源の修理、という名の改造

2023-09-06 23:54:40 | 電子工作

ニコンの金属顕微鏡などに使われている照明ユニットの電源が故障した。
こういうモノで、ボリュームでハロゲンライトの明るさを調整できるような代物である。

 

中身はスイッチング電源と、DCチョッパによる可変電圧回路で特殊なものではなさそう。
Sanden N12V100Wという記載があったので、サンデンという会社がニコン向けに作った12V100Wの電源なのであろう。

裸にひんむいて通電してみる。ヒューズ問題なし、温度ヒューズも問題なしだが、入力のPFC回路っぽいところでのスイッチングが行われておらず、450V耐圧のコンデンサの電圧は100mV、、、ちゃんと電源は100V供給されているのに。

よく見ると抵抗の一部が焼け焦げているようである。コレが原因かは分からないが、ちょっと修理できないかなといった印象である。はんだ付け箇所も溶融凝固を繰り返したのか酸化膜厚めな感じである。これはもしかしたら根本的な問題なのかもしれないので、抵抗張替えよりもうちょっとマシな修理が必要かもしれない。

 

基板をじーっとみる。じっと見るまでもなく、一時側と二次側の境目は明瞭である。二次側が整流だけにしてはモノが多いのでよく見るとチョッパで降圧欠けているような回路のようである。

AC100V → ヒューズ → フィルタ → ブリッジダイオード → PFC? → 400VDC →トランス → 二次側 → チョッパ降圧回路

という流れのようなので、最後のチョッパ降圧回路だけ残してAC100V→DC12Vの回路だけ置き換えちゃえば良いじゃないか。

高圧側、トランスのはんだ付けを外し、のこぎりで基板を切断する。お前も電気をチョッパしていたが、まさか自分がチョッパされるとは思ってもいなかっただろう。

幸い、手持ちに150Wのスイッチング電源がある。COSELのPJA-150F-12があるので、押し込んでみた。

なんという切り貼り。100W電源で十分なのだが、100Wのものは現在在庫がなく、どこも売ってない。
150W→100Wにするとスイッチング電源の全長が20mm減って良い感じなのだが・・・

一旦詰め込みまくって一旦顕微鏡の照明はちゃんと動くようになった。修理時間2時間。

RSで100Wの電源があるので、あとで購入して置き換えておこう。

最後、ロッカースイッチが2mmほど押し込めなかったのだが、100W電源が届くまで待ってほしい。

コメント (2)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

大きな7セグLED SH50101BPG

2023-09-05 00:42:04 | 電子工作

ちょっと大きなサイズ(縦5インチ)の7セグLEDを買ってみた。
会社で液体窒素のレベルゲージがあるんだけど、廊下から見にくいので、でかい7セグで表示をでかくしようと思った次第。
残量はどうやら4-20mAで測定しているようだが、出力は1Vから5Vの電圧になっていそうであるので、1-5Vを0-100%に割り振ってあげれば良いだろう。
一枚2444円するので、表示は1桁で、
・10の位を表示0.25秒
・1の位を表示0.25秒
・消灯0.5秒
といった表示で0-99%の表示をするのがいいのかなと思っている。



https://eleshop.jp/shop/g/gDBE415/

LEDが直列で長いのでVF=20Vほどらしい。
アノードコモンで、OFFのときの電圧にマイコンが耐えないので駆動用にトランジスタが必要ですね。
5Vで動くマイコンならなんでも大丈夫そうだな。

 

配線を確認してみた。
左下から、半時計回りに1pinから10pinまであるが、1,8pinがアノード、2,3,4,5,6,7,9,10がカソードという配線だった。騙されるところだった。電源装置に抵抗つけてピンピンして確認したかいがあった。

 

アノードコモンなので、カソード側にNPNトランジスタを入れ、そのベースを駆動する、という前提なら、次の対応が各数字になる、はず。

   abcdefg
0 1111110
1 0110000
2 1101101
3 1111001
4 0110011
5 1011011
6 1011111
7 1110010
8 1111111
9 1111011

 

配列として、
SegmentArray(0b01111110,0b00110000,0b01101101,0b01111001,0b00110011,0b01011011,0b01011111,0b01110010,0b01111111,0b01111011)
と言ったものを用意しておけば、いいのでは無いだろうか。

コメント (5)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ProMicroのAD変換にかかる時間

2023-09-03 22:38:24 | AVR

ArduinoIDEでプログラムを作っていると、AD変換の時間とか余り意識しないのだが、一体どの程度の時間で処理できるのかと気になった。

一回あたりは早いだろうから、10000回ループさせて出力させてみたところ、10000回で1120msという結果。
つまり、一回あたり、0.112msでADCが完了するということである。サンプリング速度はだいたい9kHzか。

十分な速度である。気になるのは、シリアル通信しているあいだCPU待ってるんじゃないかと思うところかな。こういう細かいところを考えるとArduinoでは難しいのかもしれないが、簡単に作れるのがArduinoなので、このへんはしょうがない。

プログラム:

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  long ADCValue;
  int LevegGaugeValue;

  ADCValue=0;
  for(int i=0;i<10000;i++){
    ADCValue += analogRead(A0);
  }
  Serial.print(ADCValue);
  Serial.print(",");
  Serial.println(millis());
}

 

 

10回平均にして115200bpsで読み込むとこんな感じでハムノイズっぽいのが拾えているようである。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

SparkFun ProMicro 5V 16MHzで7セグLEDを

2023-09-03 16:25:42 | AVR

SparkFunというところのProMicroのクローンがAliexpressで安価に出ている。
621円で購入したものを使って見る。もはや書き込みとか含めてマイコンボード使ってしまったらプロトタイプはそれでいい気がする。裸のマイコンでもいいのだが、USBで指すだけで書き込みとかできる便利さがよい。

で、7セグのドット意外の端子を使うので、8bitが割り振られているポートを探す。
AD変換はPortFというもののようだ。デジタルピンはD0からD17まであるが、ポートフルで引き出されているものはないようだ。7bit分は一つのポートで確保できず、PB1〜PB6の6bit分とどこかで1bit確保といった感じになりそうである。

PB0:外部引き出しなし(TX LED)
PB1:D15
PB2:D16
PB3:D14
PB4:D08
PB5:D09
PB6:D10
PB7:外部引き出しなし!

PD0:D03
PD1:D02
PD2:D00(RXI)
PD3:D01(TXO)
PD4:D04
PD5:外部引き出しなし
PD6:外部引き出しなし
PD7:D06

 

で、仕様を考えていこうかと。
将来2桁表示になったときに対応できるように、アノードを2ch割り振っておく。2chとも一つのLEDに接続したら1桁表示と思ったのだが、ダイナミック点灯を1桁でやるとまず読めたものでは無いので、無理だった。

全体のアルゴリズムとしてはこんな感じでしょうか。待機時間を延々AD変換させまくってもいいのですが、余り意味がありませんので、そのままです。
for(){
・AD変換する
・1-5Vに対応する値を0-99に割り付ける
・10の位(10で割った商)を表示する(0.5s)
・消灯0.1s
・1の位(10で割った余り)を表示する(0.5s)
・消灯0.5s
}

では7セグのマップを作っていきませんといけません。
追記予定

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

USB HIDデバイス、マウス編

2023-08-27 19:31:06 | Arduino

後輩が出張ででかけた先のPCは操作をしないと勝手にスリープに入る設定で、連続数時間とかの解析計算をしようとPCがスリープになってしまうらしい。この設定は組織の設定でユーザーからは変更できない。

マウス操作があればスリープに入らないので、USBマウスを模して操作をしてあげればスリープは回避できるだろうと。

じゃ、作ってみるかと作ってみた。マウスを5ピクセルの正方形をひたすら移動させ続けるだけという簡単なもの。
マイコンはRP2040Zeroというもので、Aliexpressで540円ほどで購入したもの。

 

#include <Mouse.h>
int responseDelay = 500; 
int movingStep = 5;

void setup() {
  Mouse.begin(); //Mouse mode start
}
void loop() {
  Mouse.move(movingStep,0,0);
  delay(responseDelay);
  Mouse.move(0,movingStep,0);
  delay(responseDelay);
  Mouse.move(-movingStep,0,0);
  delay(responseDelay);
  Mouse.move(0,-movingStep,0);
  delay(responseDelay);  
}

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Rigolの新しいオシロDHO800

2023-08-18 14:45:47 | 電子工作

Rigolにも12bitのオシロが出ていたのだが、安価なモデルが無かった。
最近新しいものが出て9月上旬出荷らしい。おお。

波形取り込みレートが1,000,000waveforms/sとDS1102Z-Eの30,000waveforms/sから大きく向上している。それで5万程度とはなかなか良いのでは無いだろうか。

12bit分解能は魅力だな。タッチスクリーンにもなっているらしい。しかし、シリアルデコード機能については言及が無い。

コメント (4)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ストレージオシロのデータを吐き出したら

2023-08-16 09:14:03 | AVR

試しにデジタルストレージオシロのデータを吐き出させてみた。

ストレージ12Mポイント。特にこの時点で何も考えてなかった。

吐き出しにかなりの時間がかかってようやく完了。

どんだけでかいんだよ、と思いつつ、あれ?測定点が12Mってことは、1200万行のcsvファイル?

 

ちゃんと1200万行ありました。エクセルが最近行数増えたとはいえ、100万行なので全部表示できない。

ヘッダはあるものの、文字数は、時間のインクリメント分で8文字、カンマが2文字、浮動小数点が8文字、合計18文字と改行コードで20バイト/行くらい。これが12Mポイントで、240MBくらいとちょうどリーズナブルなサイズ。

この行数には素直にびっくりだよ。

 

使い勝手の都合、メモリデプスをAutoにしておくと垂直方向の動きが遅い(カクカクどころか、1fpsくらいでしか動かない)のだが、メモリーデプスをAutoから軽くしておいたほうがいいかもしれないな。

垂直分解能8bitのオシロだと、単純にメモリーレコード数=DRAMに必要なメモリーだと思うので、12Mポイント分のストレージだと12MBでしか無いとは思うが色々CPUやらのリソースの都合はあるんだろうな。安価なオシロなのであまり多くを求めるのも酷であろう。スマホより安いくらいだし・・・

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

オシロスコープの帯域測定

2023-08-16 00:03:23 | 電子工作

ふと、オシロスコープの帯域、実際にどれくらいあるのかを測定してみたくなった。

結論としては、オシロスコープの帯域を超える発振器が無かったので検証できないという落ち。

 

発振器は10MHzまでっぽい記載があったが、60MHzまで出力できるっぽいので、どれどれとおもって、まずはオシロスコープの振幅を読み取ってみた(青いプロット)。あれ?100MHz帯域のオシロだけど、50MHzで-3dBだな。

ふと発振器を見ると250MSa/sと書いてあるので、25MHzから50MHzくらいに限界がありそうだ。
FA-2という周波数カウンターで入力のdBmも表示されるのでそれを見ると、-3dBmのおちこみはやはり50MHzくらいなので、発振器側の都合での振幅低下という結論を下した。

 

そもそも100MHzといった周波数は空中に放射しかねない周波数なのでオシロスコープ側の入力インピーダンスが1MΩでいいのか?いや50Ωじゃないと反射するのか?
疑問は尽きない。

 

 

さて、オシロスコープの入力であるが、昔は周波数1MHzあたり1万円という相場があったように思う。100MHzで100万円である。これは多分アナログオシロのもので非常に高精度なフロントエンド回路を持っていたであろうことは想像できる。何しろブラウン管の電子ビームを曲げるのだから、ゲインなどの安定度はシビアであっただろうから。

現在のデジタルオシロは、私が買ったものでは100MHzの帯域でも3万円程度で、安価である。
フロントエンドがどうなっているのか色々しらべてみた。Keysightのエンジニアが説明しているYoutubeがあった。

アンプの部分はSiGe BiCMOSのアンプがあったり、集積化が進んでいたりと結構ワンチップでなんとかなっているような気もする。あまりリニアじゃない増幅度はデジタルでどうにでも補正できちゃう、そんなこともあったりするのかな。多少の補正は可能だけど特性悪いと位相も狂っちゃうからある程度素直なアンプだとは思うが・・・

https://www.youtube.com/watch?v=o-JvRlKCOaM
https://www.youtube.com/watch?v=EaBSN6dpqP8
https://www.youtube.com/watch?v=gPQRSWcRaFg ← Attenuators and Preamps - Oscilloscope Front End Design (part 3)
https://www.youtube.com/watch?v=1sVEWzMjkBo
https://www.youtube.com/watch?v=pdbzIwelCL4
https://www.youtube.com/watch?v=DNXPpkgiCLQ

コメント (2)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

シリアルデコーダ付きのオシロ

2023-07-30 19:51:44 | 電子工作

RIGOLのオシロスコープ、結構安くなっていた。

帯域100MHzが28,325円、帯域200MHzが37,725円。+100MHzの帯域に9400円・・・

悩んだが、100MHz以上の信号をプローブすることは無いだろうとおもって、100MHzでいいかと思って100MHzを買ってみた。

4chのDS1054Z(4ch 50MHz)もあるが、こちらは56,980円だったので、一旦ペンディング。
シリアル通信を見たいとおもったら、2線式が多いだろうからと思って。SPIなど三線式も全二重なので送信、受信と分けてモニターしたらいいかなと。

I2Cの通信規格のセンサーが結構多いので、I2Cのデコードなんかが十分にできたらいいかな、というように思っています。

ただ、通信系は最近のプログラミングでも、レジスタを設定してとかまであまりせず、serial.print()とかの関数が用意されているので、あまり通信内容について細かな部分を意識しなくてもいいようにも思っている。

 

今持っているOWONのPDS5022Sは液晶がSTNでちょっと見にくいとか、コントラスト調整のボリュームがガリオームで調子が悪いとか、でも、会社に持っていって使ってるとか、そんなのもあって家に一台買ってみようかななどと思いました。

 

コメント (4)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

電気伝導度計測器制御

2023-07-30 16:59:10 | マイコン

USB-HIDデバイスが便利なので、RS232Cからの接続にうまく使おうと思っている。

Foerster Sigmatest 2.069というものの制御を考えているが、装置側への設定が必要なので、マイコンと装置と双方向の通信が必要になる。

考えている構想
・装置が接続されていたら計測器にコマンドを送信して、装置が接続されているか確認
・装置からの応答があったら緑のLEDを点灯、接続されてないときは赤のLEDを点灯
・装置に初期設定のコマンドを送る
・装置から受け取った測定信号をUSB-HIDデバイスとして送出する
以上で通信する内容は終わり

パソコン側では、測定数値+改行コードというものを受信するので便利
(エクセルなどでは、測定数値+TABであってもいい場合があるので、ジャンパピンで切り替えてもいいかも)

 

マニュアルのコピーだと
8.1. Hardware
 For remote control operation of the SIGMATEST 2.069 the following hardware is required:
1. SIGMATEST 2.069
2. Null Modem Serial Cable (2.069[DB9] <---> Host PC [DB9 or DB25])  ※いわゆるクロスケーブル
3. Host PC with terminal communications program. (i.e. hyperterminal in Windows)

8.2. Setup
SIGMATEST 2.069 リモートシリアルポートとの通信には、以下のパラメータでターミナル通信プログラムを設定する必要があります。通信パラメータはユーザーインターフェースまたはリモートコントロールポートから変更できますが、これらはデフォルトの通信設定です。
Baud Rate: 9600 bps
Databits: 8
Parity: No
Stop Bits: 1 

SIGMATEST 2.069 のリモートコントロールには以下のコマンドを使用します。各 各コマンドは、そのコマンドによって実行される操作の簡単な説明とともに記載されています。コマンドを使用する場合は、以下のテキストを使用してください。コマンドを使用する際、<brackets>内にあるテキストは、ユーザーがカスタマイズするテキストです。の中にあるテキストは、特定のコマンドに関連してユーザーがカスタマイズするテキストです。また、コマンドを入力する際、"< >" はコマンド文字列から省略されます。テキストは大文字か小文字で コマンドの指示に従ってください。

注意: 一部のコマンドは「リモートコントロール」セッションにのみ影響し、装置のユーザー画面に表示される内容は変更されません。例えば、リモート・コントロール・セッションが%IACSである間、ユーザー画面の「現在の単位」をMS/mにすることができます。これらのコマンドは(RCのみ)と表記されます。

コマンドはたくさんあるけど、次のがあればいいかなと思う。

RC[quit]!  //Close the remote control session
RC[current_units]? //Display the current measurement units (RC only)
RC[current_units]=%IACS  //Display or set the current measurement units (MS/M or %IACS) (RC only)
RC[current_mode]=TOUCH //Set the current measurement mode (TOUCH, CONTINUOUS)
RC[streaming_value]=<0,1> //Turn the streaming measurement value mode on or off. In Touch mode each new touch value will be transmitted as it occurs.
結構長い文字列を送る必要がありますね。終了コマンドあるけど、最後はUSBケーブルをザクって抜いてしまうので、まあ、使わないだろうかな。

接続先があるかどうか、、、、シリアル通信できていても対象物が目的の測定器で無い場合を想定するのが難しいな。装置固有の番号を返すものがありそうだ。
RC[probe_sn]?  //Display the current printed probe serial number
RC[instrument_serial_number]? //Display serial number as printed on the case
RC[fpic_cpld_version]? //Display the version code of the FPIC CPLD 

マニュアルで気になるのは、Displayというのは装置の液晶表示に表示するのか、シリアルポートに値を吐き出すのか、そこが気になるので確認をしよう。

マストで設定するのは、次の3つ。あとはシリアルで吐き出されてくる値をHIDで出力するだけ。
RC[current_units]=%IACS
RC[current_mode]=TOUCH
RC[streaming_value]=1

コメント (2)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Advantest 7461A

2023-07-06 00:24:41 | AVR

6.5桁のDMMを買ってしまった。ヤフオクで32,000円なり。

先に買ったR6452よりも高速なAD変換なのでSlowの測定でも十分な測定速度を誇っているように思う。

充電前のNiMH電池の電圧は1uVまで表示可能。

 

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

R6452Aコマンドメモ

2023-06-26 00:56:20 | その他雑記

Advantestのコマンドメモ。基本的にコマンドはGPIBもRS232Cも同じ内容で通じるっぽい。

測定データのリクエスト:MD?
(Measure Dataかな)

2nd (=B ch)のオフ:DE0
2ndに設定するコマンド:D2, Fn(Fは後述)

D2,F1,R5,PR3<CR><LF>で2nd CHに電圧設定、レンジは20Vで、Slowといった感じに設定できる。

 

今やりたい機能としては、A chで電流測定を行い、B chで電圧測定を行うといったこと。
なので、Achには、
D1,F5,R6<CRLF>
で電流測定モードを設定し、
Bchには、
D2,F12,R5<CRLF>
で電圧モードを設定し、PR3コマンドでSLOWにしたら、測定設定は完了。

あとはMD?を送ればデータが返ってくる。
フリーランでデータを送るには、オンリモードというものを有効にする必要があるようだ。

 

測定ファンクションはF1からF50まで存在する。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする