静音マウスを普通のマウスにする

Logicool の M650L というマウスを買ったのですが・・・
静音マウスなのはいいとして、
・左右クリックの作動力が小さすぎて、ちょっとマウスが何かにぶつかっただけで誤クリックする
・中央クリックと左右クリックの作動力がアンバランスで操作しづらい
という点が不満です。

それでも、以前に買った他社マウスよりは作りが良いので
スイッチを取り替えてしまいましょう。

ねじ止めされています。分解は星型ドライバが必要です。

タクトスイッチは一般的な 5.08mm 2P タイプなので、
適当なものに付け替えます。
もちろん普通のタクトスイッチだと耐久性が足りないので、
マウス用の Panasonic EVQ-P0E07K を使いました。

実装しなおして、静音ではなくなりましたが、これで快適になりました。

STM32G071のADC Calibration

最近は STM32G071 をいじっていて、USB-PD デバイスを作っています。

STM32 は 12bit ADC を搭載しているのですが、
変換値が実際の値からかなりずれてしまい、しばらく困りました。

ADC の初期化後、変換前に ADC のオフセットの Calibration が必要です。
STM32G071 の ADC モジュールは ハードウェアによるキャリブレーションが実装されていて、完了後に ADC_CALFACT レジスタに値が書き込まれます。
次回変換から、CALFACT で補正された変換値が ADC_DR レジスタによって取得されます。

HAL では HAL_ADCEx_Calibration_Start という関数を呼べば、キャリブレーションを実行してくれます。
STM32CubeMX のコードでは以下のように書けばよいですね。

MX_ADC1_Init();
// 中略
// call before ADC conversion has started
HAL_ADCEx_Calibration_Start(&hadc1);
// HAL_ADC_Start(); を呼び出し可能

注意点は、ADC 初期化した後、ADC 変換停止状態で Calibration_Start 関数を呼ばなければいけないということで、作成したコードではタイマ割り込みから ADC_Start() していたので、タイミングによってはその制約が守られていませんでした。
Calibration に失敗すると、CALFACT は更新されず、0 のままになります。

HAL_ADCEx_Calibration_Start のコードにもその注意が書いてあるので、まあちゃんとコメントを読めばこんなところで引っかからないはずですね。

さて、実際に Calibration させてみると、CALFACT = 69 という値が読めます。
VREF = 3.3V, 12bit なのでオフセット電圧は 69×3.3/4096 = 55mV という計算になります。ちょっと大きいですね。CALFACT は 7bit なので、最上位 bit まで使っています。
(QFP32 パッケージだと VREF = VDD)
STM32G071 のデータシートによるとオフセット誤差 EO = 4.5LSB (max) ですが、これはキャリブレーション実行後の測定値と書かれています。

実際エラッタシートを見ると、VREF が 3V 以下のとき、個体によってはオフセット誤差がキャリブレーションの CALFACT (0-127) を上回ってしまうようです。VREF = 1.65 – 3V のとき、ワーストケースの EO = 50LSB となっています。ちょっとだめですね。

何にしても、Calibration は必須であり、ADC 停止中に行う必要があり、また、Calibration_Start は手動でコードを挿入する必要があるということに注意すればよいでしょう。

AVR-DA の内蔵プルアップ特性

AVR-DA シリーズのデータシートには、IO ポート内蔵のプルアップ抵抗の電気的特性はあまり詳しい記述がありません。代表特性として VDD=3V, VIN = 0V のとき 150uA(typ) 200uA (max) を保証しています。

また、VDD と Weak Pull-Up 電流のグラフ (Fig 38-82) が掲載されています。電流は VDD 電圧に依存するように書かれていますが、測定条件が明確ではありません。


– ここまで図表は AVR64DA28-32-48-64 DS Rev.B より引用

マイコンの内部回路によりますが、
1. PU 抵抗の形成に MOSFET を使っている場合
2. PU 抵抗のイネーブルを FET SW で切り替えている場合
などの条件では、抵抗値が非線形となることが考えられます。たとえば AT90S シリーズはかなり非線形な特性でした。

