金曜日の夜から急の鼻の奥が痛くなって、そのまま全身だるい感じで3日間ほど殆ど何もできなかった。こういうの本当にイライラする。やることいっぱいあるのになにもできない。

直列/並列共振回路の共振周波数

リアクタンスとの関係

インピーダンスの式

共振状態ではリアクタンス部(虚数部)はゼロになる (抵抗成分だけ)。

すなわち

はそれぞれ

共振状態のときの式に代入して f について解く (普通は角周波数 ω を使うみたいだけど、僕はなんか混乱するので全部展開しとく)

移項

両辺に をかける

両辺を で割る

両辺の平方根をとる

両辺を で割る

最悪リアクタンス部がゼロになれば共振ということがわかってれば、簡単に導ける。

変形して L/C を求めるとき

直列共振回路の Q

L か C のリアクタンスをRで割るイメージが覚えやすい気がする (抵抗Rが小さいほど高いQになる、というのがイメージしやすい) 直列に入っている R は単に損失なので、小さいほうがいいというイメージ。

↑ をそれぞれ で割っただけ

並列共振回路の Q

直列の逆数と覚える。並列に入っている R は小さいほど無駄に電流を流すので、大きいほうが損失がなくていいというイメージ。

  1. トップ
  2. tech

FET は電圧駆動なので電圧さえかければ電流を流す必要はない。

ただ、現実的にはFETの入力に寄生している容量を十分充電しきるまでは、電流が相応に流れ、オフにするときはすみやかにこの容量を放電することが求められる。なので容量が少なければ少ないほど早いのはイメージできる。

まではわかったけど、では実際にそれがスイッチングスピードにどう関わってくるか計算で求めるのがよくわからない。

例として 2N7000 の input capacity は最大で 50pF、150Ωの抵抗と3Vの電圧(最大電流20mA)で充電しようとすると、CRの過渡現象の例の式だけで考えると、電流は

ある時間におけるコンデンサの電圧を考える。コンデンサの電圧は電源電圧から抵抗での電圧降下を引いた値なので、

これをさらに t について解きたいけど、自分の力だと解けないので Maxima 君で解くと solve(v = E * (1 - %e^(-t/(C*R)) ), t);

で、各値を代入して計算すると

function t (C, R, E, v) {
	return C * R * Math.log(-(E / (v - E)));
}

// 入力電圧の9割まで
console.log(t(50e-12, 150,  3,  3*0.9)); //=> 約17ns
// 最低 V_th まで
console.log(t(50e-12, 150,  3,  0.8)); //=> 約2.3ns

になるけど、確かめようがない。それに、この速度が実際の FET の速度にどう関わってくるかわからない……

ググってでてきたpdf を見た感じだいぶ難しくて現時点の自分では理解できない。

要は知りたいのは、Gとグラウンド間に入れる放電用抵抗は最大どの程度にできるのか、ということなんだけど、よくわからない。大きすぎると放電に時間がかかりすぎて、オフにならなくなるのはわかる。まぁ実際試しみて定数決定するのが一番いいんだけど……

  1. トップ
  2. tech
  3. FET の入力容量と速度の関係がわからない

まとめを後日書きました [tech][avr][arduino] ボタン電池で動く小型・低消費電力 AVR エレキー (50円 ワンチップマイコン ATTiny13A) | Fri, Nov 8. 2013 - 氾濫原

前書いたのの続き

さらにもっと消費電力を減らせないだろうか? と考えた。パワーダウンモードの消費が計測不可能なので、支配的なのは特にキーイング中と、アイドル中の消費になっている。

特にキーイング中の消費が比較的多い (200uA近く) ので、どうにかできないかと考えた。キーを押しているとき、内蔵プルアップを通して GND に電流が流れるので、そこの消費が結構多い。

今まで何も考えず AVR 組込みのプルアップ抵抗を使っていたけど、ここでちょっと考えてみることにした。

プルアップの調整

内部プルアップは、実測からすると3V/100uA=30kΩ になってるようだ (スペック上は 20k〜50k)。とりあえず AVR 内部のプルアップ抵抗をオフに。

プルアップ抵抗に許される電圧降下を考える。電源電圧3Vで、入力 H レベルは VCC * 0.6 (スペックから)、ノイズ回避用に 0.4V を足すと

  • ピンの必要入力電圧 Vin = 3 * 0.6 + 0.4 = 2.2V
  • プルアップでの電圧降下最大 V = 3 - Vin = 0.8V

となった。

マイコン側は十分大きい入力抵抗があると考えると、かなり大きな抵抗を入れても大丈夫そう? なのかな。

試しに 2.2MΩでプルアップしてみると、ICの足にかかる電圧は2.5V程度になった。2.2MΩ で0.5V電圧降下しているので、0.23uA 程度流れてる。3V / 0.23uA でプルアップと内部抵抗の合成値は 13.2MΩ、つまり内部抵抗は11MΩぐらい……? よく「入力抵抗は非常に大きい」といわれるのを見る割に、いまいちどの程度かわからなかったけど、こんなもんなのかな。

この状態で、消費電力をはかる

  • before: 内蔵プルアップ: 198uA
  • after: 2.2MΩプルアップ: 113uA

とりあえず減ったし、普通に動いてはいる。しかしこれであっているのかさっぱりわからない。

これで、毎日2時間使うケースだと (CR2032/225mAh, 1日2時間, パワーダウン中 0.15e-6mA, キーイング中 113e-3mA) 995日持つ計算になった。

delay_ms のさらなる見直し

128kHz で動かすにあたり delay_ms を以下のようにしていた。

void delay_ms(uint16_t t) {
	uint16_t end;
	cli();
	timer = 0; TCNT0 = 0;
	end = NOW + DURATION(t);
	sei();
	while (NOW <= end) { nop; }
}

