« 2024年8月 | トップページ | 2024年10月 »

2024年9月

2024年9月30日 (月)

1クロックでも速くしたい 割込を「ISR_NAKED」で

2024年9月27日:1クロックでも速くしたい DDS方式の2パルス発生器

この続き。 タイマー1のコンペアマッチA割り込みを
インライン・アセンブラで書いてみました。

/***************************/
/* DDSでパルス出力 */
/***************************/
// A相B相出力データ COM1A,COM1Bで出力
volatile uint8_t com1_ab; // 3bitでCW,CCW判断
// tbl_ab[]をアクセス
volatile uint8_t tbl_ab[]={
0b11110000, // 000 H H CW
0b10110000, // 001 L H
0b10100000, // 010 L L
0b11100000, // 011 H L
0b11100000, // 100 H L CCW
0b10100000, // 101 L L
0b10110000, // 110 L H
0b11110000, // 111 H H
}; // |||| ++---- CTC OCR1A モード
// ||++-------- COM1B PB2 (00:off,01トグル,10:L,11:H)
// ++---------- COM1A PB1

/***** タイマー1 : コンペアマッチA割り込み *****/
// DDS処理
// CW/CCW出力 A:PB1(OC1A) B:PB2(OC1B)
// COM1(A,B) 00:off,01トグル,10:L,11:H
// PB4_H; // (!!!)
// dds_cnt += dds_step; // DDSカウンタをカウントアップ
// if(pls_on){ // パルス出力中
// com1_ab = ([dds_cnt.cnt1+3] / 4) & 0x03; // 1/(65536*4096)
// com1_ab |= pls_dir; // bit2でCW,CCWを区分
// }
// TCCR1A = tbl_ab[com1_ab]; // COM1A,COM1B制御 offなら前のb値で
// PB4_L; // (!!!)
ISR(TIMER1_COMPA_vect, ISR_NAKED)
{
__asm__ volatile(
" sbi %0, 4 \n" // PB4 H
" push r0 \n"
" in r0, __SREG__ \n"
" push r28 \n"
" push r29 \n"
" push r30 \n"
" push r31 \n"
// dds_cnt += dds_step;
" lds r28, (dds_step) \n" // LSB
" lds r30, (dds_cnt) \n"
" add r30, r28 \n"
" sts (dds_cnt), r30 \n"
" lds r28, (dds_step+1) \n" // +1
" lds r30, (dds_cnt+1) \n"
" adc r30, r28 \n"
" sts (dds_cnt+1), r30 \n"
" lds r28, (dds_step+2) \n" // +2
" lds r30, (dds_cnt+2) \n"
" adc r30, r28 \n"
" sts (dds_cnt+2), r30 \n"
" lds r28, (dds_step+3) \n" // +3
" lds r30, (dds_cnt+3) \n"
" adc r30, r28 \n"
" sts (dds_cnt+3), r30 \n"
// if(pls_on){
" lds r28, (pls_on) \n"
" and r28, r28 \n"
" breq j1 \n"
// com1_ab = ([dds_cnt+3] / 4) & 0x03;
" lsr r30 \n" // 1/2
" lsr r30 \n" // 1/4
" andi r30, 0x03 \n" // & 0x03
// com1_ab |= pls_dir; // bit2でCW,CCWを区分
" lds r28, (pls_dir) \n"
" or r30, r28 \n"
" sts (com1_ab), r30 \n"
" j1: \n"
// TCCR1A = tbl_ab[com1_ab];
" lds r30, (com1_ab) \n" // 0~7
" ldi r31, 0 \n"
" ldi r28, lo8(tbl_ab) \n" // tbl_ab[]
" ldi r29, hi8(tbl_ab) \n"
" add r30, r28 \n"
" adc r31, r29 \n"
" ld r28, z \n"
" sts %1, r28 \n" // TCCR1A
// pop reg
" pop r31 \n"
" pop r30 \n"
" pop r29 \n"
" pop r28 \n"
" out __SREG__, r0 \n"
" pop r0 \n"
" cbi %0, 4 \n" // PB4 L
" reti \n"
:
: "n" (_SFR_IO_ADDR(PORTB)), // %0
"n" (_SFR_MEM_ADDR(TCCR1A)) // %1
:
);
}

「ISR_NAKED」で、使うレジスタを我が手に。
その結果、
  ・pushとpopするレジスタの数を吟味して減らせる
  ・タイミングを見るためのポート出力を先頭と最後に
   持ってこれるので、正確に見える。
問題はインライン・アセンブラの書式。
AVRマイコン特有の問題がまだ解決できていません。

「Z」レジスタにA相B相出力テーブルの先頭を持ってきているところ、
「c」だと「マイナスの値を引いて足し算」する処理が行われています。

   820:	e0 91 62 01   lds    r30, 0x0162
824: f0 e0 ldi r31, 0x00
826: ed 5f subi r30, 0xFD
828: fe 4f sbci r31, 0xFE
82a: 80 81 ld r24, Z  テーブル値を読み出し

これ、AVRマイコンの命令体系で、即値加算の命令が無いのです。
  即値加算:addiとかadci
そこで、即値減算命令 subi、sbci命令を使い、
  マイナスの値を引いて足し算に
ということで対処するのです。
  AVRマイコン・アセンブラの定石

ところが、インライン・アセンブラの書式で、テーブルの先頭アドレスを
マイナスにする方法が分からないのです。
  (- tbl_ab)とか(0 - tbl_ab)とかあれこれ
  試しましたが、エラーが出ちゃいます。
