H8タイニーでラジコン用プロポ制御
2003年2月23日修正
ラジコン用のサーボモータは下記のようなパルス信号を加える事で制御出来ます
20mSの周期で1mSから2mS幅のパルス信号を加えると、サーボはパルス幅に見合った角度で左右に首を振ります。1.5mS幅のパルスにすると、ほぼ中間位置で停止し、それよりも短いパルス幅だと左周りに、長いパルス幅だと右周りに首を振ります。
つまり、1.5mS幅を中心として、±約0.5mSだけパルス幅を増減させることによって、連続的に首振りの角度を制御することができます。
マイコンによるパルス信号の制御
このパルス信号をはタイマWでPWM動作をさせFTIOBにパルス信号を出力します。パルスの周期はジェネラルレジスターA GRAにパルス周期の20mS を設定の為40000を入れる (1/(16000000/8))*40000=0.02=20mS
パルス幅はジェネラルレジスターB GRBに2000〜4000を入れる事で1mS〜2mSに変化します。
1.0mS (1/(16000000/8))*2000=0.001=1mS
1.5mS (1/(16000000/8))*3000=0.0015=1.5mS
2.0mS (1/(16000000/8))*4000=0.002=2mS
となります 2000〜4000間でサーボモータの位置を制御できます。
動作確認
SW14 ON 1.0mS 出力 MIN方向(CCW)
SW15 ON 1.5mS 出力 中心
SW16 ON 2.0mS 出力 MAX方向(CW)
SW17 ON VR1をまわす事で1から2mSの間可変
状態をLCDに表示します 以上の動作をします。
回路図
プログラムの一部です。
TMRW = 0x81; /* FTIOB PWM出力 */
TCRW = 0xb0; /* GRAでカウンタクリア 16MHz/8 */
GRA = 40000; /* GRAを40000に設定
(1/16MHz/8)*40000=20mS */
TOB=1; /* タイマ出力レベルセットB H*/
wait(5000); /* 5ms wait*/
lcd_cmd(0x80);print_lcd("サーボモータコントロール");
while(1){
if(P14==0) {
lcd_cmd(0xc0);print_lcd(" MIN 1.0mS ");
GRB = 2000; /* (1/16MHz/8)*2000=1mS */
}
if(P15==0) {
lcd_cmd(0xc0);print_lcd(" SENT 1.5mS
");
GRB = 3000; /* (1/16MHz/8)*3000=1.5mS */
}
if(P16==0) {
lcd_cmd(0xc0);print_lcd(" MAX
2.0mS ");
GRB = 4000; /* (1/16MHz/8)*4000=2mS */
}
if(P17==0){
for(;;){
ad0_read(); /* AD0 READ */
ad_data = ADDRA>> 6 ; /* AD0 10BIT */
GRB = 1976 + (ad_data * 2); /* GRB = 1976 〜4024 0.9ms〜2.01ms */
lcd_cmd(0xc0);P83=1;
sprintf(s_txt," AD SARVO %4d ",ad_data);
print_lcd(s_txt);