近畿大学 小坂氏製作の『BLDCmotor』プログラムのコンパイル&動作について

01 Oct 2019

https://os.mbed.com/users/kosaka/code/BLDCmotor/ どなたか上記プログラムをコンパイル&動作させる方法をご存知の方はいらっしゃいませんでしょうか? 当方、お恥ずかしながらmbed初学者で上記プログラムのコンパイル&動作をトライしているのですが、 なかなかうまくいかず非常に困っております。 現状TRYした内容は以下の通りです。いずれもコンパイル成功に至っておりません。 ・RTOSライブラリのリビジョン切替 ・小坂氏HPにある”新規作成”→”主要ファイルコピー”→”コンパイル”手法(以下HPをご参照下さい) https://sites.google.com/site/kosaka3lab/books https://docs.google.com/viewer?a=v&pid=sites&srcid=ZGVmYXVsdGRvbWFpbnxrb3Nha2EzbGFifGd4OjM4YzU5YzAzZGU3Nzk2NGQ 尚、本プログラムは小坂氏著書の『mbedマイコンによるモータ制御設計法』と紐づいており このプログラムを動作させながら理解を深める性質上、なんとか動作させたい次第です。 製作者である小坂氏にも問い合わせを行いましたが、『不具合は承知しているが 既にmbed利用から離れており対応の予定はない』との回答でした・・・・ 製作者の回答が上記である以上、皆様に対処法伺うのは非常に心苦しい限りなのですが 藁をもつかむ思いでこちらに書き込む次第です。 どなたかご教示を頂けますと非常に助かります。 どうぞ宜しくお願い致します。

08 Oct 2019

プログラムをインポートしてコンパイルしてみました。

Mbedのオンラインコンパイラのバージョンが上がったため、型チェックがより厳密になりました。 BLDCmotorプログラムでは、それが原因で発生しているエラーが多いようです。 エラーメッセージに記載されている情報を参照して、キャストを追加すればエラーは消えますが(実際に少し試してみました)、エラーの量が多すぎるので断念しました。

別の方法として、Mbed 2からMbed OS 5に移行する方法があります。詳細な手順は以下をご覧下さい。https://os.mbed.com/docs/mbed-os/v5.12/tutorials/migrating-to-mbed-os-5.html

この方法では、コード中の一カ所のみ変更が必要でしたが(定義済みのdebugシンボル名を変更する)、コンパイルは通りました。 試しに動かしてみましたが、以下の実行時エラーが出ました。

++ MbedOS Error Info ++
Error Status: 0x80010133 Code: 307 Module: 1
Error Message: Mutex: 0x200815E0, Not allowed in ISR context
Location: 0xAB67
Error Value: 0x200815E0
Current Thread: application_unnamed_thread  Id: 0x20081348 Entry: 0x5D2D StackSize: 0x1000 StackMem: 0x10006048 SP: 0x10007EEC 
For more info, visit: https://mbed.com/s/error?error=0x80010133&tgt=LPC1768
-- MbedOS Error Info --

割り込みコンテキスト内でmutex等を使用しているためエラーが発生しているようですので、それをヒントに修正してみてください。

23 Oct 2019

LPC1768のMbedが現在手元に無かったので、Nucleo-F446REで調べてみました。
Wataraiさんの指摘通り、現在最新のmbed-os5.14.1に変えて、debugのシンボルを別名に変えるとコンパイラエラーとはならずにbinファイルが作成できます。
動作させるとMutexエラーが、F446REでも発生します。
原因は、controller.cpp内のline302のanalog_outが関係しています(コンストラクタは、line33に有)。
mbed-os5内にはユーザーが使っていなくてもMutex機能が使われて、排他的処理を勝手に行っていてます。
仕様としては異論がありますが、armとしては直すつもりはないようです。
https://os.mbed.com/questions/82847/Mutex-lock-failed-on-Mbed-OS510x/

話がわき道にそれましたが、結果としては、下記のようにMutexをバイパスして直接ポートにDAC出力すれば回避できるでしょう。

controller.cpp

#if 0   
    analog_out=p.vuvw[0]/100.+0.5;//debug
#else
  #if defined(TARGET_LPC1768)    
    float temp = p.vuvw[0] / 100.0f + 0.5f;
    if (temp < 0.0f) {
        temp = 0;
    } else if (temp > 1.0f) {
        temp = 1.0f;
    }
    int value = (int)(temp * (float)0x3ff);
    LPC_DAC->DACR = (0 << 16) | (value << 6);
  #else
    #error "need to modify [analog_out] part" 
  #endif
#endif

いずれにしてもモーター制御基板無し、LPC1768無しですので、これで全ての問題解決になるかは不明ですが、mbed-os5に移行したほうが賢明でしょう。