そこで仕方なく、レジスタ同士の加算命令を使って、アドレスを
得ています。
  これで、2命令を損

 " lds r30, (com1_ab) \n" // 0~7
 " ldi r31, 0 \n"
 " ldi r28, lo8(tbl_ab) \n" // tbl_ab[]
 " ldi r29, hi8(tbl_ab) \n"
 " add r30, r28 \n"
 " adc r31, r29 \n"
 " ld r28, z \n"  テーブル値の読み出し

これ、なんとかできれば良いのですが。

push、popするレジスタを5つまで減らせました。
   元のは13個。
これでダイブとスピードアップ。

「union」を使った32bit値と8bit値のまぜこぜ処理も
無くなったし、ある意味、すっきりと。

※実行時間 割り込み処理およそ5μ秒に。
Scope_1126_memo1
  前は8μ秒ほど

| | コメント (0)

2024年9月27日 (金)

アナログ計器

今夜のガレージ、「アナログ計器」の話があれこれと。

Analog11

| | コメント (0)

1クロックでも速くしたい DDS方式の2相パルス発生器

DDS方式の2相パルス発生回路、現在は80kHz(12.5μs)の
タイマー割り込み内で処理しています。
こんな感じ。

/******************************/
/* DDS制御 */
/******************************/
// DDS制御データ
// dsiz(1024,2048,4096)の上位2bitでA,B相出力を決定
// タイマー1割り込みで処理 80kHz=12.5us(=TM1_FRQ)
int32_t dds_frq; // 0.01Hz単位の周波数設定値 ★1
// 0.10Hz~9999.99Hz
volatile uint32_t dds_step; // frqから計算したdds制御1step ★2
// frq * dsiz * 65536 / TM1_FRQ
// DDS設定カウンタ (uint32_t dds_cnt)
// タイマー割り込みでdds_stepを加算 上位ビットで波形出力
union u_dc{
volatile uint32_t cnt4; // 4byte DDS設定カウンタ ★3
volatile uint8_t cnt1[4]; // 1byt DDS設定カウンタ ★4
};
u_dc udds_cnt; // カウントデータ共用体
// cnt4に加算 cnt1で読み出し
// --- 3--- --- 2--- --- 1--- --- 0--- 4バイト
// 10987654 32109876 54321098 76543210
// xxxxHHbb bbbbbbbb aaaaaaaa aaaaaaaa
// || 下位26bitのところにstepを加算
// ++--- CW,CCW判定bit これを読み出したい
// xxxx----- 上位は無視してok

/***************************/
/* DDSでパルス出力 */
/***************************/
/***** タイマー1 : コンペアA割り込み *****/
// DDS処理
// CW/CCW出力 A:PB1(OC1A) B:PB2(OC1B)
// COM1(A,B) 00:off,01トグル,10:L,11:H
ISR(TIMER1_COMPA_vect)
{
static uint8_t b; // 3bitでCW,CCW判断
static uint8_t com1ab[]={
0b11110000, // 000 H H CW
0b10110000, // 001 L H
0b10100000, // 010 L L
0b11100000, // 011 H L
0b11100000, // 100 H L CCW
0b10100000, // 101 L L
0b10110000, // 110 L H
0b11110000, // 111 H H
}; // |||| ++---- CTC OCR1A モード
// ||++-------- COM1B PB2 (00:off,01トグル,10:L,11:H)
// ++---------- COM1A PB1
PB4_H; // (!!!)
udds_cnt.cnt4 += dds_step; // DDSカウンタをカウントアップ ★3+★2
if(pls_on){ // パルス出力中
b = (udds_cnt.cnt1[3] >> 2) & 0x03; // 1/(65536*4096)
b |= pls_dir; // bit2でCW,CCWを区分
}
TCCR1A = com1ab[b]; // COM1A,COM1B制御 offなら前のb値で
PB4_L; // (!!!)
}


アセンブル結果がこれ。

