電音の工場ブログ

趣味の電子工作を中心としたブログです.音モノの工作が多いです.

PWMのときの注意

PWMのときの注意

もあさんのサイトのこのあたりで調べモノをしていたところ、もあさんのブログで、

掲示板で質問のあったPepperのアナログ出力問題をオシロで調べてみた。

出力を0にしても、うっすらLEDが点灯するというもの。確かに、0の場合も「ひげ」が出ている。no title

なる記載を見つけた(今頃)。

私も同じ問題に当たったことがあるなぁ、と調べてコメントしようとしたらコメントを書けなかったのでこちらで(トラックバックを送らないと気づいてもらえないかも?)。

その昔CV発生冶具を作ったら、値ゼロが綺麗に出なかったので直したという一件がそれです。

id:Chuck:20060102#p1 で披露したCV発生冶具だが、ゼロが綺麗に出ていないのが気になっていた。

よくよくAVRのデータシートを見直すと、9bit PWMで値ゼロというときには 1/512 のパルスが出ていることになっているようだった。これでは完全なゼロになっていない。

これを回避するにはPWMの反転出力を使えばよいとわかった。値ゼロを出したいときにはPWMの値に511を指定すれば、512/512 の波形の反転が出てゼロとなるというわけ。 はてなグループの終了日を2020年1月31日(金)に決定しました - はてなグループ日記 - 機能変更、お知らせなど

ということで仕様のようですよ。

「出力ゼロでうっすらLED点灯」に対処するには、極性反転が良さそうです。

ちょっと、まてよ…

凶エフェセミナ直前に、

そうだ、以前analogさんから指摘していただいたいた、MIDI2CVのバグを修正せねば、と修正してビルドしたらコード領域が117%に。すでにサイズ最適化オプション付き。これじゃ入らない。WinAVRの版が変わってライブラリがでかくなったのか? takedaさんの案を入れて演算を減らしたり必須でない初期化をやめたりしてコード量の削減に努めた…(以下略) はてなグループの終了日を2020年1月31日(金)に決定しました - はてなグループ日記 - 機能変更、お知らせなど

こんなことをやったような…

その中の、

そいえば、こないだ気がついたんですが、pwmの初期化のところ、

TCCR0A = (1<TCCR1A = (1<として、COM0A0を立てないとpwmの位相を反転させることができて、出力のマクロを

#define CVCALC(X) X<<2

とシンプルに書けます。takedaさんの案

値ゼロをきちんとゼロで出すためにはこれはmergeしちゃいけなかったのだ、と今更ながらに気が付いた。コメントをいただいたときは自分でも無駄をしているなぁとさっくり同意したのだけれど、(私の忘れていた)意図があったらしい。忘れていては仕方ないのでこうやってブログにメモを残すの図。

自分の書いたプログラムも半年経ったら他人のもの、とはよく言ったものだと思った。