内蔵プルアップを積極的に使う応用を作るうえでこのあたりが気になったので、実測してみました。

VDD=2.5, 3.3, 5V で、プルアップに設定した PE2 ピンに対して VIN を0-5V, ±0.6mA 制限でスイープして、グラフにプロットした入力電流 Iin を青線で示しています。0<VIN<VDD の範囲でほぼ線形とみなすことができます。R=20kΩ の破線とよく一致します。
なお、VIN>VDD では寄生ダイオードが導通するので大きな逆電流が流れます。数十mA を超えると IC によってはラッチアップしてしまいます。

一応、ポートを変えて PD5, PF0 ピンでも同様に確認してみましたが、ほとんど同一の特性でした。常温では プルアップ抵抗 R_PU=20kΩとみなして問題なさそうです。

VIN = 0V の電流値は先ほど示した FIg.28-82 のグラフと一致します。しかし、FIg.28-82 から、パッシブな抵抗に比べて相当大きい温度係数 (~2000ppm/K = 0.2%/K) をもつことに注意が必要です。

シフトレジスタによるノイズジェネレータのフィードバックと周期

デジタル回路の簡単なノイズジェネレータとして、シフトレジスタを使ったいわゆる Shift Register Generator Counter が使われます。シフトレジスタの出力を XOR を通して入力にフィードバックすることで、長い周期のカウンタが得られます。カウンタ周期 N が大きいとき、シフトレジスタの出力は (入力周波数 / N) より高い周波数成分をもつホワイトノイズに近づくので、サウンドジェネレータのノイズ音発生器によく使われます。

2入力の XORを使ったフィードバック回路では、SREG 出力が 0x00 のとき入力も 0 になってしまうため、この状態を避ける必要があります。一般的にはリセット後の初期値を適当な値に設定します。

74164 などの SIPO シフトレジスタは、出力 0x00 にするリセット入力しかありません。出力が 0x00 を有効なステートとするためには、上図のように XNOR を使えば OK です。これは、出力 0xFF から XOR によるフィードバックで動作させたときと等価になります。

2入力 XNOR の入力元 bit の接続先を M,N として、得られるカウンタの周期を下表に示します。N bit のシフトレジスタのとりうる状態は 2^N で、全 bit が 1 のときは無効な状態なので、周期 2^N-1 が N bit SREG の最大周期となります。この最大周期となるカウンタを Maximum Length Counter と呼びます。Maximum Length Counter となるフィードバック接続は、表中で太字で示しています。

M
N/M 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
N 0
1 3
2 7 7
3 15 6 15
4 21 31 31 21
5 63 14 9 14 63
6 127 93 127 127 93 127
7 63 30 217 12 217 30 63
8 73 465 21 511 511 21 465 73
9 889 42 1023 62 15 62 1023 42 889
10 1533 2047 1953 1533 595 595 1533 1953 2047 1533
11 3255 126 45 28 819 18 819 28 45 126 3255
12 7905 1785 8001 7161 6141 7665 7665 6141 7161 8001 1785 7905
13 11811 254 5115 186 5461 254 21 254 5461 186 5115 254 11811
14 32767 4599 63 32767 35 93 32767 32767 93 35 32767 63 4599 32767
15 255 126 57337 60 16383 434 63457 24 63457 434 16383 60 57337 126 255

 

ラインフィルタで絶縁電源を作るテスト

デジットのセールでラインフィルタが 100個¥500 と激安なのでつい買ってしまいました。

ラインフィルタは SU10VF-05050 という型番で、
AC 入力回路のコモンモードフィルタを想定したものですが
要はトランスなので絶縁電源に応用できそうです。
電力は取り出せなくても、1個¥100 以内の絶縁電源でマイコンを動かすことができれば
いろいろ応用ができます。

回路図(TC40H000P 使用)

回路図(NE555P 使用)

そういうわけで、あり合わせの部品で試作したのが写真左側の回路です。
(右側は一緒に買ったステッピングモータのテスト回路)
フライバックコンバータを構成していて、
シャントレギュレータとフォトカプラで電圧誤差を一次側にフィードバックすることで
安定化された +5V を出力します。