000007a6 <__vector_11>:
7a6: 1f 92 push r1
7a8: 0f 92 push r0
7aa: 0f b6 in r0, 0x3f ; 63
7ac: 0f 92 push r0
7ae: 11 24 eor r1, r1
7b0: 4f 93 push r20
7b2: 5f 93 push r21
7b4: 6f 93 push r22
7b6: 7f 93 push r23
7b8: 8f 93 push r24
7ba: 9f 93 push r25
7bc: af 93 push r26
7be: bf 93 push r27
7c0: ef 93 push r30
7c2: ff 93 push r31
7c4: 2c 9a sbi 0x05, 4 ; 5
7c6: 40 91 74 01 lds r20, 0x0174
7ca: 50 91 75 01 lds r21, 0x0175
7ce: 60 91 76 01 lds r22, 0x0176
7d2: 70 91 77 01 lds r23, 0x0177
7d6: 80 91 63 01 lds r24, 0x0163
7da: 90 91 64 01 lds r25, 0x0164
7de: a0 91 65 01 lds r26, 0x0165
7e2: b0 91 66 01 lds r27, 0x0166
7e6: 84 0f add r24, r20
7e8: 95 1f adc r25, r21
7ea: a6 1f adc r26, r22
7ec: b7 1f adc r27, r23
7ee: 80 93 63 01 sts 0x0163, r24
7f2: 90 93 64 01 sts 0x0164, r25
7f6: a0 93 65 01 sts 0x0165, r26
7fa: b0 93 66 01 sts 0x0166, r27
7fe: 80 91 7e 01 lds r24, 0x017E
802: 88 23 and r24, r24
804: 69 f0 breq .+26 ; 0x820 <__vector_11+0x7a>
806: 80 91 66 01 lds r24, 0x0166   ★A
80a: 90 e0 ldi r25, 0x00 ;★B
80c: 95 95 asr r25  ★B
80e: 87 95 ror r24  ★A
810: 95 95 asr r25  ★B
812: 87 95 ror r24  ★A
814: 83 70 andi r24, 0x03 ; 3
816: 90 91 7c 01 lds r25, 0x017C
81a: 89 2b or r24, r25
81c: 80 93 62 01 sts 0x0162, r24
820: e0 91 62 01 lds r30, 0x0162
824: f0 e0 ldi r31, 0x00 ; 0
826: ed 5f subi r30, 0xFD ; 253
828: fe 4f sbci r31, 0xFE ; 254
82a: 80 81 ld r24, Z
82c: 80 93 80 00 sts 0x0080, r24
830: 2c 98 cbi 0x05, 4 ; 5
832: ff 91 pop r31
834: ef 91 pop r30
836: bf 91 pop r27
838: af 91 pop r26
83a: 9f 91 pop r25
83c: 8f 91 pop r24
83e: 7f 91 pop r23
840: 6f 91 pop r22
842: 5f 91 pop r21
844: 4f 91 pop r20
846: 0f 90 pop r0
848: 0f be out 0x3f, r0 ; 63
84a: 0f 90 pop r0
84c: 1f 90 pop r1
84e: 18 95 reti

アセンブラのソースになった「C」のコードを見ると、
  ここ、どうにかでけへんのか?
というところが見えてきます。

32bitのDDSカウンタ、その上位バイトを取り出して
A相B相出力をアウトプット・コンペアレジスタにセット
するためのテーブルを読み出しているところ、
  1バイトでのシフトで良いのに2バイトで処理してる
  ★Aだけでエエのに。 ★Bはイラんねん。
アセンブラだと、好きに書けるんですが・・・
Cコンパイラの内部処理まで手が出せません。

dds_cntにdds_stepを加算しているところも、使用レジスタを
ケチれば、push/popも減らせます。

dds_cntにunionを使い、32bitのところを8ビットでアクセス
できるようにしたのも高速化のため。
32bitのまま 「dds_cnt >> 26」としたら、えらく時間
がかかってしまいます。

現在の処理時間。
Scope_1123_memo1

パルスだけを見ると「3.5μs」使って処理して
いるように見えますが、ch4のトグルパルスを
見ると、「8μs」ほどかかっています。
割り込みサイクルが12.5μsなので割り込みの
処理時間は65%ほど。
push/popの数を減らせればだいぶと時間稼ぎ
できるんですが。


※追記 : 試してみるものです。

2ビット右シフトのところ、
   b = (udds_cnt.cnt1[3] >> 2) & 0x03; 
>> 2」を「 /4 」にしたら、
   b = (udds_cnt.cnt1[3] / 4) & 0x03; 
1バイトで処理してくれました。

806: 80 91 66 01 lds r24, 0x0166
80a: 86 95 lsr r24
80c: 86 95 lsr r24
80e: 83 70 andi r24, 0x03 ; 3
810: 90 91 7c 01 lds r25, 0x017C
814: 89 2b or r24, r25
816: 80 93 62 01 sts 0x0162, r24

3命令=3クロックだけですが、Cのままで高速化成功!


※補足 今回のDDS処理

・目標周波数 fo (Hz)
・基準周波数 fr = 80kHz
・DDSカウンタ 上位12bit + 下位16bitの28bit
       4096 × 65536
・DDSステップカウンタ step 26bit(max)

step = (fo × (4096×65536)) ÷ fr

1.00Hz出力だと
 step = (1 * (4096×65536)) ÷ 80000
    = 3355
この値を80kHzでDDSカウンタに加算する。

1秒後には80000回加算されて0.999868…Hzの
パルスが出る。

目標周波数が最大の9999.99Hzだと
 step = (9999.99 * (4096×65536)) ÷ 80000
    = 33554398 = 0x01FF FFDE : 25bit
実周波数は、9999.9899…Hzとなる。

A相・B相パルスを4バイトあるDDSカウンタの
上位バイトのbit3とbit2を使って発生させている。
  28bitの上位2ビット

「fr ÷ fo」が「2のn乗」になると、(4096×65536)が
割り切れて加算時の端数が出なくなる。
  例えば 5kHz → 16
     2.5kHz → 32
     1250Hz → 64
     625Hz → 128
     312.5Hz → 256
     156.25Hz → 512
これ以外の時は、特定の周期で出力パルスに
ジッターが生じる。

※ジッターの例
Jj1_20240928090201
0.1秒間とか1秒間の平均なら一定周波数が
カウントされるが、瞬間を見ると主クロック
(今回は80kHz)とのズレが生じている。

上に記した「fr ÷ foが2のn乗」の時だけ、
このズレはなくなる。

※過去記事
  割り込みの高速応答、こんな手法を使ってました。
2020年8月18日:Arduino デューティー計測のためのインプットキャプチャータイミング
2020年8月19日:Arduino インプットキャプチャー割り込みを「ISR_NAKED」で (デューティー比測定)


| | コメント (0)

