※CQ出版トランジスタ技術 2010年7月号
AVRマイコンATtiny2313を使った
ハンディ方形波発生器の製作

2011-02-16
追記:2018-10-24

●外観


(ユニバーサル基板を使って手組み)



電源部とマイコン部の拡大



●回路図

(クリックで拡大↓)




●解説


●AVRマイコン ATtiny2313を使った
 方形波発振器の製作
 (デジタル・スイッチで周期とデューティーサイクルを設定)


■正確な周期を

 VCO/PLL IC 4046を使った方形波発振回路では、ボリュームを回して発振周波数を設定しました。ですので、周波数を正確に合わせるには周波数カウンタやオシロスコープが必須です。
 今回の回路は、デジタル・スイッチを使って周期を設定します。最小1μ秒から最大10.00秒まで3桁のスイッチで設定可能です。
 また、単純な方形波ではなくデューティ比を変えられるようにしました。CMOSレベルとMOS FETによるオープンドレインで出力します。
 ユニバーサル基板に手組みしました。何かの実験で正確な周期パルスが欲しい時や一定周期でリレーを駆動したい時など便利に使えます。


■回路の説明

・マイコン
 アトメルのATtimy2313を外部水晶発振モードで使い、4MHzクロックで動作します。インサーキット書き込みできるようコネクタを設けています。

・電源
 乾電池2本で動作します。昇圧型DC-DCコンバータIC LTC3400(リニアテクノロジー)を使い、内部電源3.3Vを作っています。
 平滑コンデンサC4に低ESR品(OSコンなど)を使うと電源リップル電圧が少なくなります。供給電圧3Vで消費電流は約6mA、2Vまで低下すると約8mAに増えます。

   ※参考:LTC3400の特性-居酒屋ガレージ日記

・デジタル・スイッチ
 ダイオードを通して5つのスイッチを並列接続しています。スイッチのコモン端子につながるポートを一つだけLレベルにすると、スイッチの状態が4ビットずつ読み出せます。

   ※オムロン製の小形デジタルスイッチが廃番になり、困っています。

・出力
 オープンドレイン出力に使っている2SK2231(東芝)は60V・5Aというスペックで、リレーやランプなどを駆動できるようにしています。CMOS出力はマイコンのポートを直接出しています。
 R6は出力の保護抵抗。R7は駆動周波数が高くなった時、FETのGS間容量(370PF(typ))でポートの波形がなまらないようにするために入れています。

・LED
 電源オン表示です。R1、R9で電池電圧を検出し、マイコン内部のコンパレータと基準電圧を使って電圧低下警報(LEDを点滅)を出すようにしています。


■周期の設定

 3桁のスイッチで出力波形周期を設定します。000なら1000と処理しています。基準クロックは1桁で設定し、0=1μS、1=10μS、2=100μS、3=1mS、4〜9=10mSとなります。
 ですので、クロック設定が1μSなら1μS〜1000μS、10mSなら0.01S〜10.00Sが設定できる範囲になります。


■デューティ比の設定

 1桁のスイッチで出力パルスのデューティ比を設定します。なお、周期の値がデューティ比より小さい時は、最小クロック幅のパルスを出力します。

  ●デューティ比の設定

  デジタル  
  スイッチ  出力
  設定値   デューティ比
 −−−−−−−−−−−−−−
   0     1:1   1/2   (方形波出力)
   1     1:3   1/4
   2     1:7   1/8
   3     1:15   1/16
   4     1:31   1/32
   5     1:63   1/64
   6     1:127  1/128
   7     1:255  1/256
   8     1:511  1/512
   9     1:1023  1/1024 (最小クロック幅)


■制御プログラム

・タイマー0
 ATtiny2313には二つのタイマー回路が入っています。今回の発振器では、8ビットのタイマー0を使って基準クロックを作っています。CTCモードにしてPB2をトグル出力し、これをPD5につなぎ、タイマー1のクロック入力とします。
 クロック設定デジタル・スイッチとタイマー0の関係を以下に示します。

  ●クロック設定デジタル・スイッチとタイマー0の設定

  デジタル クロック プリ    タイマー0 タイマー0   タイマー1
  スイッチ  設定  スケーラ  分周値  出力周波数  10倍処理
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
    0    1μS   1/1     1/1    2MHz     ×1
    1    10μS   1/1     1/1    2MHz     ×10
    2    100μS  1/1     1/10   200kHz    ×10
    3    1mS    1/1     1/100   20kHz     ×10
    4    10mS   1/8     1/250   2kHz     ×10

 プリスケーラは1/1と1/8を切り替えています。トグル出力なので出力周波数は分周値の1/2になります。1μSの設定では2MHzを出力しますが、10μS以上のクロック設定では10倍したクロック周波数を出力します。

・タイマー1
 タイマー1はPWMモードを使ってデューティーサイクルを変えています。16ビットタイマーですので、3桁の周期設定なら余裕を持って処理できます。
 タイマー0の出力として必要クロックの2倍の周波数を出力しているので、まず最初に周期設定デジタル・スイッチの値を2倍します。
 そして、1μS以外の基準クロック設定では周期設定デジタル・スイッチの値を10倍した値を使います。例えば、10μSクロックで「123」と周期を設定した場合は「2460」を設定します。これで、周期設定の値が小さくてもデューティ比の設定に合った細い出力パルスが得られます。
 デューティーは、周期の1/2計算を繰り返してPWM設定値を計算します。先に2倍しているので設定値が奇数でも余りが出ることはありません。デューティー1:1で「5μS」と設定した場合「2.5:2.5μS」でパルスが出ます。

