MCC が生成する API
MCCの位相角タイマ用ダイアログ ウィンドウは、ATの動作に必要な多数のレジスタ(3つ のキャプチャ/コンペアを含む合計30の8ビットレジスタ)の意味を理解するのに役立ちま す。実際、このウィンドウを使わないとATの設定は非常に困難です。
APIは既定値のATx_Initialize()関数の他にはいくつかの簡単な関数で構成されて おり、ほとんどは説明を要しない1行のコードであるにもかかわらず、分解能と目的の比 較角度の設定(ATx_CC1_Compare_SetCount()等)、周期と角度の計測(キャプチャ) (ATx_PeriodGet()、ATx_PhaseGet()等)にきわめて有用です。
ピン配置
ATモジュールはペリフェラル ピンセレクトを備えたデバイスのみで提供されているため、
任意のデジタルI/Oピンに入力(同期、キャプチャ)と出力(コンペア)を自由に割り当てる 事ができます。
ホームワーク
• ATタイマが備えているミッシングパルス機能について、そしてその機能のモータ 制御での用途について調べてみましょう。
• ZCDモジュールを位相角タイマに接続し自動的に複数のイベントをつなぐ事で 、 トライアックのスイッチング シーケンスを生成してコアに負担をかける事なく変調 とタイミング計測を自動実行する方法を考察してみましょう。
オンライン リソース
『AN958 - Low-Cost Electric Range Control Using a Triac』
要があります。算術演算アクセラレータ モジュールは基本的にPIDエンジンです。PID コントローラは現在モータ制御、電源、照明を含む、各種8ビット マイクロコントローラ ア プリケーションで使われています。最近の調査によると、Libstock.com(人気のある組み込 みアプリケーション共有サイト)から最もダウンロードされたサンプルコードは、ユーザが提 供したPIDソフトウェア ライブラリでした。PIDアルゴリズムはPIC16の歴史と同じくらい古 いアプリケーション ノートのいくつかでも取り上げています。
a)
Output = Kp E(t) + Kd dE(t)/dt + Ki
∫ E ( t) dt
b)
Output[z] = Output[z-1] + K1 E[z] + K2 E[z-1] + K3 E[z-2]
上記の式で、K1~K3はそれぞれ
K1 = Kp + Kd/T + KiT; K2 = -Kp -2Kd/T; K3 = Kd/T Tはサンプリング期間です。
計算式 8. 2 : PID の連続表記 a) と離散表記 b)
このようなアプリケーション全てでは、元の式(計算式8.2参照)をラプラス変換したものから PIDアルゴリズムが実装されるため、一度係数(Ki、Kp、Kd)が対応するK1、K2、K3に変 換されると、比較的容易な算術演算シーケンスとして解釈しやすくなります。また、E[z-1]
とE[z-2]はループの前回の繰り返しでの入力(誤差)の値です。
動作原理
図8.2を分析するか、または計算式8.2から直接分かるのは、PIDエンジンが(固定小数 点の16ビット入力と32ビット出力)とアキュムレータ(35ビット容量)を使った加算器と乗算 器(A+B)*Cの繰り返し使用で構成されている点です。
PIC16F1で、これらの演算をPID機能自体とは無関係に使えるようにしたのは至極当然
でした。このため、入力セットA、B、Cに対して算術演算アクセラレータによる実行が必要 なのは4つの命令サイクルのみです。
PIDアルゴリズム全体を実行する場合、算術演算アクセラレータはさらに効率的です。
シーケンス全体の実行に必要なのはわずか7つの命令サイクルで、係数が変わらない限 り、各ループで新しい誤差(入力)をモジュールに供給するだけです。
アプリケーション
簡単な16ビットの加算/減算を実行するために算術演算アクセラレータを使う事は、入力 レジスタの読み込みと結果のフェッチに余分な命令サイクルを消費するため、労力に見合 う結果は得られません。
16ビットの乗算になると話は別です。16x16ビットの符号付き乗算で32ビットの結果(と積 算)を求める場合、数桁以上のサイクル(最適化されたlong型演算を使う場合は約300)を 節約できます。PIDアルゴリズム全体をソフトウェアで実装すると、1,000近い命令サイクル になります。
図8.2: 離散PIDのブロック図
制限事項
算術演算アクセラレータはマイクロコントローラ コアに不可欠な要素ではないため、XC8 Cコンパイラは通常の算術演算を加速するために加算器/乗算器を使いません。ユーザ は算術演算アクセラレータのレジスタを手動で読み込み、規定された演算シーケンスに 従う必要があります。
複数の(ネストした)制御ループが必要な場合、算術演算アクセラレータを使うと大幅にサ イクルを節約できます。それでもなお、係数を入れ換えるだけでなくPIDエンジンが使う 中間値(z、z-1、z-2)が保存され、繰り返しのたびに正しく復元される事を確実にする必要 があります。
MCC が生成する API
MCCは、係数の読み込みと算術演算アクセラレータの設定という冗長な作業を既定値の MATHACC_Initialize()関数内で全て処理します。標準的なアプリケーション制御ルー プ内で、ユーザは更新された入力のみをMATHACC_PIDControllerModeResultGet() 関数に渡し、積算された出力値を含むバッファを取得する必要があります。アキュムレー タのサイズは35ビットであるためlong型の結果は返せませんが、mathacc.hヘッダファイ ル内に5バイトの構造体が定義されています。そこでユーザは、出力値をスケーリングす る最善の方法を選択し、アプリケーションに適した出力(アナログ/デジタル)を生成する事 ができます。
ホームワーク
• 算術演算アクセラレータの速度とACDの変換速度を比較してみましょう。上記の
例で32 MHzのクロックを想定すると、どちらがシステムのボトルネックとなる可能
性が高いか計算してみましょう。
• 算術演算アクセラレータの性能を、dsPIC33FまたはPIC24HでソフトウェアPID を実行する場合の性能と比較してみましょう。
• (レジスタの読み込みと結果の書き出しを含む)積和演算の実行に必要なサイク
ル数を見積もってみましょう。
• デジタルフィルタ(FIR、IIR等)アプリケーションで算術演算アクセラレータを使え るか検討してみましょう。
例
以下の例はシンプルなアプリケーションのmainループを示しています。この場合、PIDア ルゴリズムがADCから入力を受け取り、PWMの出力を計算します。
/* Project:MathAcc Example * Device:PIC16F1619 */
#include "mcc_generated_files/mcc.h"
#include "mcc_generated_files/adc1.h" // defines Sensor channel void main(void)
{
int SetPoint = 0x1234;
MATHACCResult Output;
SYSTEM_Initialize(); // initialize device, MATHACC, ADC and PWM3 while (1)
{
int CurrentValue = ADC1_GetConversion( Sensor);
Output = MATHACC_PIDControllerModeResultGet( SetPoint, CurrentValue);
PWM3_LoadDutyValue( Output.byteHH + (Output.byteU<<8));
} }
オンライン リソース
『AN937 - PIC18 MCUの使用によるPIDコントローラの実装』
『AN964 - Software PID Control of an Inverted Pendulum Using the PIC16』
『AN1138 - A digital Constant Current Power LED Driver (using PID)』
算術演算関連のアプリケーション ノート
『TB040 - Fast Integer Square Root』
『AN1061 - Efficient Fixed-Point Trigonometry Using CORDIC Functions』
『AN821 - Advanced Encryption Standard Using the PIC16』
『AN942 - Piecewise Linear Interpolation on PIC12/14/16 Series Microcontrollers』