2024年9月26日 (木)

シリコン樹脂とリミットスイッチの接点

定期的にやってくる修理案件。
この写真のような
Ss12_20240926105801

小さなリミットスイッチが使われていて、そのほとんどが
接触不良。
2022年9月22日:グッと押したらオフするリミットスイッチ
この時は、「グッと押したらオフしちゃう」お笑い状態
でしたが、修理ではみんな新品に交換するのが定石に
なっています。 (1台に2個使い)

で、気になるのがリード線をハンダ付けしたあとの
保護のつもりで塗られているシリコン樹脂。
私だと熱収縮チューブを使うかなぁなんですが、
この装置ではヌリッと塗られています。

で、気になるのがシリコンと電気接点。
 ・fa.omron:リレー シリコンの侵入による接触不良
ここでは、
  ・シリコンガスがリレー内部へ侵入
  ・負荷開閉のアーク熱により酸化シリコンに変化
  ・接点面に付着堆積し、接触不良
こんなことが記されています。

しかし、オムロンの「シリコーンガス雰囲気中での試験事例」の
表を見ると、
 ・低電圧小電流ではアーク放電が無いので
  接触抵抗の増大はみられない
となっていて、普通の電子回路ではシリコンは無関係
なんかなぁっと読めます。

修理案件で使われているリミットスイッチの接触不良、
単純な経年劣化によるものなのか、そばに塗りつけられ
たシリコン樹脂から出る「瘴気」が悪さして劣化を早め
ているのか、いかがなもんでしょね。

外したリミット、たいていの場合、B接側のほうがひどい
接触不良をおこしています。
  B接なんでいつもオンのはずが導通無し
ベロを何度も動かすと徐々に回復してくるという状態です。

 

| | コメント (2)

2024年9月24日 (火)

秋月のI2C接続液晶 AQM1602XAを基板に直付け

SDAとSCLの2線でつなげる液晶モージュールが
なかなか便利です。
先日来使っているのが16文字x2行のこれ。
  AQM1602XA-RN-GBW
液晶の足は1.27mmピッチで一直線。
  AE-AQM1602A(KIT)
これになると2.54mmピッチへの変換基板が付属しています。
内部昇圧回路のコンデンサが付いているので、
主回路への接続は、+電源・GND・SDA・SCLの4本だけ。

ところが、この基板を使うと、液晶を基板に貼り付けるのに
  上に出っぱる
  厚くなる(基板そのものは1.2mm厚)
と、使い勝手がよくありません。
Ll10
Ll13

そこで、こんなつなぎをしています。
足を曲げて外に膨らませ、2.54mmピッチの
ユニバーサル基板にハンダしちゃうのです。

Ll11
ちょい拡大
Ll12

コンデンサの取り付けは基板の裏(パターン側)で。
L14_20240924163601

液晶板と基板の間にはスポンジタイプの両面テープ。
全面に貼ると剥がすとき大ごとになりそうなんで、
両端にちょっとだけ。

この液晶を使い、Arduino UNO R3(のチップで)こんなツールを
作っています。
Ll14

二つともデジタルで周波数を設定できる2相パルス発生回路
です。
90度位相差のあるA相B相パルスを出力します。
CW/CCWとカウント方向を変えられます。

下のは 「fclk / n16」でATmega328の16bitタイマー、
アウトプットコンペアで分周する方式。
周波数を設定できる範囲は0.1Hz~9990.0Hz。
   1/nですんで周波数が高くなると
   ちょいと誤差が出ます。

割り込みの時間に余裕があったんで、パルス数を
指定して「何発出せ」をできるようにしてみました。
  ロータリーエンコーダを回して周波数とパルス数を指定。
  CWあるいはCCWスイッチを押すとパルスを出力。
  設定数出したらSTOP。
2相パルスとして使わなくて、
  「何発かのパルスが欲しい」
ときに便利。
  お手軽ツールで、これってなかなか無いんじゃ
  なかろうか。

上のはDDS方式で、0.01Hz単位で周波数を設定できます。
0.10Hz~9999.99Hz。
こっちは STOP・CW・CCWの操作だけ。

基準カウントクロックが80kHzで、16MHzクロックの
ATmega328にはなかなか重い仕事です。

80kHz=12.5μ秒で割り込みをかけてDDS処理。
タイマー1のコンペアマッチで2相パルスを出力します。
ポートを叩いてH/Lを出力するんじゃないので、ジッターは
ありません。  (DDSに起因するジッタはある)
  80kHzで割り込み。
  DDSのための32bit加算
  次のコンペマッチで出力するA相B相を決定。
これを繰り返します。

※関連記事
2024年6月2日:秋月電子通商のI2C接続液晶表示器
2021年7月2日:秋月の液晶表示器 ACM0802C-NLW-BBW-IIC、I2Cのプルアップ抵抗
2022年7月18日:秋月電子16文字x2行のI2Cインターフェース液晶AQM1602Y
2024年9月12日:液晶表示:CG-RAMの表示がちょいと違う

※重要 液晶へのI2CアクセスとTWI割り込みを切り離せたから
    高速割り込みが安定してできるようになったのです。
2024年4月3日:超低速2相パルス発生回路・ケース入れ
2024年4月7日:I2C液晶のアクセス、割り込み処理で遅れる原因らしきもの
2024年4月12日:I2C液晶のアクセス、割り込みで処理しないようにすると


