ぽんず製造所

御アクセスありがとうございます。当ブログの閲覧にあたりまして「当ブログについて」の内容に同意したものとします。

PICマイコン

PIC16F1705でWS2812Bを動かす

WS2812Bはシリアル通信で制御できるRGB LEDです。WS2812Bについての概要は他のサイト等でググってみてください
今回はPICマイコンでWS2812Bを動かす方法(?)を紹介しようと思います。

WS2812B系のLEDの何がめんどくさいって通信波形の生成ですよね。
少しググって調べた人ならわかると思うんですけど、信号の1パルスが1ビットの情報になっていて、このパルスの長さによって0か1かを表すというものです。
しかしこのパルスが1周期1~2us程度と、そのへんの8bitマイコンだと処理がギリギリです。C言語で書くと処理速度が遅くなってしまうのでアセンブラで書いてる人が多いみたいです。

自分がWS2812Bについて調べてる時、次のようなアプリケーションノートを見つけました。
PIC16F1509 の構成可能なロジックセル (CLC) を使った WS2811 LED ドライバ インターフェイスの作成(AN1606)(PDF)
PICマイコンは処理速度は速くないですが、周辺モジュールが豊富にあるので、これを使って信号を生成してみようというもの。
タイマー、SPI、PWM、CLCを使いLEDドライバを構成しています。CLCと言うのはロジック回路をマイコン内部に生成できるというものです。CPLDやFPGAの超小規模版といったところ。
このLEDドライバはSPIに表示させたいデータを入れるだけで信号を生成してくれるというすぐれものです。
SPIのSCK信号を長いパルスとして使用し、PWMで短いパルスを生成しています。これをCLCでSPIのSDOと合成して信号波形を生成しています。
SPIとPWMは同じタイマーを使っているので完全に同期させることができるようです。考えた人ホント頭いいですよね

もうほぼこれを参考にして(いやパクリ)作ってみました。
PICはアプリケーションノートのマイコンではなくPIC16F1705を使用しました。WS2812はとりあえず4つです。



使ってみた感想としては、モジュールの設定を済ませれば、あとはSPIにデータを入れるだけでいいので簡単に制御することができました。ただデータを送ったら次のデータを即座に用意しないと表示がおかしく(チカチカする)なってしまうので結局工夫してプログラム書かないとダメみたいですね。



ていうかこれやったのもう半年以上前だからよく覚えてないんだよなぁ...
本当はもうちょっとLEDドライバについて書く予定だったんだけどね、しょうがないね

100WLEDドライバー

私は自転車通学なのですが、最近日が落ちるのが早くなり、下校中など暗くて仕方ありません。田舎なので街頭がない場所もあります。向こうから無灯火のチャリが来てるのに直前まで気づかなくて危険だったりします。
そこで、それなりに明るい懐中電灯を作ろうと思います。
ついでに使う部品は家に眠っている部品のみとしますのでちょっとスペックが足りなかったりするところがあるかもしれません

まず光源となるLEDは、随分前に購入して放置されてた100Wのものを使います。

DSC_0498


どんな回路にするかを決めます。
今回は持ち運び式にしたいのでバッテリー駆動とします。
100WLEDを駆動するとなると、普通に抵抗で電流制限してしまうと抵抗の発熱が大きく、あまり効率もよろしくありませんし、バッテリーの持ちも悪くなります。
100WLEDはVF=35V程度あるので、バッテリーも35V以上用意すればいいのですがバッテリーの個数も増えてしまいサイズが大きくなってしまいます。
以上の点から、昇圧チョッパー式として、低電圧のバッテリーから高効率に駆動できるようにします。
それと、いままでチョッパを作ってたので回路や技術の流用ができるっていうのもあります。
バッテリー電圧は具体的には7.4~18V位を想定しています。


回路のブロック図(?)です

ブロック図

今回も制御にはマイコンを使用し、ほとんどがマイコン内で構成されてます。チョッパの制御も操作も全てマイコンで行います。
出力可変をしたいので今回はPWM方式とし、マイコン内のPWMモジュールで波形を生成します。
チョッパ部分が2セットありますが、MOSFETを交互(正確には180度ずらした波形)にスイッチングします。これはインターリーブ式と言って、リプル率が抑えられたり、小型化できたりします。
PWM波形(1相)をCOGというモジュールに入力してやると180度ずらした2相の波形を出力してくれます。
LEDの電流とコイル電流はシャント抵抗で検出します。以前チョッパを制作した時、配線抵抗の影響を受けることがわかったのと、LED電流はGNDから浮いているので、オペアンプ(OPA)は差動増幅にしてみました。GND基準で値を取得できます。
その他、LED電圧のフィードバックや電源電圧の測定用に分圧回路を設けてあります。
COGのAuto-Shutdown Controlという機能を使って、LED電圧が一定以上、またはコイル電流が一定以上になると即座にスイッチングが停止するようになっています。(プログラムで測定・計算すると反応が遅くなってしまう可能性があるため)
操作はタクトスイッチとLCDで行うことにしました。