timer は 2msec ごとのオーバーフロー割込みでインクリメントされているけど、これだとちょっと精度が悲しいような気がするので、カウンタそのもの (TCNT0) も見ている。オーバーフローでやっているので、単純に timer はカウンタの桁あがりとして扱える。NOW は ((timer<<8)|TCNT0) という定義

while の中を アイドルではなく nop; にしているのは、ここでアイドルに入ってしまうと、次に起きるのが 2msec 後とかになるので、せっかく TCNT0 を見ている意味がなくなるから。

ただ、まだここは精度を維持しつつも最適化の余地があって、以下のようにした。

void delay_ms(uint16_t t) {
	uint16_t end;
	uint16_t end0;
	cli();
	timer = 0; TCNT0 = 0;
	end = NOW + DURATION(t);
	end0 = end - 0x100;
	sei();
	while (NOW <= end0) {
		set_sleep_mode(SLEEP_MODE_IDLE);
		sleep_mode();
	}
	while (NOW <= end) { }
}

少なくとも、最後の TCNT0 分 (8bit) になるまでは、普通に 2msec ごとに寝ていても大丈夫なはずなので、それまではスリープを使い、最後のカウンタ分はビジーループにするようにした。nop; は別にいらなそうなのでとっただけ。

これでキーイング中でも 96uA まで消費電流を落とせた。上と同じように、毎日2時間使うケースだと (CR2032/225mAh, 1日2時間, パワーダウン中 0.15e-6mA, キーイング中 96e-3mA) 1171日持つ計算になった。1000日超え! もうこれでいいかな。

  1. トップ
  2. avr
  3. ATTiny13A を使った低消費電力エレキー
  1. トップ
  2. tech
  3. ATTiny13A を使った低消費電力エレキー
  1. トップ
  2. arduino
  3. ATTiny13A を使った低消費電力エレキー

回路図・基板作成用 CAD のEAGLEを使ってみた。割とデファクトスタンダードっぽく使われているっぽい。試したのはフリー版 (個人レベルでは十分すぎる機能がある)

基本商用ソフトなので、もっとモダンでいい感じなのかと思ったけど、思いのほか操作性がレガシーで悪い。回路図作成ツールとしては BSch3V のほう部品エディタも含め、圧倒的に使いやすい……

ただ、配線ツールとしては結構使いやすい (というか、もっとよくできると思うけど、これ以上のものがなさそう……) デファクトスタンダードっぽく使われているおかげで、ライブラリは比較的充実しているように思える。ただ、あまり整理されていない形になっているので、最初ものすごくとまどう……

しばらく使わないと絶対に忘れるインターフェイスなので、重要なところをメモっておく

ライブラリ

(追記)

http://www.cadsoftusa.com/downloads/libraries のページから

  • japan で検索して出てくるもの全部
    • c-j.lbr
    • r-j.lbr
    • tr-j.lbr
    • alps_japan_potentiometers.lbr
  • avr-7.lbr

あたりを入れておいたほうがいいっぽい。ただ、 *-j.lbr は US EU とピンに互換性がなくて置換できない…… ライブラリエディタで、Symbol の編集画面を開き、ピンの名前を一緒にしてあげればいいっぽい。例えば resistors.lbr の場合、ピンの名前は 1 とか 2 とかなので、c-j.lbr のほうも PIN1 を 1 に PIN2 を 2 にすれば、置換できるようになる。

デフォルトだと EU 版 US 版の記号が入っていて、これでもなんとかなるけど、日本で使われる一般的な回路図記号と若干異る

  • EU 版
    • 抵抗の記号が新JIS記号と一緒 (ジグザグじゃなくて四角)
    • C の棒が太いくて長い
  • US 版
    • 抵抗の記号は旧JIS記号と似てる (ジグザグ) ただ、ジグザグの数が多い
    • C の片方が曲っている

回路図


  • 回路図をつくるとき
    • Add a part で部品を置いていく、検索が貧弱なのでかなり空気を読む必要がある
      • 置いてから ESC を押すと選択画面に戻るので連続でおける
    • 既に回路図にある部品なら Copy ツールを使ったほうがいい
    • 使いたい形がなくてもとりあえず記号だけあわせておけば、あとから Replace で部品だけ変えられる
    • Electrical Rule Check は頻繁にかけたほうがいい
      • けどエラーの意味がわからなかったりする
      • ECR の結果は回路図の画面で示されるので、基板画面を見ているとなにがなんだかわからない

基板図

ユニバーサル基板で作ること前提なので、あまり細かいところまでは使ってない。ユニバーサル基板専用のソフトがあればいいんだけど。

  • 基板図をつくるとき
    • 必ず 回路図を同時に開いておく必要がある
      • そうしないと修正点が反映されず、最初から作りなおすハメになる (意味不明)
    • まずグリッドを設定する。Size 50mil Multiple: 2 にして Display on にすると、100mil ごとにグリッドがひかれ、50mil ごとにスナップするようになる。(ユニバーサル基板のピッチは100mil)
    • Edit -> Net Classes... で default の Width を 32mil ぐらいにしとく (オートルートとかするときこの太さでひかれる)
    • Layers で、tOrigins / bOrigins を非表示すると、部品全てが動かせなくなる
  • オートルート便利かと思いきやかなり難しい。
    • 少ない部品なら、基本自分で配線して、どうしたもんかってときに使うとヒントがでるツールとして使う感じ
    • ripup; コマンドを実行すると配線済みのが全部消える
    • 自分である程度配線したあとなら Undo を使ったほうがよい
  1. トップ
  2. tech
  3. 回路図・基板検討に EAGLE を使ってみる