※2相パルスあれこれ
2024年4月26日:治具作りは面白い:2相パルスの発生
2014年07月01日:高速2相パルス発生回路
2018年5月25日:アナログ入力で2相パルスの周波数と正転逆転を制御する発振器

※2相パルス発生回路 回路図
Cw_ccw2

2022年8月24日:パルスジェネレータを作ってみた:箱に入れた
これの出力はデューティ可変できますが
「パルスを何発欲しい」には対応していません。
設定も「周期」で、「周波数」として合わせたい時は
ちょいと不便。
「全部入り」を作ろうとすると、Ardino UNO-R3ベースでは
だいぶとチカラ不足。

いずれも、電源や表示器以外は、
  ATmega328Pの中に入っている機能だけ
で実現していますんで、
「こんだけできるんやで」と褒めてやりたいところ
です。

※案
DDS方式の2相パルス発生器、割り込みの中では
処理時間の制限でもうなにもできませんが、
「外(main loop)」ではあれこれできそうです。
例えば、周波数を振らす。
  何Hzから何Hzまで、何秒かけて周波数をup/down。
てな処理です。
DDS加算している値を変えると周波数が変わります。
  割り込みでの処理時間は同じ。
設定メニューを出してあれこれでしょう。
  SW4を付けとけば良かった。


| | コメント (0)

2024年9月20日 (金)

「導通チェッカー」から「配線チェッカー」へ

先日来、こんなプロジェクトが進行。
きっかけは 東大阪市の関西電機工業 さんからのhelp。

  製造しているキュービクルの配線をチェックしたい。
  配線にトランスが入っていると直流的には導通と同じで、
  普通の導通チェッカー(BZM3を買ってもらった)では判別
  できないので、なんとかならないか・・・

  ホロホロブザーを使っていたが、今はもう手に入らない。
    ホロホロブザーはトランスを判断できるんです。
    抵抗だけでなくインダクタンスがあると音色に
    変化が出ます。

で、検出回路をあれこれと。

・こんなのできたよ:
  トランスが入った回路の導通チェッカー。
     配線チェッカーと呼ぶ方が良いかも。
  今のマイコン型導通チェッカーは、
  「電子回路の配線チェック用」でしたが、今回のは
  「配電盤の配線チェック」に特化しました。

・検出電流を交流にしました。
   トランスを介した配線のように、線路のインピーダンスが
   高ければ導通なしと判断します。
   配線がダイレクトにつながっているときだけ導通あり
   として、ブザーが鳴ります。
     コンデンサが入った回路だと導通ありとミスするの
     で、直流方式の判定回路も残してあって切り替え
     できます。
   直流抵抗がほぼゼロの100kVA・6600V:200Vトランスや
   6V・1A出力のトランスコイルを介したつながりが判断で
   きます。

こんな回路 (クリックで拡大↓)
Tn841_05b

・電池電圧3Vで1kHz(~5kHz)の方形波を出し、電流検出抵抗
 150Ωでの電圧ドロップを増幅・整流して導通を判断します。
   短絡で20mAという電流になります。

・大きな制御盤だと、あっちとこっちの配線を見るのに、
 接続用のリード線をチェッカーから伸ばさなくてはなりません。
   場合によったら数メートル。
 その接続用リード線の抵抗を補正するため、検出レベル調整
 用の「ボリューム」を設けました。
   怪しい接続状態を知らせるための「断続報知」機能も
   あって、これも調整できます。
 針式テスターのゼロオーム調整のイメージです。

・欠点として・・・保護回路が入っていません。
 通電中の回路に触れると、電圧にもよりますが・・・壊れます。

・可動鉄片型交流電流計(CTの先につなぐ5A計)の微少な
 インダクタンスでも判別できるよう、出力方形波の周波数を
 5kHzまで上げられるようにしました。
   当初は1kHzだったのを設定できるように。

・オペアンプを両電源で使っているのは、当初、
 同期検波回路でリアクタンスを判別しようとしたから。
 でも、回路規模が大きくなってしまい断念。
    LCRメータが作れるぞ!に。
 単純な増幅整流回路も両電源のほうが楽だし、あれこれ
 実験してた残りで、マイナス電源が残りました。

・クリップ短絡で電源オン。
 チェックをせず3分放置で自動電源オフという便利な
 機能はBZM3を引き継いでいます。
   最初は1分でしたが、盤の裏に回り込んでチェックする
   端子を探していたら1分では不足だ(怒)っと3分に。


詳細は
KANSAI DENKI AI & IoT 2024-09-12:配線チェッカー(新ホロホロブザー)

※関連
電子回路の導通チェックに! マイコン型導通チェッカー組み立てキット

2012年02月11日:導通チェッカーの検出抵抗値を下げたい
   ↑トランスの話が出てきます

※参考
配線チェックしようとしている盤には、慣れ親しんだ
電子回路の設計では見たことのない回路記号が出てき
ます。

Ee2_20240920132301

使う「単位」が違う(桁がぁぁ)。
  触ったら死にます。

丸二つに△とYの記号は三相のトランス。
  電圧が6600V:420V。 容量が500kVA。


※追記 (09-22)

単相の交流電流を計るならCTは一つ。
Z11_20240922115901
トラ技2024年10月号に「加熱完了報知回路」
この時は又裂きした延長コードの片側にCTを入れて
フライヤの電流を見ました。

交流ですので極性はなし。
CTの端子、電流計の端子を入れ換えても値は同じ。