ダラダラと書いておりましたがだいたいこんな感じです。
そういえば、LEDに電流制限抵抗が付いていないので???ってなる方もいるかもしれませんが、原理的に出力電圧はLEDのVF以上には上昇しないようになっていて、代わりに流れる電流が増えます。チョッパの出力以上には電流は流れないので、PWMのデューティー比を調整することで出力を変えるができます。
このお陰で電流制限抵抗が不要で効率良く点灯させることができます。


チョッパに使うインダクタですが、某店でこんなインダクタが。

DSC_0500

エッジワイズコイルでとてもぱわみがありますね
実はこれを入手したのも製作動機の50%あったりします

スイッチング素子部分はIRFB3607とショットキーバリアダイオード(2素子入り)です
ダイオードのスペックが足りない気がするけど家にある部品縛りなので...

DSC_0489


基板完成

DSC_0503

裏面にはインダクタと平滑用コンデンサが載っていて大電流が流れる部分はIV1.6mmで配線されています
(これは製作途中の写真)

myhome

ベース基板とLCDの乗ってる基板は分離できるようになっています。
LCDは秋月のI2Cのアレ(バックライト付き) それとタクトスイッチが2つ付いています。
基板右上が欠けているのは家にある部品縛りのせいです。LCDの保護フィルムは完成したら剥がしますよ

DSC_0511

LCD基板の下にはPIC16F1709とゲートドライブICのIR4427が載っています
IR4427は中に2回路入っているので今回のような回路には使いやすいですね そして安くて電流も結構流せる

DSC_0508

LEDはとりあえず秋月ヒートシンクにつけてみました。 

DSC_0513

実際に動かしてみた時の動画です


ちょっと明るさがわかりにくいかも

LCDの1行目は実際の出力、2行目がバッテリーの電圧になっています。
いまのところ1W~100Wまで設定することができます。 1~10Wは1W刻み、10~30Wは5W刻み、それ以上は10W刻みで設定できます(このあともプログラムを変えると思うので今のとはちょっと変わるかもしれません)
出力制御の仕組みは単純で、出力を設定する→LED電流と電圧を測定する→出力が設定した値よりも低かったらPWMデューティー比を大きくし、大きかったら低くする、といったふうになっています。

100W連続動作させてみましたが、MOSFETたちはギリギリずっと触っていられるくらいの温度でちょっと熱いです(計算上3~4W程度の発熱(多分))
LED本体は100W全て消費しているので熱いのは予想できてましたが、流石に秋月ヒートシンクは無謀でした。強めのファンで放熱してやっと触れる程度になります。

これは例の2相PWMのテスト時の波形動画です。ちょうど半分ずれていると思います。このおかげで小型で低損失にできるってことですね。10bit分解能があるのでなかなか細かい出力設定ができるようです。
 



保護機能が動作したときはすぐに発振が止まるようになっています。
出力電圧の過電圧保護が動作した時の波形

183


コイル電流の過電流保護が動作した時の波形(黄色が電流)

544

といった感じでそれぞれうまく動作しているようですが、高出力時に誤作動してしまうことがわかりました。
おそらくノイズで誤作動してるようですが、もうなんかめんどくさくなったし、プログラムでも保護掛けてるし、もういいかなぁ~~ーってなって、結局保護機能はなくしました......まぁまだ一度も部品壊れてないしいいでしょ
なのでシャント抵抗を外そうか検討中...意外と発熱あるんだよね


ちょっとプログラムを変えて遊んでみた。じわっと光ってじわっと消えるやつです。



ということで基板は完成しました。あとは筐体も作らなければいけませんが基板作って満足しちゃってる感。完成はいつになるのやら 



~最近の秋月彼岸花の様子~
花は咲かずに草生えてます。草生える 

DSC_0480

リモコンを作った

部屋の電気はリモコンで点けたり消したりできるタイプで
普段は枕元にリモコンを置いといて寝る前に消すようにしてけど、机に向かってる時に電気を操作したいことが結構あって、いちいち枕元までリモコンを取りに行くのがめんどくさい
そんなわけで机においておくリモコンを作ろうと思います

リモコンには点灯/消灯以外に明るさ調節や常夜灯などのボタンがあるけど点灯/消灯以外はあまり使わないので点灯/消灯に絞って作ることにします


リモコンから送信される信号はこんな感じ

DS1Z_QuickPrint41