AC ライン用のラインフィルタは DC 電流を流すことを考えられていないので、
電力トランスとして使うとすぐに飽和してしまいます。
図の回路でおおむね 20-30mA くらいの電流を取ることができます。

SM1350 ブレイクアウト基板

NPC 社の SM1350 という IC があるのですが、パッケージが若干特殊なので
テスト用にブレイクアウト基板を作りました。

回路図 (PDF)

レイアウト(裏面) (表面)

生基板

実装例 (A級アンプモード)

実装例 (BTLモード; 下半分の C は実装不要)

BTL 出力と A級出力の 2 モードに対応しています。
(BTL/A級出力は IC のマスクオプションで決まっています。)
基板にプルアップ抵抗のパターンがないので、
マスクによっては抵抗の配線が必要になるかもしれません。

余りがあるため、ほしい方があれば部品頒布のページを確認のうえご連絡ください。
基板のみ¥100、IC 付き¥800 で頒布します。(送¥84)

追記

A級出力マスクの場合は、スピーカを駆動するために外部アンプが必要です。
LM358 のようなアンプと接続するか、下記のような簡単なアンプを使用して
スピーカに接続してください。

ロジック IC でつくる国鉄気動車チャイム音 (製作編)

前回の回路を作ったものが下記の写真です。
比較的小規模な回路なので、基板1枚に収まります。

国鉄チャイムなので、国鉄時代に製造された IC で統一しました。

ラッピングにするほどでもないので、信号線は基板裏側で配線しています。
この類の配線には銀めっきの単線が便利です。
普通に売っているラッピング用単線は錫めっきなので、長期在庫品は半田付けには向きません。
同じ錫めっきの単線でもメーカによって差があるようで、特にジュンフロン線は半田が乗らない傾向にあるように感じます。
トラブルの元なので、錫めっきのジュンフロン線は半田付け禁止にしています。

続きを読む

ロジック IC でつくる国鉄気動車チャイム音 (設計編)

国鉄時代の気動車の車内放送で使われていたメロディ(アルプスの牧場)を鳴らす回路を作りました。
マイコンを使ってはつまらないので、例によってロジック IC を組み合わせて作りますが、
せっかくなので国鉄時代(~1987)に製造された IC だけを使って組んでみました。

2 つの 8 ステップ波形生成器とエンベロープ生成器により、
ある程度オルゴールのような音が鳴るようになっています。
長くなってしまったので設計編、製作編で区切ります。

続きを読む

LM339 によるローコストな 5V -> ±15V DC-DC コンバータ

UA741 など旧世代のアナログ IC を使うときに必要な ±15V の両電源を用意するのは少し面倒です。
単電源 +5V から ±15V に変換できればいいのですが、そういうモジュールは高価だし、スイッチングレギュレータ IC を 2 回路用意するのもあまりスマートに見えません。
2 巻き線トランスを使えば両電源へのコンバータは構成可能ですが、トランスを巻くのが面倒です。
そこで、簡単でローコストな方法として、コンパレータ IC LM339 を使用して両電源 DC-DC コンバータを作ってみました。


(テスト回路; 一部使用していない部品が実装されています)

回路図PDF

回路図のようにどこにでもある部品で構成しており、LM393(テスト回路は NEC uPC393C を使用) 1 個で発振、電圧比較を行っています。
+ 側は、フィードバック電圧が基準電圧 0.6V より大きければ Tr のドライブをやめるように制御しています。
– 側の制御は少し難しいのですが、0V (厳密には LM393 のドライブ段の VCE(sat) )基準電圧と出力 +/- の中点電圧との比較を行うような回路になっています。なお LM393 は入力段が PNP Tr なので -0.5V 程度までの電圧比較が可能です。
専用 IC のように保護回路や Duty 制御は入っておらず、効率もよくありませんがそれなりに安定した電圧が期待でき、+ 側は 30mA 以上、- 側は 20mA 程度まで引くことができます。

動作電圧の低い方は LM393 の動作電圧に依存し、2V くらいから動作可能です。
ただし、動作電圧が変わると発振周波数なども変化するので、定数の調整が必要になります。