2016-05-25 20:30 | カテゴリ:PIC応用回路
プログラム完成後の追加検討です。

このブログをごらんいただいている方(6jiroさん)から、サーボの動作速度をもう少し遅く出来ないか?というお話を頂きました。
現在の仕様では、サーボは、その最大速度で、目的の角度(パルス幅)になるように動作します。
現在位置が0で、100の位置信号を与えると、一気に動作します。
RCサーボを利用する模型の状況によっては、ゆっくりと目的の位置まで移動させたい場合があります。
その為の、サーボの動作速度をある程度増減できる工夫をしました。

続きは、こちらから




まずは、変数の定義の変更から。
細かい制御をする為に、浮動小数点の変数を定義しました。

//------------------------------------------------------------------------
// 変数初期設定
//------------------------------------------------------------------------
unsigned char portcnt;
unsigned char smax;
unsigned char scnt;
unsigned char led_cnt[14] = {0}; //ポート毎のLED点滅周期のカウント値を記憶初期値0
unsigned char sw0v, sw1v; //swで操作するポートの初期値を記憶する
unsigned char updw = 0;
int i;
int duty, freq; //デューティー比と周期を格納
int servo; //サーボ設定パラメータ
unsigned char svv;
signed int m, n;

//----------------------- 変更分 -------------------------------------------
// 新しく変数を定義し、初期値を設定
float target = 50; //サーボ動作目標値の保存
float step = 1, current = 50; //サーボ動作のステップ値の定義、現在のサーボ動作数
// このstepを加減することでサーボの動作速度を調整できる
//-------------------------ここまで------------------------------------------



続いて、サーボを制御する関数の中を変更しました。

//------------------------------------------------------------------
// TMR0に割り込み時間をセットして、サーボ信号出力をONに
// TMR0に時間をセットして割り込み処理を許可するが、そのまま割り込み
// 発生をLOOPで待ち、割り込み検出後に、ポートをOFFにして次の処理にすすむ
//------------------------------------------------------------------

void sv_on(void) {


//------- 変更分 -------------------------------------------
target = parameter[portcnt][2]; //サーボ設定値を読み取り

if (target != current) {
if (target <= current) current = current - step; //目標値が現在値よりちいさければstepを減算
else current = current + step; //そうでなければ加算
if (current <= 0) current = 0; //下限値チェック
if (current >= 100) current = 100; //上限値チェック
}
servo = current; //値(0-100)をservoに渡す
//--------ここまで--------------------------------------------



servo = servo * 78 / 100;
servo = 100 + servo;
port_off(); //サーボ接続ポートをON(負論理)
TMR0 = servo;
// TMR0 = 178; // 注意 TMR0 = 178 -> 1000usec (サーボパルス幅)
// 139 -> 1500
// 100 -> 2000

T0IF = 0; // TMR0 割り込みフラッグクリア
T0IE = 1; // タイマー割り込み解除
while (T0IF == 0) {

// TMR0割り込みが発生するまで待つ
}
}

// -------------------------End of Program --------------------------------


少し動作を説明しますと、
サーボの動作に関して、
目標値、現在値、増減値、を定義し、タイマーにセットするサーボのパルス幅の増減を増減値だけ少しづつ増減させ、目標値になったら、その値を維持する、というものです。

デモプログラムでは、1づつ、変化させる様にしています。
これまでのオリジナルのプログラムに比べて、ゆっくりとした動作になりました。

ただ、問題がないわけではありません。
サーボのパルス幅を制御するTMR0は、0-255の値をセットできますが、パルスのONの時間は、各種の制限で、約100から178くらいの値しか取れません。これをゆっくり変化させますので、動作としては、カクカクとした動きになってしまいます。
これを防ぐには、TMR1のタイマー(0-1023)を使用すればよいのですが、TMR1は既にPWMに使用していますので、今回は使用できません。
まぁ、限界でしょうか。

今回のプログラムの全体は、こちら。

LED_mgr_final3.txt

動作したビデオ動画は、こちらです。

【ジャンル】:趣味・実用 【テーマ】:模型・プラモデル
コメント(6)

管理者のみに表示する