サーボモータの制御方法 dsPIC入門講座03
開発環境
基盤
- SPPBoard(dsPIC30F3014使用)
コンパイラ
- C30
はじめに
今回はSPPBoardを用いてサーボモータ(S3003)を制御する方法を解説します。
S3003はRCサーボなので角度指定にはPWM制御を必要とします。
つまり、dsPIC入門講座02で解説したOutPutCompare(OC)モジュールを使えばよいのです。
しかし、SPPBoardに採用したdsPIC30F3014にはOC端子が二つしかありません。
OC端子
車輪ロボット等を駆動させることを考えると最低二つのモータをそれぞれOC端子に割り当てることになりそうです。
その状態でサーボモータも同時に制御したい場合にはどうすればよいでしょうか?
ここでは、I/Oピンとタイマを組み合わせてPWM信号を生成することで解決する手法について解説します。
使用する端子
サーボモータの仕様書から必要な情報を読み取ろう
サーボのスペック表
タイマの割り込み周期
S3003のパルス幅は0.5 ~ 2.3msです。
よって1.8msの間で0deg ~ 180deg動くことがわかります。
(2.3 - 0.5) / 180 = 0.01ms で1deg動く
きりが良いので、0.01msをタイマの割り込み周期にします。
(注) S3003には180deg以上回転するので実際のパルス幅で測定すると0.55 ~ 2.35ms付近がちょうど0deg ~ 180degの範囲になっていました。
角度制御用の信号
認識する周期幅が6 ~ 25msの範囲なので20msくらいの周期幅でHigh, Lowを切り替えます。
タイマの割り込み周期が0.01msなので2000カウントで20msとなります。
60degに制御する場合
0.01ms x 60 = 0.6ms
0.55msで0degなので
0.6ms + 0.55ms = 1.15ms
タイマは0.01ms毎の割り込みなので
High: 115カウント
Low : 1885カウント
とする周期をサーボモータに送ることで60degに制御することができます。
0degに制御する場合
High: 55カウント
Low : 1945カウント
180degに制御する場合
High: 255カウント
Low : 1745カウント
タイマの割り込み周期を0.01msにしたのは1deg動かすために変化させるHighのカウント数を1にするためです。
サーボモータを動かしてみよう
角度指定用の関数
void servo(int angle){
angle += 145; //90 + 55
ServoTargetValue = angle
}
angle += 145
角度の座標系を0 ~ 180degから、中心を0degとした-90 ~ 90degに変更
ServoTargetValue
タイマ1の方でHigh側のカウント上限に使用するグローバル変数
初期化関数
void ServoInitFunc(void){
servo(0);
ConfigIntTimer1(T1_INT_PRIOR_1 & T1_INT_ON);
OpenTimer1(T1_ON & T1_GATE_OFF & T1_PS_1_1 & T1_SYNC_EXT_OFF & T1_SOURCE_INT, 200-1);
}
OpenTimer1(...)
4/80MHz x 1 x 200 = 0.01msec
タイマの割り込み周期を0.01msecに設定
タイマ関数
void _ISR _T1Interrupt(void){
IFS0bits.T1IF = 0;
TimeCount++;
if(TimeCount < ServoTargetValue){
SERVO = 1;
}else if(TimeCount <= 2000){
TimeCount = 0;
}
}
サーボモータの信号端子にPWM信号を出力します。
タイマ資源が余っているとき限定ですがこの方法を使用することでどのI/OピンからでもPWM信号を出力できますので試してみてください。
以上でタイマを使ったサーボモータの制御についての解説を終わります。
blog comments powered by Disqus
Published
Category
SPPBoardTags
Profile
千葉工大産のロボットナビゲーションエンジニア
ros-jpの勉強会の主催やロボカップ世界大会優勝チームのリーダをやってました。
badge_description about badge's
総訪問者数
ツイート