三相交流だとこんなつなぎ。
Z12_20240922120501
RST各相にCTを入れて、それぞれに電流計を
つないでいます。
でも、これだともったいない。

CT二つで、各相の電流を計る手法がこれ。
Z13_20240922120601
120°位相の三相交流だからできる芸当。
この時は位相が絡むので、CTの二次巻線の出口は
ちゃんと向きを確認してつながなくてはなりません。

実際の配線図ではこんなふうに描かれています。
Z14_20240922120801
電流計を一つにして「AS:交流電流計用切替スイッチ」で
RST相のうちの一つだけを選び、読み取ります。

電圧計での相選択は2極を普通に切り替えるので分かり
やすいのですが、CTの出力を切り替える場合、
   オープンにしたら高電圧が出るので
   オープンにしちゃダメ。
という制限があります。

どんなふうに切り替えるのか・・・
  中村電機製作所 交流電流計用切替スイッチ SP-A
この説明書がわかりやすいでしょうか。

巧妙な接点が使われています。
簡単に描き直してみました。
Z17  
左方向へ回すと
  OFF R相 S相 T相 OFF
と切り替えが進みます。
OFFの位置では二つのCT出力を両方とも短絡するのが
分かります。
R相の読み取りではT相側を短絡。
T相の読み取りではR相側を短絡。
  読み取らない方のCTは短絡状態に
  なるよう、ほんと、うまいこと切り替え。
S相はR相とT相をつないで、そこからの流れ
(三相のベクトルだぁ)を読み取ります。

さて、これがCTの先につなぐ5A可動鉄片型交流電流計。
Mt11
こんな記号。
Mt12
そして、使うCTの定格も記されています。
Mt13
CTの一次側に500A流れたら電流計に5A流れて、
メータ指針が500のところにきます。

目盛板を外すと、こんなコイルと指針機構が見えます。
Mt14

直流抵抗ざっと0.03Ω。
インダクタンスがおよそ16μH。 (私とこの計器で)
このメータを介しての「つなぎを判断できれば」という
要望だったわけです。
直流では無理。
5kHzだと0.5Ωくらいのインピーダンスになり、なんとか
判別できるかというところまで追い込めました。

| | コメント (10)

2024年9月19日 (木)

図書館で・・・「歴史を変えた自然災害」

地震、火山、台風(ハリケーン)、洪水・・・

 ・歴史を変えた自然災害

R11_20240919094201
  ルーシー・ジョーンズ 著
  大槻 敦子 訳
サブタイトルが
   「ポンペイから東日本大震災まで」

人は「災害」と呼びますが、元は地球の営み。
そもそも、人が自然に抗うなんて無理。

| | コメント (0)

バナナプラグのハンダ付けには「文鎮」が便利

ハンダ付けする対象物を垂直に保持してハンダを流し込み
たいとき、例えばバナナプラグへのリード線付け。
こんなときに 文鎮:ハンダ付け補助ツール のありがたみ
がよく分かります。
   あるとないとで大違い!

B11_20240919092601
B12_20240919092601

紙クリップにゴム板をくっつけているので、保持が安定。
快適に作業できます。

2024年8月30日:20~22mm厚 鉄の「文鎮」13個
  現時点、7個、残っています。

| | コメント (3)

2024年9月13日 (金)

ロータリーエンコーダ:操作感覚が重要なんだけど

ロータリーエンコーダ、あれこれ使っていますが、
秋月での部品購入のついでに買ったのが
  ・TAIWAN ALPHA ELECTRONICのRE160F-40E3-20A-24P-003
    価格が200円。
そして、よく使っているのが、
  ・アルプスのEC12E2420801
    これは100円。

Re31

台湾製のほうがが高価だし、性能が良いのかと思いきや・・・
早く回すと接触が不安定になっちゃうのです。

A相、B相パルスの周期を10msくらいまで上げると
  (24クリックなんでざっと1/4秒で1回転
   の速度)
こんな具合にLレベルの信号にノイズが出てきます。
Re32
   ※ツマミを付けて手で回した時の最高速あたり。

入力のプルアップ抵抗はArduino UNO R3の内蔵プルアップ。
  30~40kΩくらい。
そしてGND間に1000pFのコンデンサを入れてます。

回転する接触子とベース面との接触が悪くなり、
接触子が離れてしまうのでしょう。
いわゆるチャタリングとは違った現象です。

ゆっくり回していると大丈夫なんですが、早回しすると
こんな波形になってしまいます。

同じような回し具合でもアルプスのは大丈夫。
回す感覚もアルプスのが軽快です。

| | コメント (0)

アマゾンで買ったユニバーサル基板:失敗だぁ

長らく愛用していた「ICB-96互換のユニバーサル基板」、
手持ちが残り少なくなってきたので、似たような大きさ
のをアマゾンで買いました。
  ・2012年12月14日:ICB-96互換のユニバーサル基板
  ・共立エレショップ:21-116 販売終了

アマゾンで見つけたのがこれ。
サイズが120mm×180mm。
「21-116」が114mm×160mmでしたので、ちょいと大。
そして、安価。
Pc22

左がアマゾン。 右が21-116。
Pc23

しかし失敗・・・
というか、スペックの見落としです。(自業自得)
厚みが「1.2mm」しかなくって、ペラペラなんです。

上がアマゾンで厚み1.2mm。
下が21-116で厚み1.6mm。
Pc26

パターンの形状。
Pc25
上がアマゾン。下が21-116。

