Arduino 3.3v(8Mhz)でUART115200bps通信ができない場合

組み込み
スポンサーリンク

監視装置などバッテリー駆動で長時間動作させる場合は消費電力を抑えることが重要となります。
一般的にはArduinoは5V駆動ですが3.3V駆動に下げることにより消費電力を下げることができます。
その場合は動作周波数が8Mhzに下がってしまうので処理が遅くなります。
この場合、UARTでの高速通信部分に影響が出ます。

8Mhzでの最高速度

ネット上に色々情報ありますが、8Mhzでは115200bps通信はエラー率が大きいので通信できないとまではいかないかもしれませんが送受信データが化けてしまう可能性があります。

AVR Baud Rate Tables

これはハードウェアの限界なのでどうやっても回避することができません。
その為、別途モジュールを購入して追加する必要があります。

SC16IS750 シリアル-I2C ピッチ変換済みモジュール

SWITCHSCIENCEが販売しているモジュールです。
I2C/SPI経由でデータを送受信する形になります。
使ってみた感想として、一部の機器で問題が起こりました。(全部かどうかまでは試していません)

この製品は12Mhzの水晶発振子を実装しています。
SC16IS750は以下の計算式でUART通信を行うための計算を行います。

divisor =( [水晶発振器の周波数]/prescaler)/ ([UARTボーレート] × 16)

prescalerは「1」か「4」が使われます。
これで計算してみると以下のようになり整数の値になりません。

(12000000 / 1)/ (115200 × 16)= 6.5104・・・

水晶発振子の周波数を1k=1024にした場合でも同様になります。

(12582912 / 1)/ (115200 × 16)= 6.8266・・・

divisorは通常整数になります。
SC16IS750のArduinoモジュールを見ると「14745600(14Mhz)」「1843200(1.8Mhz)」「16000000(16Mhz)」の3種類があります。
計算すると以下のようになるので、115200bpsでのUART通信を行う場合は14Mhz/1.8Mhzの水晶発振子が搭載されているモジュールを使用する必要があります。

(14745600 / 1)/ (115200 × 16)= 8
(1843200 / 1)/ (115200 × 16)= 1
(16000000 / 1)/ (115200 × 16)= 8.6805・・・・

どんな製品があるのか?

さがしてみましたが、あまり見つかりませんでした。
製品の位置付けとしても結構ニッチな部類になるのかも・・・・

I2C-Uart変換基板
CJMCU-750

SWITCHSCIENCEで周波数変えた製品だ出してくれないかな・・・

コメント

タイトルとURLをコピーしました