・ウオッチドッグタイマー
 ウオッチドッグタイマーのリセット機能は使わず、タイマー割り込み源として利用しています。128kHz内部タイマーを1/2048した16mS周期で割り込みをかけて、デジタル・スイッチの順次読み出しとLED点滅処理を行なっています。

・アナログコンパレータ
 マイコン内部の基準電圧1.1V(typ)とアナログコンパレータを使って、電池電圧の低下を検出します。0.25秒サイクルでコンパレータの状態をチェックし、低ければLEDを点滅します。電池2本で運用するのでおよそ2V以下で警報が出るよう分圧抵抗を選んでいます。


■組み立て

 こういったツールの場合、必要なときすぐ使えるようにしておくというのが一番です。ですので、作りっぱなしで基板むき出しのままじゃなく、ケースに組み込んでおきましょう。使ったのはタカチのSGM135A(90×35×135mm)で、単3電池を2本装着できる電池ボックスが付いています。
 なお、パネル取り付け形デジタル・スイッチに関し、ダイオードがスイッチ側に付くと配線が楽になるのですが、小さいほうのスイッチは廃番になっています(オムロンA7MA-207)。
 今回の製作では手元に残っていたA7MA-206(ダイオード端子なし)を使い、基板側にダイオードを載せています。他社で類似品はあるのですが、入手に時間がかかかります。
  (IDEC DECN-031Dなど)


●波形

 オシロスコープで観測した出力波形を示します。
ch3は47Ωの抵抗を負荷にしたオープンドレイン出力です。
周波数が高いと波形がなまります。



■周期=11 CLK=1μS DUTY=0(1:1)
  (クリックで拡大↓)

  ch1:CMOS出力
  ch2:基準クロックパルス
  ch3:FET出力 47Ω負荷



■周期=3 CLK=10μS DUTY=1(1:3)
  (クリックで拡大↓)

  ch1:CMOS出力
  ch2:基準クロックパルス
  ch3:FET出力 47Ω負荷



■周期=3 CLK=100μS DUTY=4(1:31)
  (クリックで拡大↓)

  ch1:CMOS出力
  ch2:基準クロックパルス
  ch3:FET出力 47Ω負荷

 デューティ1:31の設定にしているにもかかわらず、オシロ画面の実測値は1.7%と表示されています。この理由を説明しておきましょう。
 クロック設定が100μSで周期設定が3ですので、300μS周期で出力パルスが出ています。この時、内部の基準クロックとして5μSを使っているので60発のパルスをカウントしています。
 そしてデューティ設定が1:31ですので、パルス数を1/32してPWM設定値を計算します。この計算には右シフト演算で1/2を繰り返す手法を使っているので、余りは切り捨てられてしまいます。このため60/32で最小の1パルスだけ出力がHになり、ディーティとして1:59(1.67%)という値が出てきているのです。周期設定が3と小さい値のために発生する現象で、設定値が大きくなると誤差は軽減されます。



■周期=101 CLK=100μS DUTY=8(1:511) Hパルスの拡大
  (クリックで拡大↓)

  ch1:CMOS出力
  ch2:基準クロックパルス
  ch3:FET出力 47Ω負荷

 デューティを1:511にしたときに出るパルスを拡大観測しています。



■周期=100 CLK=1mS DUTY=0(1:1)
     (デジタル・スイッチの読み出しサイクルを観測)
  (クリックで拡大↓)


  ch1:CMOS出力
  ch2:PB0 デジタル・スイッチ読み出し用ストローブパルス
  ch3:PB4  〃
  ch4:PD0 デジタル・スイッチデータ

 デジタル・スイッチの読み出しサイクルです。
ch2とch3はデジタルスイッチ列をダイナミックスキャンして読み出しているストローブパルスで、マイコンからの出力信号となります。
ch4はデジタルスイッチのデータ線で、ストローブ信号がLになったとき該当するスイッチの設定がポートに現れます。
それを順次入力します。データを読み出しているのはストローブ信号がL→Hに変化する直前です。
16mS割り込み5回で全桁のデータがそろいます。



●廃番になったデジタルスイッチ



左から今回使ったA7MA-206、A7MA207(この二種は廃番)。
右が現行品のA7BS-207で形状が大きい。
オムロン製で小形のはプリント基板用端子になっていて並列接続用ダイオードが取り付けられません。




◆質問やご意見はブログ:居酒屋ガレージ日記の関連記事にどうぞ。

・2005年09月09日 2相パルス発生器
・2005年12月26日 オムロンのデジタルスイッチが
・2010年01月29日 パルス発生器 …本機の記事



◆◆◆制御プログラム◆◆◆

※「src.lzh」ダウンロード : ソースファイルとマイコン書き込みデータ


◆Arduino UNOでLEDの駆動デューティを変えてみる

2018-10-24

ブログ 居酒屋ガレージ日記の記事、
「2018年10月24日:Arduino UNOでLEDの駆動デューティを変えてみる
の関連資料を置いておきます。

・回路図

・配線の様子





・制御スケッチ:Arduino UNOでLEDの駆動デューティを変えてみる
     ※led_dynamic_pwm.zip

#ARD
#ARD_SK