基板全面を使って回路を組むんじゃなく、適当な
サイズに切り出して使うには大丈夫でしょうが、
t=1.6とt=1.2では頑丈さがだいぶと違います。

しかし、パターンの形状が単純な「丸」じゃなく
「八角形」になっていて、ハンダはアマゾンのほうが
やりやすいです。


※共立で扱っている新しいユニバーサル基板
ユニバーサル基板 片面フェノール 115×160mm UP-201
これが、「21-116」の後継品のようです。

| | コメント (0)

2024年9月12日 (木)

液晶表示:CG-RAMの表示がちょいと違う

昔人間ですんで、「これで行こう」と決めたことは
いつまでも引きずっています。
今回のトラブルは液晶表示器の外字登録。

使ったのは秋月で買ったI2C液晶 AQM1602XA
  I2Cで安定して使えるようになって、6本線で
  つなぐ液晶表示器はちょいと縁遠くなりました。

キャラクタ表示の液晶表示器、8文字分のCG-RAMに
外字を登録できます。
文字コードとして0x00~0x07に対応するパターンを書き
込むと、登録した文字が出てくるという仕掛けです。

しかし、その先頭文字が「0x00」となり、C言語の
ヌル終端文字列:Wikipedia に引っかかってしまうので、
文字列の中に入れられません。
実質、7つの外字しか利用できないのです。
そこで、この表にあるよう、
L11_20240912102801

CG-RAMの文字コード0x00~0x07を0x08~0x0Fと
して定義しておくという手法を使ってきました。
  文字列の中に入れずに単独文字として書き込む
  ぶんには0x00で問題なしなんですが

ところが今回のAQM1602XAでこれをすると、定義した
CG-RAMではなく、内蔵された文字が出てきちゃったのです。
L12_20240912102901
16文字×2行の液晶、その下段に0x00~0x0Fの文字を
表示してみました。
L13_20240912103001

左の8つがCG-RAMに入れた登録外字。
昔の液晶なら同じ字が右に8つ並ぶのですが、
この液晶だと、内蔵文字になってしまい、
今までの手法が使えません。

ということで、登録した8つのCG-RAM文字は
0x00~0x07で表示するという、まっとうな処理に
変更しなくちゃなりませんでした。

※関連
PIC AVR 工作室別館 arduinoの館->キャラクターLCD
よく使うパラレル接続液晶(LCDモジュール)のコネクタ信号
液晶表示モジュールを4ビットモードで使ったときの空きピン処理


| | コメント (0)

2024年9月 8日 (日)

トラ技2024年10月号に「加熱完了報知回路」

トランジスタ技術2024年10月号の「トラ技Jr.コーナ」に、
我がガレージで愛用しています「加熱完了報知回路」が
  揚げもの上手!
  愛用フライヤに外付け「加熱お知らせブザー」
  AC100 Vの電流変化を検出してブザーでお知らせ
  する回路の製作
として掲載されています。
あえてマイコンを使わずに製作しました。

こんな様子です。
Kk1_20240908162301
Kk2
単4電池2本で動作。
CMOS ICなんで、スタンバイ時の電流は
(ほぼ)ゼロ。
電源スイッチは無しで。
Kk3_20240908162401
通電の検出はカレントトランス。
フライヤが所定の温度になって、サーモスタットが切れた
のを検出してブザーを鳴らします。

そして・・・
  「電源/モータ編」 の
   第15章 ステッピング・モータをお手軽駆動 ULN2003A
Tt10
これは、
 ・2023年4月26日:出窓:鯉のぼりを振れたらというリクエスト
 ・2023年5月4日:出窓:鯉のぼりを振る
が元になっています。

| | コメント (0)

2024年9月 6日 (金)

修理:文化シャッターのリモコンSTX8901G

過去、文化シャッターのリモコンSTX8901Gを何度か
修理しています。
 ・2021年10月 8日:修理:文化シャッターのリモコンSTX8901
 ・2020年5月 5日:修理:文化シャッターのリモコンSTX8901G
このリモコン、水晶発振子とセラミック発振子が
ちゃんと固定されていない(2本足へのハンダ付け
だけ)ので、リモコンを落下させたときの衝撃で、
発振子の足がハンダされたプリントパターンが
はがれてしまって、動作不良になるケースが
多いようです。

今回もその故障パターン。
  水晶のハンダを外すと、片側のパターンが
  めくれていました。
Bs11_20240906170901
  拡大
Bs12

この部分を補修したら電波が出るようになりました。
これで直ったか・・・ しかし、変調音がおかしいのです。
  ※チェックに使うのはこれ↓
 ・2018年9月23日:6LEDタイプのMAX4003 RFデテクタ
正常だと、「ピロピロピロ~~~」っと秋の虫が
鳴くような澄んだきれいな音が聞こえます。
  パルスで変調されているているので
  AM波として聞こえる

正常波形を簡易スペアナでみると、こんな感じ。
約315MHzにきれいなピークが出ます。
Bs14

ところが、今回のは「ピロピロビャャャャ~」
という変調音。
電波を出す最初は大丈夫なのに、途中からおかしく
なり、それが異常な変調音として聞こえるのです。
こんな電波でした。
Bs15

サイドが広がっています。
400kHzのセラミック発振子が異常発振をおこして
いたのが原因です。
Bs13
でも、セラミック発振子そのものは大丈夫でした。
  外して別の発振回路で試験してOK。

