2016年9月28日水曜日

STM32F1のEXTI

STM32F1のEXTI、所謂「ピン変化割り込み」を使う。
ちなみにEXTIは英語版のRM0008によると"External interrupt/event controller"という章で紹介されている。EXTernal Interruptの略と思われ。


EXTIで割り込みを使う手順としては
1. RCCの供給
2. GPIOの初期化
3. GPIOをEXTIに接続
4. EXTIの初期化
5. NVICの初期化
という感じになる。

僕が試した限りでは下記のコードで動作したが、もしかしたらAFIOのRCCを供給しないと動かないかも。

またハンドラ内では1回の割り込み毎にGPIOを反転させている。今回はパルスのソースにGPSのPPSを接続し、立ち上がりエッジのみを検出するので、LEDを0.5Hzで点滅させていることになる。

EXTIの割り込みハンドラは数字が若いうちはEXTI1本毎にハンドラが1個あるが、数字が増えるとEXTI10-15をまとめて1個のハンドラで、みたいな感じになっているので、GetITStatusの確認も省きたい!という超高精度が要求される場合は若いピンを使うこと。
またひとつのラインではひとつのGPIOしか設定できない。例えばGPIOA0とGPIOB0を同時にEXTIに接続することはできない。つまりSTM32F1でピン変化割り込みを使いたい場合、最大で16chまでとなる。

EXTIは割り込み以外にもイベントを発生させることができ、CPUがスリープに入った状態から復帰するトリガに使うこともできる。

他に、GPIO以外にも電源電圧やRTC等をEXTIのソースとして使用することができる。
更に、それ以外にもソフトウェアからEXTIをキックすることもできる。


STM32F1は自分が作りたい機能にカチッとハマると楽しいんだけど、パズルが複雑でフラストレーションが溜まるよね。


2016年9月26日月曜日

TLC5940の触り



とりあえず簡単なところだけ。

*必要なピン
データを与えるSCLK,SIN,XLATが必要。SCLKとSINはSPIのTxで可能。SOUTも接続すればTLC5940のステータスを読むことができる。
クロックを与えるGSCLK,BLANKが必要。GSCLKに4096個のパルスを与えると設定したデータに応じて最初のパルス数の間電流が流れる。
GSCLKのカウンタは自動的には初期化されないらしいので、BLANKでクリアする必要がある。

*ピンの処理
基本的にピンはプルダウン等で固定しておいたほうが良い。例えばマイコンがリセット状態の時はハイインピーダンスとなるので、ちょっとしたノイズで誤動作する場合がある。
誤動作するとLEDが常に点灯になる場合がある。PWMしか使わない前提で電流を多めに流している場合(PWM10%時の電流値等の設定の場合)はLEDが損傷する可能性がある。
SCLKを固定してデータを受け取らないようにすること、GSCLKを固定してパルスが入力されなようにすること、BLANKを固定してハイインピーダンス時は電流を流さないようにすること、等。

*電流の違うLED
フルカラーLEDを駆動したい場合など、電流値が違うLEDを接続する場合は、電流が一番低いLEDに合わせる必要がある。ICは定電流駆動なので、LEDと直列に抵抗を挟んでも損失が増えるだけで電流値が変わることはない。LEDと並列に抵抗を接続して電流を分岐することも不可能ではないが、あまり良いやり方とはいえない。
Dot Correctionを使えば0-63の64段階で電流値を制限することができるので、電流値の設定を最大電流に合わせ、電流値が低いLEDはDCで制限する、ということも可能。ただ何らかの原因でDCが設定される前に電流が流れることもあるかもしれない。なのであんまりそういう方法は使わないほうが良いはず。

*IOレベル
TLC5940のIOレベルはCMOSとなっている。High-level input voltageは0.8Vccが必要。電源が5Vだと4Vが必要となる。つまり3.3Vレベルのマイコンと直結することはできない。
3.3Vのマイコンを直結したい場合はTLC5940も3.3Vで駆動する必要がある。
ただしTLC5940で120mAを流せるのはVcc>3.6Vの時で、Vcc=3.3Vの時は最大60mAまでとなる。それ以上の設定でも動くには動くが、損失が大きくなるため発熱が増える。

* Dot Correction
TLC5940にはDot Correctionという機能があり、1ch毎に6bitの補正値を設定できる(使ったことがないので詳細は不明)。一番最初にEEPROMから読み込むので、DCの初期化は不要。EEPROMの初期値は0x3F(0b111111)となっている。

*その他
LEDを接続したい場合、BLANKは100Hz以上にすること。50Hzでは明らかにちらつきがわかる。
サーボモータの場合は20-50Hzくらいで良いはず。

2016年9月24日土曜日

TLC5940を使いたい

TLC5940を使いたいので、一番面倒そうなパルス出力部分を作ってみることにします。
結論から言うとTIMのPWM出力をちょこちょこ動かすわけですが。

ZEROPLUSのソフトウェア

電子工作では非常に有用なツールとして、ZEROPLUSのロジアナが挙げられます。OWONの最安帯オシロと同価格帯からあり、電子工作で使用している人も多いと思います。

このソフトウェア、v3.12あたりの頃はプロトコル解析が付属しなくなったりしていた気がしますが、最近のv3.13あたりではすべてのプロトコル解析が無料で使用できるようになりました。
また、最新のv3.14ではソフトウェアの一部が日本語化されています。



正直、ずっと英語版を使用していたので日本語だと違和感がありますが、慣れてしまえば楽かな、と思います。ただ全てが翻訳されているわけではなく、プロトコルの設定などは日本語化されていません。プロトコルについてはプラグインとしての実装のようですから、アナライザ本体のグループがいくら頑張ったところで日本語化できるものでもないと思うので、これはしょうがないかなと思います。