データ解析とかめんどいことはやりたくないのでこのデータをCSV形式で保存

csv

テキトーなスクリプトを書いて自動で(笑)プログラム生成
CSVからH/Lを判断してdelayとか入れてるだけです

無題

この作業を点灯/消灯の2回分やります

生成されたのをコピペして
あとは普通にプログラム書いていきます
マイコンは手元にあったPIC12F1501

mplabx

また赤外線LEDは38kHzで変調しなければいけないので、PWMモジュールで38kHzの波形を生成、CLC(マイコン内部にロジック回路が作れる機能)でデータと合成して出力します。
CLCはプログラム入力(?)がないようなのでコンパレータの出力を入力としてコンパレータの出力を反転させたりすることで擬似的にプログラムから入力しています。
今気づいたけどCLCなんて使わずにPWMをON/OFFするだけでよかったのでは...

実験風景
実験中、正常動作しているはずなのにうまくいかないということがありましたが、単にLEDの光が弱すぎたようです。
調べてみると赤外線LEDの場合は普通数百mA~1Aほど流して輝度を上げてるようです。ぱるすだからいけるってはっきりわかんdね

KKgLJe

数百mA流すにはマイコンの出力では非力なので手元にあった2SK2961で赤外線LEDをドライブ
ちなみに赤外線LEDはジャンク袋に入ってた詳細不明品
んで500mAくらい流したら普通に動作してくれました。
あとLEDは2シリです


実験もうまくいったのでテキトーに基板を作る

CIMG0008

テキトーすぎて1列ミスった
電池ボックスがなかったので電源はUSBにしました

いいですね



残念なところはボタンがタクトスイッチなところかなー押しにくい気がするまぁいいけど
あとボタンの色と電気の点灯消灯が逆じゃねまぁいいけど

くっそテキトーな工作だったけど、珍しく実用的なものができた
これでPCに張り付いたまま電気点けたり消したりできるね(ニート感) 

【コイルガン向け】キャパシタチャージャー用昇圧チョッパ⑦

前回理由説明するとか言ってたけどめんどくさいからやーめた
とりあえずプログラムでPWMではなくPFM方式での動作が可能になって安定性が高まりました。
マイコンのPWMモジュールのPWM生成の方法についてよく調べたらPFMも可能ということがわかりましたので

出力電圧を読み、それにあった信号をマイコン内のPWMモジュールで作る利点としては、完全に他励式なので電流検出回路がいらないことや発振が安定することなどです
電流検出については、その分の実装面積分をなくしたり、シャント抵抗分の発熱がなくなったり、シャント抵抗のせいでGNDが浮いてしまうなんてことが無かったり、それなりに良いっちゃ良いですが電流検出はあったほうが安心かもしれないですね過電流防止とか用に
以前のようにコンパレータとRSFFでやるものはたまーーーーに発振がンンッ?ってなることがあったけどPWMモジュにやらせればこんなことはないですね、MOSFETくんも気持ちよさそうです。


そんなこんなでまたチョッパ作りました。
このチョッパは300W出力で設計してみました。サイズはそのまま出力1.5倍です。
測定用にシャント抵抗がついてますがいずれ外す予定です

CIMG0113

前はでっかいコイル1つでしたが小さいの4つに分散させました。

制御基板
マイコンとゲートドライブICが乗ってます

CIMG0108


ベース基板
コイルや電圧フィードバック、レギュレータなどが乗ってます
この基板には小型化のために0.3mm基板を使ってみましたが薄すぎてこの用途には強度がたりなかった...マイコン工作とかではいいかもしれないです。

CIMG0109


ぱわーなところ
MOSFETとかダイオードとかがあります
コイルを4つにしたのでMOSFETやダイオードも4つになってます(ダイオードは二素子入り)
MOSFETは最近秋月に出たスペックの良いやつを使ってます。 値段もぶったまげるくらい安いのが秋月の魅力ですよね。

CIMG0112

ヒートシンクにTO-247素子が埋め尽くされてるの頭おかしい。

それでコイルとコイルの間にネジを通してしかもダイオードの固定と基板の固定を一緒にするというマジキチっぷり
制御基板の裏の空白部分に多回転半固定抵抗とかパスコンをつけたりしたのでかなり密度が高くなってます。
多回転半固定抵抗もコイルの間から回します...

CIMG0114


LEDを何となくいっぱいつけたらなんかいい感じになりました。見た目が。

myhome


このチョッパの特徴としてはこういうこと

DS1Z_QuickPrint21


今使ってる電源が240Wなので設計出力300Wは出せません(電源装置では150Wの出力を確認)
ということで電源をリポに変えてみて、300Wフル出力させてみました。

3750uFのコンデンサを充電した時の電圧波形

