沼津高専 電子制御工学科
MIRSMG3D PICプログラム仕様書
MIRSMG3D-MTCB-0006
改訂記録
版数 作成日 作成者 承認 改訂内容
A01 2009.3.20 片瀬 内堀 初版
A02 2010.9.17 牛丸 内堀 HEXファイルをリンク
A03 2011.1.31 牛丸 牛丸 16F88.hのヘッダファイルのリンクを追加


目次






1.はじめに

このドキュメントはモータ制御ボードに搭載するPIC16F88用プログラム(以下、本プログラム)について解説するものである。
本プログラムへのリンクを
ここに示すので適宜参照すること。
(ヘッダファイルはコチラ。mg3_std.h mg3_motor.h mg3_usart.h 16F88.h))
(HEXファイルのリンク:integration.hex"




2.開発環境

本プログラムは以下の環境を用いて作成された。

Table 1 PIC用プログラム開発環境

品名 Company
開発言語 C言語
コンパイラ PCM v.4 CCS
エディタ MPLAB IDE v8.10 Microchip
書き込み機 PICライターキットAタイプ 潟Aドウィン




3.関数

本プログラムは3つの関数によって構成されている。
また、xxx_isrと名のついた関数は割込みによって非同期に実行されるため、共有変数にアクセスする際には割込みを禁止する必要がある。
これを留意しておかないとグローバル変数にアクセスする際、正しく値を取得することができなくなる可能性がある。

注:CCS社製Cコンパイラを用いる場合、割込み関数は「割込み要因」+「_isr」という名前にしなければならない。



3.1 ext_isr()

この関数はロータリエンコーダの回転を計測するものである。
ロータリエンコーダからの入力(RB0)の立上がりをトリガーとする外部割込みによって実行される。

ext_isr()関数の動作を以下に示す。
  1. 割込み発生。
  2. ロータリエンコーダの回転方向(C_CW)を見る。
  3. C_CWが1ならカウント値(count)をインクリメント、0ならデクリメントする。
  4. C_CWをLED1に出力する。  ※デバッグ用オプション
  5. 割込み終了。

補足
  • ロータリエンコーダの回転方向は回路的に1/0に変換されている。
  • この処理を行っている最中はTimer割込みは禁止されている。



  • 3.2 timer1_isr()

    この関数はモータをPI制御するものである。
    PICに内蔵したタイマーによって定期的に実行される。
    PIC16F88にはTimer0/1/2の三つのタイマーが内蔵されているが、最長104msecという周期を実現するためにTimer1を用いている。
    timer1_isr()関数の動作を以下に示す。
    1. 割込み発生
    2. 割込み周期設定
    3. 各種パラメータを退避
    4. 総回転数を更新
    5. PI制御演算
    6. 演算結果を整えて出力
    7. パラメータを保存
    8. 割込み終了

    補足
  • PI制御では積和演算を行うが、この処理には時間がかかるため、ロータリエンコーダの割込みを取りこぼさないように、4の処理を行っている間は割り込みが許可されている。
  • デバッグオプションとしてLED2にモータを制御する際の回転方向を表示している。
  • ロータリエンコーダとモータの接続が正しい場合、LED1とLED2は同じパターンで点灯する。



  • 3.3 main()

    main関数は初期化部と通信部から構成されている。
    初期化部では以下の動作を行う。
    1. 全ての割込みを禁止
    2. 通信回路を停止
    3. 各種初期設定
      • 入出力ポートの設定
      • タイマの設定
      • 割込み許可設定
      • 計測・制御用変数の初期化
    4. 通信回路を再起動
    5. 1byte分ブレーク信号を送信
    6. ブレーク信号を受信しなくなるまで待機。
    7. 割込み許可

    この初期化部はリセット時にも利用されるため、一度割込みを禁止、回路を停止などの手順を踏んでいる。


    通信部ではPIC内蔵の通信回路を用いてシリアル通信を行っている。
    以下に通信プロトコルを示す。
    Table 1 通信プロトコル
    コマンド名 受信データ 送信データ 動作・備考
    コマンド データ1 データ2 データ3 応答 データ1 データ2 データ3
    クリア 0x00 - - - 0x80 - - - 総回転角度をクリアする。
    制御パラメータ設定 0x01 目標速度 Kp Ki 0x81 - - - 制御パラメータを変更する。
    速度[回転角/周期]
    モータパラメータ取得 0x02 - - - 0x82 現在速度 PWM 総回転角度 モータパラメータを取得する
    速度[回転角/周期]、回転角度[deg]
    スタート 0x04 - - - 0x84 - - - ストップ状態を解除する。
    ストップ 0x08 - - - 0x08 - - - ストップ状態へ移行する。
    制御周期変更 0x20 カウンタ初期値(下位) カウンタ初期値(上位) - 0xA0 - - - Timer割込みの周期を変更する。
    NCK 上記以外 - - - 0x4X - - - 不正応答
    (Negative Acknowledgment)



    補足
    通信は常にMG3本体側から行われ、モータ制御ボードはそれに応答するという形を取る。

    制御周期はタイマーカウンタによって実装されているため、制御周期の変更はカウンタの初期値を変更することによって実現される。
    制御周期の計算方法
    制御周期 = ( 216 - カウンタ初期値 )* クロック周波数(20MHz)/4/プリスケーラ(8)
    カウンタ初期値 = 65535−周期/1.6μsec
    ただし、この計算は標準では制御関数内部で行われる。



    4.おわりに

    PICは複雑な処理を行うには力不足である。
    しかし、見方を変え、やり方を変えることでPICの可能性は飛躍的に大きくなる。
    例えば、本プログラムではPI制御を行っているが、コレにD成分を加えてPIDとすることもできる。
    他にもロータリエンコーダを倍遁することで精度をもっと上げることも可能である。
    PICの上位機種であるPIC18シリーズやdsPICを用いることで一つの制御ボードで二つのモータを制御することも可能になるだろう。
    是非、取り組んで貰いたい。
    なお、本プログラムはPIC16F88専用に作ってあるので、他のPICへ移植する場合、レジスタ構成、ピン配置などが異なる可能性があるので注意が必要となる。



    関連文書