2021年12月29日

STM32でシリアルアブソリュートエンコーダと通信しよう(ニコン A-format用)

大昔のACサーボモータはインクリメンタルエンコーダが搭載されていて、A相B相Z相U相V相W相が
ラインドライバで出力されていたので大変扱いやすかったのですが、最近のACサーボモータって
ほとんどRS-485通信のアブソリュートエンコーダなんですよね。
つまりはシリアル通信をしないとエンコーダの位置データを取り出すことができないのですが、
そのシリアル通信フォーマットにもいろいろあり(EnDat、BiSS、SSI、HIPERFACE、三菱、安川、多摩川など)、
これらの仕様が分からないとどうしようもないわけです。

ただ、ニコンのA-formatだけはたまたまネット上に通信フォーマットが転がっていました。
(A-format [yuqlid wiki])
そこで、この資料を参考にSTM32F103C8T6でアブソリュートエンコーダと通信するコードを書いてみたのですが、
結構苦戦?したためブログ記事にしてみました。

まずA-formatのタイミング仕様は、RS-232みたいないわゆる調歩同期シリアル通信です。
ただ一般的な調歩同期シリアルと決定的に異なる点がいくつかあります。
下記にA-formatの仕様を示します。
A-format_specification
ちなみにコマンドデータフレームはこんな感じです。
A-format_CDF

皆さんお気づきでしょうか、実はこれマイコンのUSARTペリフェラルが使えないんですね・・・
F103C8のUSART1はデータ長を18bitに設定することができません。
さらに通信速度も2.5Mbpsもしくは4Mbpsと高速なため、Arduinoでおなじみのソフトウェアシリアル
のように割り込みで処理していたのでは間に合いません。
そんな時に便利なのがDMAです。
何らかのペリフェラル等からDMAリクエストが発行されると、CPUの介在なしにメモリ上のデータをレジスタに転送したり、
逆にレジスタの値をメモリに転送したり、メモリ間でデータを転送したりできます。
下図にDMAでUARTを実装する際の構成図を示します。
構成図
TIM1は繰り返しカウンタレジスタを使用し、Nパルスモードとして動作させます。
毎パルスごとにアウトプットコンペアDMAリクエストを生成し、送信バッファからPORTAの
出力データレジスタへデータを転送します。こうすることでUARTデータ送信を実現しています。

UARTデータ送信ののち、すぐUARTデータを受信できるようTIM1がNパルス出力完了時、
アップデートイベントトリガを発生させスレーブトリガモードに設定したTIM2のカウンタをスタートさせます。

TIM2は単パルスモードで動作させ、調歩同期シリアルの受信データの立上り、立下りエッジでインプットキャプチャします。

TIM2でインプットキャプチャが発生するたびDMAリクエストを生成し、キャプチャレジスタのデータを
受信バッファに転送します。こうすることでUARTデータ受信を実現しています。

こちらにCubeMXのプロジェクトファイル一式を置いておりますので、ダウンロードしてご利用ください。
A-format_F103C8_v1

CubeMXの設定や実装なんかはプロジェクトファイルの中身を見ていただくとして、
最後に実際の通信波形をお見せします。
通信波形
RS-485通信は半二重通信のため、まずDE_/REをHIGHにしてマイコンを送信側に設定します。
続いてエンコーダの位置データを要求するためにCDF0を送信します。
次にDE_/REをHIGHにしてマイコンを受信側に設定します。
するとIF,DF0,DF1,DF2が返ってきます。
とまぁこんな感じです。
より詳細は通信フォーマットのPDFをご参照ください。

wata_net at 02:49コメント(0) この記事をクリップ!

2021年10月24日

LEDパネルコントローラ 従来比2.8倍の高速化を達成!

相変わらずより高性能を求め、HUB75なLEDパネルのコントローラを作り続けております。
大画面・高画質・高リフレッシュレート・高輝度に対する探究心は留まることを知らず、いろいろと試行錯誤をしておりました。
その甲斐あって新型は従来のF730R8版(高性能版)LEDパネルコントローラより、総画素数は1.5倍、リフレッシュレートは2.8倍、PWM分解能は1.25倍を達成しました。

それがこちら、H730VB版LEDパネルコントローラです。
01

256*128ピクセル、PWM分解能8bit時の最高リフレッシュレート比較です。
0506
新型が202.9RPS、従来品が69.7RPSですのでおよそ2.9倍高速化しているということになります。
新型は200RPSを超えているためちらつきは全く感じませんが、従来品は70RPSを下回っており少しちらつきが気になります。