DS1Z_QuickPrint24

3750uFを316V充電したので約187J
これを400msで充電してるので187 / 0.4で 出力約460W....!?
と、いい意味でも悪い意味でもちょっとよくわからない出力がでてくれました...
目標出力を遥かに上回っていて嬉しいのですが、さすがに出力出過ぎ。電源がリポなのでこんなに電流流すと爆発しそうで恐ろしいです。
やはり電流制限用にシャント抵抗等をつけたほうが良かったかも知れないです。
本気出せば450W以上出せることがわかりましたが、ここまで来ると出力をわざと落としたほうが良さそうです。

というか300W出力で設定したのにこの出力が出るっていうのがよくわからないわけ
おそらくインダクタの飽和等でインダクタンスが変化し電流がガバガバ流れるようになった説が濃厚です。
詳しく調べようとしてもリポ怖い&ヒューズ切れるで動作時間が極端に短いので実験回数も少なくデータがあまり取れていません。本当に460Wも出てるのかもよくわかりません。いや出てるんだけど...


最後に本番と同じ7500uFの充電した時

DS1Z_QuickPrint28

320Vまで900msで充電してるので出力は420Wほどに落ちています。おそらく電池が減ってきただけだと思います。

新チョッパはまだまだ不安定ですがなんとか動いてくれました。調節や出力リミットなどをつけて安定化していきたいと思います。



おまけ:歴代の昇圧チョッパ
出力や効率だけで見るとどんどん高性能化していってますが、大きさや安定性など総合的に見ると真ん中のが一番良かったかもしれないです(そもそも今回のはまだ開発中ですが)

CIMG0116

【コイルガン向け】キャパシタチャージャー用昇圧チョッパ⑥

またチョッパを思いついたというか、作ってみたかったというか、やりたいことがあったのでその事前実験というかをやってみました。
キャパシタチャージャー用昇圧チョッパ①~⑤では全てPFMという方式で動作させていました。
今回はこれをPWM方式で動作させることにします。理由は次回

新たに基板を作るのがめんどくさいので⑤で作った奴をプログラムだけ変更してPWMで動作させることにします。
普通なら出力電圧は一定でいいのですが、キャパシタチャージャー用は出力電圧が変動します。なのでDT比も出力電圧によって変えなければいけません。
DT比は 1-(入力電圧/出力電圧)*100[%] でいいみたいです(テキトーにググっただけ)
プログラムとしてはADCで現在の出力電圧を読む、上記式を計算する、PWMモジュールにその値を入れるといった感じです。ADCは測定誤差が小さくなるように50回読んで平均させてます。このせいで次回DT比更新まで2msくらいかかっちゃってますがまぁ問題無いでしょう。
PWM周波数はマイコン的に一番やりやすかった7.8125kHzにしました。
また、出力電圧によってDT比が変わるということはコイルのピーク電流値が変わるということなので、出力電圧が低い時はコイル電流が小さく高い時には大きくなるはずです。これも実際に見てみましょう。

動作風景



PWMなのでちゃんと音の周波数が一定ですね


3750uFのコンデンサを充電した時の波形です
黄色:コイル電流
水色:MOSFETゲート電圧
ピンク:出力電圧

充電全期間
黄色がひどいことになってるのは無視して

DS1Z_QuickPrint14

336Vを1.052秒で充電してるので出力は約200Wです。適当にやった割には結構出ますね
でますよ

拡大
充電初期

DS1Z_QuickPrint16


充電中期

DS1Z_QuickPrint15

充電後期

DS1Z_QuickPrint17

周波数は変わらずにデューティー比だけが変わってる様子がわかりますね。 
それと予想通り出力電圧が高くなるとコイル電流が増えてるようです。
コイル電流の変動がよく分かる画像

DS1Z_QuickPrint18

コイル電流、充電初期はピーク7A程度ですが後期になるともう30A程度流れちゃってますね...コイル飽和しまくりっすね
デューティー比が上がるとコイル電流が増えちゃうのは方ないことなのでD比制限を掛けてもいいかもしれないです(出力は落ちると思いますが)
また今は全期間が臨海モードでの動作ですが、初期だけ連続モードで後期に臨海モードに切り替えるなどすれば出力の変動が抑えられるかもしれません。
こういうところを見るとPFM動作は電流値や出力電力が変動しないのがいいところかな―とか思ったりします(???)
記事書いてて思ったけどPFMなPWMできるんじゃね?と思った(?)

ちなみにDT可変の様子
速くて見難いかもしれないけど 

 

まぁこんなんやね
今のところ順調です。 
Twitter
大体Twitterいます。
Youtube
Youtubeチャンネルです。実験動画等上げています。よろしければチャンネル登録お願いします。
最新コメント