BLOG

PIC24 based DMX Receiver to 5PWM with CCS Compiler

これまで8bit PIC(PIC16FシリーズやPIC18Fシリーズ)を使ってDMX受信を行ってきたが、制御系を一新する意味で16bit PIC(24FJ64GA002)で設計し直すことにした。8bit PICと16bit PICでは異なる部分が多かったがなんとか移植に成功した。

一時期、ArduinoやmbedとTLC5940を使って実験してみたが、他人の作ったライブラリを自分仕様に合わせるなら、結局自分で開発したほうがベストだなと思った。特にArduinoのPWM周波数は高くても980Hz程度で、今回のPIC24では62.5kHzにしているので差がありすぎる。人間の目には1kHz以上にしておけば気がつかないようだが、Arduinoで複数のLEDを制御した時にちらついたのはPWM周波数が低いことが原因ではないかと思う。

今回のプログラムのDMX受信アルゴリズムはCCSのフォーラムで公開されていたmarkのプログラムを利用している。markのプログラムでは8bit PICの9bit受信モードを使って2個目のストップビットを無視する方法を取っているが、16bit PICでは2bitのストップビットを検出できるのでDMXの仕様である8bitモードのままで受信している。DMX信号をマイコンでどう受信するかについては電装工芸さんが詳しく記述しており、Microchipの公式アプリケーションノート「Using a PIC Microcontroller for DMX512 Communication」でもDMX送受信を扱っているので参考にしている。

コンパイラはCCSのPCD(公式サイト直販でコンパイラのみの場合250ドル)を利用。5つのLEDをハードウェアPWMで制御している。プログラム内のRx_Buffer配列を使えば512個のデータを処理できる。受信テスト用のDMX送信にはEnttec DMX USB Proを利用したが、0〜512CHを問題なく受信することができた。

下図は回路図(クリックして拡大)。

今回PIC24を使う際に感じたPIC18との違い。

<回路に関するもの>

・PIC24は内部では2.5Vで駆動しているが、内蔵レギュレータを使うことで3.3V駆動できる。その場合はVcapに10uFの電解コンデンサをかます。
・5Vトレラント可能なピンは限られているのでデータシートを確認(PIC24FJ64GA002ではRB6〜RB11)

<プログラムに関するもの> ※CCSコンパイラを使う前提

・PIC24では主発振子と副発振子の2つを接続できるので、HSモード(20MHz)の他に、PR(主発振子選択)が必要
・ボーレートを計算する時のFcyは外部発振子の半分になる。今回の回路では20MHzのクリスタルなので、Fcyは10MHzになる。DMX信号は250kbps、BRGH=1、BRG=9となる。(ボーレートの計算式はデータシート参照)
・DMX信号は、8bit、ノンパリティ、2bitストップビットであり、PIC18ではこの2bitストップビットが読めないために9bitモードで受信するか、8bit受信モードで受信して読めないストップビットをTimeBetweenFrameとして処理するしかなかったが、PIC24では2bitストップビットを読めるのでDMX仕様に合わせた受信を行うことができる。
・PIC18のSPENがPIC24ではなくなっている。UARTの許可はUARTENを使う。
・PIC18のCRENがPIC24ではなくなっている。PIC18ではオーバーランエラー時にCRENをクリアして受信バッファをクリアしていた(PIC18のOERRはリードオンリーでCRENのクリアに連動してOERRがクリアされる仕様)。PIC24ではOERRが読み込みとクリアもできるようになっているので、オーバーランエラーの場合はOERRそのものをクリアする。
・PIC18のRCIFの代替はURXDA。※U1RXIFは名前が似ているが用途が異なる。
・PIC24のUART受信割り込みが発生した場合はユーザがソフトウェア上でU1RXIFをクリアする必要がある。割り込み関数を使わずURXDAのみでプログラムを組んだ場合はこの限りではない。
・CCSコンパイラ上でPWMのデューティ値を変数として入力する場合、この変数がshort(int8)であるかint16であるかによってPWMの解像度が自動で変わる仕様になっている。shortの場合は256階調だが、int16では1024階調になる。今回は送信データが256階調のDMX信号を使うので、変数はshortにしている。

 

私の電子回路とプログラムの知識は全て独学なので、非効率的な所や必要ない命令が含まれているかもしれないが、ひとまず動作するので参考程度にしてください。

Leave a Reply

Your email address will not be published. Required fields are marked *