今までもUART, SPI, I2C等の電子工作で使用される3大プロトコルは無料でも解析できていましたが、1-WireやCANのような、使う人はいるけどあんまり多くない、という機能を使用するにはシリアルキーが必要でした。最新版では1-WireやCANのみならず、SDIOやFlexRay、はてはMIL-STD-1553の解析も無料でできるようになりました。
ただし、全てが無料で使える、とはいいつつ、使用できないプロトコルも存在します。例えば僕が使っているのは16chモデルですが、Compact Flashの解析には25ch?以上が必要であり、32chモデルが必要となりますが、プロトコル選択画面に表示されています。


最新版のソフトウェアは以下のページからダウンロードできるようです。
http://www.zeroplus.com.tw/logic-analyzer_en/download.php

過去のバージョンは以下のページからダウンロードできます。このページはロジアナのモデルごとに別れているので、左のDownloadをクリックしてSelect Product TypeからProductにLogic Analyzers、SeriesにLAP-C Series、Modelに使用中のモデルを選択します。モデル名はロジアナの後ろに書いてあります。
http://www.zeroplus.com.tw/logic-analyzer_en_ori_20160331/technical_support.php

ZEROPLUSのWebページは昔の感じのページと、最近の感じのページが有り、またスイスのドメインのWebページもあったりと、ちょっと複雑な感じです。おそらく http://www.zeroplus.com.tw が本家というか、ここから落としてくれば問題ないと思いますが。


ということで、今までも有用なツールだったZEROPLUSのロジアナですが、更に有用なツールとして使えるようになってきたと思います。特に日本語化されたことによりこれから使い始めるという人に有利かもしれません。

2016年9月20日火曜日

Ankerのモバイルバッテリー

Ankerのモバイルバッテリー、比較的安価かつ高評価、また入手性も良いということで、計画的な購入では比較対象に上がる製品だと思う。もちろん実際にモバイルバッテリーとして使う分には問題ない性能だと思う。

ただこのモバイルバッテリー、消費電力が少ないと「おまえ充電終わってるよね?電気いらないよね?」ってことで給電を停止するらしい。
モバイルバッテリーとしては自分の電力を温存できるし、充電対象が過充電になることを防ぐことが期待できると、いい事ずくめな機能だと思うけど、電子工作を動かすために使おうとするとちょっと問題になる。

消費電力が少ないとき(スマフォ平常動作時程度?)では給電が止まってしまうので、電子工作のような数十mA程度ではシャットダウンされる。
マブチ130クラスを繋げば問題なく供給されるが、Lチカ程度では足りない。
電子工作をやる(予定がある)人は、Ankerのモバイルバッテリーを買う場合はそのあたりを考えておく必要があると思う。


以前使ったことがあるモノとしては、SANYOのモバイルバッテリーは問題なく使用できた。たぶん今はPanasonicが作ってると思う。

これはスライドスイッチが有り、それが電源となっている。なので勝手にモバイルバッテリーが電源を切ることがない。

他のメーカーでも同じように考えられると思うが、スライドスイッチのような、どう頑張っても内蔵されたマイコンが操作できないスイッチを電源に使っているものは勝手に切られることはないと思う。逆にモーメンタリスイッチを電源にしているモバイルバッテリーは要注意ということで。

IIRフィルタ

IIRフィルタの設計仕様で計算できる係数を使ったフィルタをC#で実装してみた。例によって正しいかどうかは不明。
このWebページではIIRとかFIRの計算が簡単にできるのでおもしろい。

private void IIR(ref double[] datas, double k, double b1, double b2, double a0, double a1, double a2)
{
    double z1 = 0, z2 = 0;

    for (int i = 0; i < datas.Length; i++)
    {
        double x = datas[i] * k;

        x += -(
            z1 * b1 +
            z2 * b2);

        datas[i] =
            a0 * x +
            a1 * z1 +
            a2 * z2;

        z2 = z1;
        z1 = x;
    }
}

タップ数を増やす場合はそれぞれのセクションの係数を与えて繰り返し呼べばいい。
とりあえずセクション数8のLPF(1000Hz,250Hz,300Hz0.5dB,35dBで設計)の結果。




青が乱数をフィルタに通してFFTした結果。赤が設計出力画面の振幅特性。
結構似た感じの傾きになってる気がする。縦軸の扱いがよくわからないけど。

上のメソッドではデータを配列として受け取って処理しているので、リアルタイムでの処理はできない。


確かにFIRよりは急峻なフィルタになっている気がするけど、計算コストも結構高そう。加算と乗算だけでイケるFIRと比較しちゃだめなんだろうが、と思ったけど、IIRも加算と乗算だけだよね。かなり複雑な気がするけど。


サンプリングレートは低くていいので、マイコンのソフト浮動小数点でどれくらいのフィルタが作れるか、試してみないと。

2016年9月16日金曜日

かるまんふぃるた



1軸の姿勢(ピッチ)がほしいので試しに加速度とジャイロのカルマンフィルタを構成してみた。
センサ・フュージョン - 備忘録の1行フィルタを使用。

g+aがジャイロと加速度を使用、gがジャイロの積分のグラフ。センサの本当の姿勢がわからないので、どっちがただしいのかわからないけど、gだけだとオフセット誤差が積分される、と考えると確かにg+aのほうが正しい気がする。開始の姿勢と終了の姿勢が一致してるかも不明だけども。

まぁ、今回の用途ではあんまり精度は要求されないので、様子を見ながら試していく予定。


角速度→誤差が積分されるから長期的な精度はダメだよね
加速度→重力以外の加速度が加わると姿勢の計算できないよね
地磁気→外乱受けやすいよね
9軸センサって辛い