ブロックの連結
ボリューム入力ブロックで
ツマミを回すと この様に 設定した範囲の数値が出る モジュールをつくりました。
その出てきた数値を 以下のサーボ動作ブロックに入れると数値入力に応じて
サーボが回転するので
このようになり
結果、ツマミでサーボの回転をコントロールできる ということになります。
ということで、 作った2つを接続して動かします
回路図
プログラム
H8_adv_ADsarvo2in1
#include<3664.h>
#include
struct sarvo{
float ang_max;
float ang_min;
};
int GRB;
void ini_AD(void){
AD.ADCSR.BYTE = 0x38; /* 0011 1000*/
/* A/D変換開始 */
/* スキャンモード */
/* 高速変換 */
/* AN0 */
}
int AD_Vlm(int div){
/**************************************
引数 : div (VLキザミ値)
4,8,16,32,64,128,256 で指定
返値 : 0~div を返す
VLボリュームの回転に応じて
**************************************/
int i;
switch(div){
case 4: i=14; break;
case 8: i=13; break;
case 16: i=12; break;
case 32: i=11; break;
case 64: i=10; break;
case 128: i=9 ; break;
case 256: i=8; break;
default: i=14;
}
while(AD.ADCSR.BIT.ADF==0); // 変換結果がでるまで待つ
return( (int)( AD.ADDRA>> i ) ); // ビットシフト(i桁ずらす)
// AD.ADCSR.BIT.ADF=0; /* 終了フラグを0に戻す */
}
void ini_DrvSarvo2M(){
TW.TMRW.BYTE=0x01; // FTIOB端子をPWM出力に設定
TW.TCRW.BYTE=0xB2; // マッチAでカウンタクリア、内部クロックの1/8( 2MHz )
//FTIOBの初期値は1
TW.TCNT=0x0000; // TCNの初期化
TW.GRA=20000; // 20mS (50Hz)
TW.GRB=3000; // 1.5mS
}
void DrvSarvo2M(struct sarvo sv,int inp,int div){
/**********************************
機能 = 引数inpの数字に応じてサーボを回転させる
引数:struct sarvo sv サーボ上下限値(ms)
:div スケール
:inp 入力数値
返値:なし
動作:サーボ回転
***********************************/
int GRout;
long GRmax;
long GRmin;
long p;
//範囲外処理
if(sv.ang_max > 2.3 || sv.ang_min < 0.7) {return;} //何もせずに返る
GRmax=(int)2000*sv.ang_max;
GRmin=(int)2000*sv.ang_min;
GRmax=GRmax*100;//少数演算用100倍long
GRmin=GRmin*100;//少数演算用100倍long
p=( ((GRmax-GRmin)/div)*inp ); //
GRout=(p + GRmin )/100;
//範囲外処理
if(GRout > 4600 || GRout < 1400) {return;}
GRB=GRout; //デバッグ出力
TW.GRB=GRout;//パルス発生出力
}
void main(void)
{
DI;
LCD_init( 16 );
ini_AD();
ini_DrvSarvo2M();
TW.TMRW.BIT.CTS=1; // TCNTカウンタスタート
EI;
while(1){
struct sarvo s3003;
s3003.ang_max=2.0;
s3003.ang_min=1.0;
DrvSarvo2M(s3003, AD_Vlm( 64 ), 63);
//LCD表示
LCD_locate(1,2);
LCD_dataout(GRB );
}
}
ボリュームの数値を サーボ関数に入れるところは
DrvSarvo2M(s3003, AD_Vlm( 64 ), 63);;
このようにしています。
サーボの入力数値範囲は ボリューム入力にあわせ0~63
実行結果
ツマミを回すとサーボがそれに応じて回転します。
同時にGRB値をLCDに表示します。
いっぺんに作ったのでなく、
それぞれのブロック(モジュール)で入出力が正しく機能することを確認して接続したので、うまく動いても当たり前のような気もします。
最初から一発できれいに動作しても、まあ、それだけ、切り分けて開発できるということでしょう。
スポンサーリンク
- twtter
- google+
- hatena