重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

市販のARMマイコンについての質問です
ヴイストン株式会社のビュートローバーARMという商品Ⅽ言語の学習のために使っています、
ロータリーエンコーダを取り付けてモーターの回転数を測り、速度を調整しようとしたのですが
本に載っているサンプルと同じようにプログラムを写してもうまく動きません
(前後にカクカクした動きで前に進まない)
自分でもプログラムが少しおかしいような気はするのですが、色々ためしても上手く動きませんでした
もしわかる方がみえたら、アドバイスお願いします
本に載っていたサンプルのコードです
int main (void)
{

//制御周期の設定[単位:Hz 範囲:30.0~]
const unsigned short MainCycle = 60;
Init(MainCycle);//CPUの初期設定
InitEncoder();
ClearEncoder();
LED(3);

while(getSW() != 1); //ボタンが押されるまで待つ
while(getSW()== 1);


while(1){
//エンコーダの値を格納する変数
long L_enc_cnt,R_enc_cnt;
//速度を格納する変数
double L_speed,R_speed;
//1週前のエンコーダの値を格納する変数
static long Old_L_enc = 0,Old_R_enc = 0;
//モータ出力変数
static short mtr_out_L = 0,mtr_out_R = 0;

Sync();
 //エンコーダ値を取得
GetEncoder(&L_enc_cnt,&R_enc_cnt);

//エンコーダ値から速度を速度を算出
L_speed = (double)(L_enc_cnt - Old_L_enc)* 0.173*60.0;
R_speed = (double)(R_enc_cnt - Old_R_enc)* 0.173*60.0;

//加速させる速度を求め、モータ出力に加算(積分)
//目標は60mm/secゲインは5.0とする
mtr_out_L += 5.0*(60-L_speed);
mtr_out_R += 5.0*(-60-R_speed);

      //モータの速度を設定
Mtr_Run_lv(mtr_out_L,mtr_out_R,0,0,0,0);
       //次の周期のため現在のエンコーダ値を変数に代入
Old_L_enc = L_enc_cnt;
Old_R_enc = R_enc_cnt;

}
}
あまり詳しいことはわかりませんので少し説明に誤りがあるかもしれません
質問があればわかる範囲でお答えさせていただきます

A 回答 (1件)

APIの仕様と各値の単位(次元)が分からないと答えられないと思います。


雰囲気的にはGetEncoder()がモータのステップ値の取得、
Mtr_Run_lv()がモータの位置指令でしょうか。

>(前後にカクカクした動きで前に進まない)

素人考えではあり得るかなと思うのは、目標位相を指定するのであれば位置(位相)の指定が間違っている(360°回って後ろになっているとか)とか、相対的な位相を指定するのであれば与える入力値がゼロ付近でプラスとマイナス交互に与えられてしまっているとかかなと思います。

キットの中にシミュレータとかないのでしょうか。
指令値を確かめる手段がないと原因を特定しづらいと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!