256*128ピクセル、PWM分解能12bit時の最高リフレッシュレート比較です。
0708
新型が144.9RPS、従来品が51.1RPSですのでおよそ2.8倍高速化しています。
新型の素晴らしいのは、12bitPWMでも144RPSをたたき出している点にあります。
12bitPWMでガンマ補正2.2であれば1543万色を表現できます。これはRGB24の1677万色にかなり近く、PCモニタと遜色ない画質を再現できるということです。
実はこれは従来品でも可能でした。しかし従来品の場合、上記画像のようにリフレッシュレートが51.1RPSまで低下します。51.1RPSというのはちらつきが酷く正直あまり実用的ではありません。
この場合従来品ではLEDパネルコントローラを2つ使用し、1つ辺りの画素数を減らすことでリフレッシュレートを維持する必要がありました。
しかし新型ではこれを1つで達成できるのです。大画面・高画質・高リフレッシュレートをすべて実現できます。


これほどの高速化を達成できたのは、主に以下3つの変更によるものです。

STM32H730VBT6の採用
02
当たり前ですが、使用しているマイコンを高速なものに変えればより高速化できます。
そこまでするならFPGAを使えという話もあるのですが、何より私がVHDLが書けないのと外部DRAMを備えた基板を設計できる自信もないってことで市場最速といわれるマイコンを採用するに至りました。
それに市場最速を謳っておきながらバリューラインという位置づけのH730VB、実は1個800円程度と結構安価に入手できました・・・世界的な半導体不足に陥る前までは。
多分FPGA+DRAMよりは安価だったのではと思います。半導体不足で全く手に入らなくなってしまったのですが、それは多分FPGAも同じですよね!?
従来まで使用していたF730R8のクロックが216MHz、H730VBは550MHzとおよそ2.5倍クロック周波数が高速化していますが(実際のところちょっとオーバークロックしていますが)、リフレッシュレートは2.8倍高速化しております。
その理由は下記2つになります。

▲泪ぅ灰鵑IO割付の最適化
04
同じタイミングで変化すべき信号は同じポートにまとめるよう、IO割付を変更しました。
もしポートがバラバラだった場合、同じタイミングで変化すべき信号なのに出力データレジスタの書き込みが複数回発生し、それが速度低下の原因となっていました。
1回1回は本当にわずかな差ですが、画素数・RGBの3色・PWM分解能の要素がすべて掛け算でのしかかかってくるため、ちりつも効果で最終的なリフレッシュレートではかなり大きな差になります。
また別の効能として、従来では出力データレジスタの書き込みが複数回発生するために同じタイミングで変化してほしい信号が少し異なるタイミングで変化しており、タイミング合わせのウェイトを入れざるを得なかったのですが、新型はそれがなくなりさらに高速化に寄与しています。

クロック信号生成回路の採用
これも△隼たような原理ですが、従来はクロック生成まですべてマイコン側でやっていました。
09
上図のタイミングチャートで、CLKが従来タイプのクロック信号、MCUCLKが新タイプのクロック信号の元になる信号、CLKOUTがクロック信号生成回路の出力信号になります。
従来タイプでは、赤線に加えて青線のタイミングでも出力データレジスタの書き換えが発生します。新タイプではデータレジスタの書き換えが赤線のタイミングのみで発生するため、単純に半減できます。
その信号を元にハードウェアでCLKOUTの信号を生成することでかなり高速化できました。
回路的には単純な両エッジ検出回路です。
03
実際の波形がこちらです。
あまり綺麗ではないのはオシロプローブのGNDクリップを使っているためです。
10
デューティ比が50%でないのは意図的なものです。実際にLEDパネルに接続し、正しく表示できるパルス幅に調整した結果このようなデューティ比になりました。
この手法も△汎瑛諭▲ロックのパルス幅を確保するためのウェイトを無くせたためより高速化に寄与しています。

上記のように色々と変更点はありますが、通信仕様は従来品と互換性があるためポン付けで置き換え可能にしてあります。


そのような感じで、従来品よりかなり高速なLEDパネルコントローラを作ることができたためいつか販売したいと思っています。
しかしドキュメントを作るのがめんどくさすぎるのと部品が全然手に入らないのでいつになるやらって感じです。

以上

wata_net at 00:43コメント(0) この記事をクリップ!

2021年01月30日

最近作ったもの

最近作ったものをまとめて紹介します。
主にLEDパネル関係ばかりなんですが、そうでないものも多少はあります。


1. P3、256×128ピクセル高輝度LEDディスプレイ
屋外用の3mmピッチ、64×64ピクセルのLEDパネルを8枚使用した高輝度LEDディスプレイを構築しました。
フレームは黒色のアルミフレームで、LEDパネル前面に保護用のアクリルパネルを取り付けています。
DSC_1175DSC_1174
でかいし明るいしサイコー。最高輝度時全部白だと40Aくらい消費しています。えげつない。


2. PCの画面を無線でLEDパネルに表示させるやつ
ESP32とらびやん氏のScreenShotReceiverを使用して、PCの画面を無線でLEDパネルに表示させる奴を作りました。
大体27FPSくらい出ています。多分頑張れば2倍くらいの速度は出せるんじゃないかと思います。
というのもDMA転送をしているのにDMA転送中は何もしないという大変非効率なプログラムになっているためです。
DSC_1653-1DSC_1902
LEDパネルでマイクラもプレイできてしまいます。若干カクカクしてはおりますが、なかなか良い感じです。