そして、この周辺の部品を絶縁物(小ドライバのお尻)で
押したら回復することもあるということが判明。
ハンダ付け不良を疑って、マイコンの足を含め、
周辺のCRをハンダ付けし直したら、正常に回復し
ちゃったのです。
どこのハンダがおかしかったまではわかりま
せんでしたが、ヒートガンで加熱しても再発し
ないし振動を加えても大丈夫だしということで、
OKと判断しました。

複合した故障原因、解決するのはなかなかやっかいです。

| | コメント (0)

2024年9月 5日 (木)

武田コーポレーション enecon SLD3-2P (600mAh) 1200cyc目

600mAhと単3サイズでは破格の低容量。
容量が小さい分、大きな充放電回数に耐えられるのか
思ったのですが、そうではないようです。

前回、800サイクル目の報告が 6月22日
  ※実験装置の都合で400サイクル
   ごとの報告となります。

1200サイクル目の0.2C放電グラフです。
Cap021 

前回、800サイクル目の内部抵抗が103mΩ。
今回、1200目だと230mΩと大きくなり、劣化が
進んでいるようです。

※追記
1200サイクルまでの充放電時間と充電完了電圧の
グラフがこれ。
Cap028_20240907105301
最初の頃の充電は目一杯の132分。
-ΔV検出する前に、132分に達しで充電を止めています。
  0.5C:2時間率 + 10%の時間  =132分
放電も400サイクルあたりまでは定格容量目一杯。
800サイクル手前で充電時間が132分を切るように
なり、-ΔV検出が始まります。
  -ΔVは10mVに設定。
    JISでは5~10mVと。
ところが・・・
1200サイクル手前の1186サイクル目と1193サイクル目
の充電で「-ΔVの検出に失敗」して目一杯の132分充電が
行われています。
この部分だけを抜き出してみました。
Cap026_20240907105901
直前、直後はちゃんと「-10mV」を検出して充電が
止まっていますが、1186cycと1193cycを失敗しています。
さらに拡大。
電圧軸を10mVにしてみます。
Cap023_20240907110101
Cap025_20240907110101
1186cycと1193cycは「-9mV」しか下がりませんでした。
このため-ΔVでの充電停止に失敗したのです。
   もうひといきだった
この電池の容量が小さいので、0.5C充電だと
300mAと充電電流が小さいので充電末期の電圧変化に
対する影響も小さいのでしょう。
-ΔVの発生は電池温度の変化、充電による発熱が関係
します。
周囲温度の影響も出てきます。
夏場ですので、仕事してるときはエアコンが働いてます。

ニッケル水素電池、なかなか奥深いです。
  『偽の-ΔV』というのも出現します。
パナソニックeneloopスタンダード単3「BK-3MCC」60%(72分)放電で偽の-ΔV出現
ダイソーReVOLTE単3 JIS C8708:2019充放電試験(-ΔV検出有) 偽の-ΔV発生

  ※電池あれこれ(まとめ) 

| | コメント (0)

2024年9月 4日 (水)

穴を残しておきたいのでハンダしたくない

とあるプリント基板。
電線を直出しする「穴が」あります。
Hh11_20240904173901

部品を実装して基板を組み立てた後、テストする時、
「穴」をそのままにしておきたいので、ハンダ付けした
くありません。

コンタクト・プローブ を使うしかないか』
   (いわゆるピン治具)
『作るの面倒』と思っていたら、同僚が
「こんなんあるでぇ」っと、秘密兵器ぽいのを
出してきてくれました。
Hh12

「エエ感じにはさめるやん」っと試したのですが、
「あかん。 接触抵抗が大きいし安定せぇへん」
っとなりました。
Hh13
1Ωを越える抵抗が出てしまいます。
  H1・H2間につながる抵抗が問題にな
  る回路なんです。

プローブのピンをもっとちゃんとしたのに換える
という方法もあるんですが、
「部品箱にあるもんでなんかないかなぁ」っと
探しましたら、ミヤマのICクリップ MJ-032 を発掘。

これを使えば、基板端に引っかけてうまいこと固定
できることが分かりました。

Hh14

とりあえずこれを試験に使ってみます。

| | コメント (1)

2024年9月 2日 (月)

リレーの接点がぁぁぁ

同僚が修理していた制御回路。
オムロンのMY2(AC100V)リレーが乗っているのですが、
 『ほれ。 これ、見てみぃ
っと、基板から取り外したリレーを手渡されました。

  ※訂正:オムロン製のじゃなかった!
    パナのHC2リレーでしたっ (ごめん)

 「あわわわ」
 「どうしてこうなった?」
Mm11_20240902171201
角度を変えて、コントラストを高く。
Mm12_20240902171301

無くなってしまった接点のベロ部は、こんなところに。
Mm13

メカを動かす装置ですが、いろんなことがあるものです。

※追記 パナのHC2リレー、過去にも似たようなトラブルが
生じています。

2010年2月24日:壮絶死#10 接点がパ~になった「松下」のHCリレー
2015年5月22日:信号が切り替わらない… 2回路リレー
2018年6月5日:やっぱ、おかしいパナの「HCリレー」

プラカバーを外して、今回のを拡大。

生きてる接点側の固定しているところに、怪しいシミ。
Mm21

折れた接点のベロ
Mm23
その裏側
Mm22_20240903111701
切断面
Mm24

修理はオムロンのMY2リレーに交換。

| | コメント (0)

« 2024年8月 | トップページ | 2024年10月 »