ロジックICでPWMしてみた(その1)

 ロジックICで遊ぼうシリーズ!ということで前回はSPIしたけど今回はPWM。え?マイコンでよくね?仰る通りなんだけどそれじゃあつまんないし、オペアンプとコンパレータでアナログなPWMをして遊んでるのはまあまあ見るけど、意外とデジタルなPWMを自作して遊んでるのはあんまり見ない気がするので遊んでみる。

構想

 まずは設計というほどじゃなくて妄想の整理というかコンセプト決めみたいなのをする。ここがぶれると回路の森で迷子になるので気を付けたい。コンセプトは「なるべく簡単にPWM波形を出す」ということにする。そうすると三角波は面倒なので鋸波でいいや*1、とか、ビット幅は4か8でいいや*2、とか、周期設定レジスタは無くてもいいや*3、とかどんどん決まってくる。

 図1みたいなイメージ図が書けたら具体的な設計に移れる。 デジタル回路の本を読むと、非同期設計と同期設計てのがあって、非同期設計は回路規模は小さくて済むけどヒゲ(ハザード)とかに気を付けるのがめんどいから、大規模な回路を作るなら同期設計だよね的な事が書いてある。折角?なので両方作って遊んでみる。

f:id:TEFSOM:20200831222958p:plain

Fig. 1. PWM波形
非同期設計

  とりあえず図1を見ていると、適当にカウンタで緑のカウント値を作って、紫の出力を作るためにラッチを置いておいて、カウント値が0のときにラッチをセットして、カウント値と赤の比較値をコンパレータで比較しておいて等しくなったらラッチをリセットすれば(とりあえずは)良さそうだと分かる。

 という訳で適当に使うIC達を選びつつ*4ざっくりしたブロック図(図2)を書いて、実際の回路図(図3)にする。

f:id:TEFSOM:20200831232403p:plain

Fig. 2. 手抜き非同期設計PWM回路

f:id:TEFSOM:20200831225313p:plain

Fig. 3. 非同期設計の回路図

  一見謎なNOT(4040のRSTの直前の)とRCのローパスフィルタ(LPF)が入っている理由を一応説明しておく*5。非同期設計が面倒な理由でもある。

 まずLPFがなぜ入っているかというとヒゲ除去のため。ヒゲってのはどういうときに生えてくるかというと、例えば、バイナリカウンタみたいに一度に複数のbitが変化する値を入力を使ったり、コンパレータみたいにカルノー図で1の塊が全部陸続きになってない組み合わせ回路を使ったり、とか。バリバリに該当するので74HC688の出力にはたまにヒゲが生えることが予想されて、実際にヒゲが生えること*6と、このLPFで除毛できること*7は確認した*8*9

 あと4040のRSTの直前のNOTは先にSRラッチをセットして後から4040をクリアするための時間差を作るという目論見。これを無しにして4040のQ9を直接RSTにつなぐと、試してないけどもしかしたらラッチがセットされるより先に4040がリセットされて出力ラッチが永遠にセットされないかも。

 という訳で実際に作って遊んだのを貼っておく*10

 長くなったので同期設計でも遊んだんだけど次の記事に。

 

 

*1:三角波にしたいならアップダウンカウンタとT-FFがあれば作れるので74HC191と74HC73とかでできる

*2:ほんとは16か32くらい欲しいけど実用する訳ではなくて遊ぶだけなので要らない

*3:これも周波数を変えるには要るけど遊びなら不要

*4:とりあえず手抜きでいいから8bitは欲しいなと思って入手性が良さげな中から選んだ

*5:そういやNOTとLPFを入れて動くことは確かめたけど入れないと誤動作することは確かめてないのでもしかしたら無くても動くかもしれない

*6:https://twitter.com/Si_SJ_MOSFET/status/1294618247950524416

*7:https://twitter.com/Si_SJ_MOSFET/status/1294619785397800960

*8:どちらのオシロ画像も確か数秒間の波形を重ね書きしてて、最初は何か所か10nsくらいのヒゲが生えて戻る所があるけど、除毛後は波形がなまるけどヒゲが無いのがわかる

*9:LPFの定数は部品箱に転がってた小さいのという理由で勝手に決まった

*10:何をしてるかというと比較値を0x01→0x03→0x07...としてる訳だけど見せ方下手くそだな