3. HUB75インタフェースなドットマトリクスLEDドライバ基板
普通のドットマトリクスLEDをHUB75インターフェースにできるLEDドライバ基板です。
普通のLEDパネルと似たような回路になっており、最大32×16ピクセルのLEDパネルが構築できます。HUB75インタフェースなので当然LEDパネルコントローラで制御できますし、複数数珠繋ぎにして拡張させることもできます。
わずか32×16ピクセルとはいえ、はんだ付け大変でした・・・
もうやりたくないという感想があります。
DSC_1598DSC_1600ドットマトリクスLEDドライバ
回路図はこちらになります。
マトリクスLEDドライバ


4. LEDパネルな時計
そういえば時計をちゃんと作ったことなかったなと思ったので作りました。
ESP8266を使用し、NTPサーバーに接続して自動的に時間合わせをしてくれます。
せっかくのフルカラーLEDパネルなので時間によって背景画像が変わるようにしてあります。
DSC_1901


5. 超小型定電流レーザードライバ
降圧タイプのものと昇降圧タイプのもの2種類を作りました。
とにかく小型化することに命を懸けてみました。
降圧タイプは17.94mm×7.78mm、昇降圧タイプは12.86mm×7.78mmとなっております。
小さすぎる&ICがDFNではんだ付け難しかったです。
それぞれ一長一短があります。
降圧タイプは最大2Aまで流せますが電流を可変できません。また基板外形が昇降圧タイプより少し大きめです。
昇降圧タイプはレーザーダイオードのVfと電源電圧が同じでも高くても低くても定電流動作をしてくれますし、半固定VRによって電流を可変することもできます。しかし最大1Aまでしか流せないのと、使用しているICが1個500円以上します。
DSC_1863DSC_1888DSC_1861
回路図を乗っけておきますのでどなたか作ってみては?
LDドライバ回路

wata_net at 21:38コメント(0) この記事をクリップ!

高性能版LEDパネルコントローラアップデート&販売開始のお知らせ

BOOTHでLEDパネルコントローラの販売を開始いたしました!
こちらから購入できます!
高性能版LEDパネルコントローラ



高性能版LEDパネルコントローラのハードウェアをアップデートいたしました。
主に製造の都合によるアップデートになります。
とにかく自分でQFPとかをはんだ付けするのがめんどくさすぎるので、PCBアセンブリサービスで製造できるように部品を片面実装にしたり、部品を変更したりしました。
部品配置最適化のためマイコンのIO割付も少し変更されておりますが、通常使用において意識する必要はありません。
高性能版LEDパネルコントローラ表_1


また前回からソフトウェアもアップデートされております。
変更点は以下になります。
(1)描画範囲指定方法が矩形範囲で指定できるようになりました。
(2)輝度調整方法にボリューム値とコマンド値の乗算が追加されました。
(3)外部から垂直同期信号を入力できるようになりました。
(4)64*64ピクセル(1/16スキャン)の屋外用LEDパネルに対応しました。
(5)LEDパネルテスト機能の表示パターン切り替え間隔が少し長くなりました。
(6)コマンド、データ受信やDC端子切り替えに必要な待機時間が変更されました。またRDY信号(元BUSY信号)がタイミングチャートに追加されました。
(7)一度に受信できるデータ容量が無制限になりました。(以前は最大21845ピクセルでした。)
(8)代わりに指定された描画範囲の1行が16 ピクセル未満の場合、データ受信速度が高速すぎると処理が間に合わず正しいデータが書き込まれない現象が発生するようになりました。その場合指定範囲1行分のデータを書き込む度に10us程度の待機時間を設ける必要があります。
(9)その他細かいバグ修正など

特に大きな変更点は描画範囲指定方法が矩形範囲で指定できるようになった点です。
これにより従来より直感的に描画範囲を指定できます。
描画範囲指定

また64×64ピクセルの屋外用LEDパネルに対応した点もあります。
これの何が素晴らしいかというと、屋内用とは比べ物にならない圧倒的輝度を得ることができます。屋外でも視認性ばっちりのクソ明るいLEDディスプレイを構築できるのです。
(ただし消費電力もえげつないですが。)
屋外用の特徴として、LED側は黒いコーキング材で防水されています(おかげでドット欠けの修理がドチャクソ難しい)。基板自体は緑色なので裏から見ると緑色の基板が見えます。
DSC_1866DSC_1867
DSC_1136

取扱説明書もアップデートされました。
以下にプレビュー版を置いておこうかと思ったのですが、なぜかSCRIBDにログインできないので以下URLからダウンロードをお願いいたします。
高性能版取扱説明書とサンプルプログラム

wata_net at 20:43コメント(2) この記事をクリップ!
プロフィール

wata

Recent Comments
記事検索
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード
  • ライブドアブログ