Motor練習問題集
[motor練習問題1]
1. SW1がONのとき、メロディが鳴っている間だけDCモータを停止させてみよう。
2. SW1がOFFのとき、DCモータの速度が滑らかに増減するようにしてみよう。
(⇒サーボモータの往復運動は1秒間隔のままでも可能だよ)
2. SW1がOFFのとき、DCモータの速度が滑らかに増減するようにしてみよう。
(⇒サーボモータの往復運動は1秒間隔のままでも可能だよ)
[解答例]
#include "DSP28x_Project.h" // Device Headerfile and Examples Include File #include "NolibM.h" volatile struct EPWM_REGS *ePWM[] = { &EPwm1Regs, //intentional: (ePWM[0] not used) &EPwm1Regs, &EPwm2Regs, &EPwm3Regs, &EPwm4Regs, &EPwm5Regs, &EPwm6Regs, &EPwm7Regs, }; void main(void) { int i; initNolibM(); //初期化 for(;;) // 無限ループ {/*------------------↓↓↓ここから書き換える↓↓↓--------------------*/ if(sw1(ON)) //スイッチ1がONならば,以下を実行 { motor(+30,MotCN3); //DCモータ(CN3)を+30の速度で回転 motor(+60,MotCN4); //DCモータ(CN4)を+60の速度で回転 servo(+90,D4); //サーボモータを+90度の位置まで回転 wait(1000); //1000ms待つ servo(0,D4); //サーボモータを 0度の位置まで回転 wait(1000); //1000ms待つ motor(0,MotCN3); //DCモータ(CN3)を停止 motor(0,MotCN4); //DCモータ(CN4)を停止 mario(); //音楽 } else //スイッチ1がONでないなら,以下を実行 { servo(-90,D4); //サーボモータを-90度の位置まで回転 for(i=0;i<=10;i++){ motor(-3*i,MotCN3); //DCモータ(CN3)を-60の速度で回転 motor(-2*i,MotCN4); //DCモータ(CN4)を-30の速度で回転 wait(100); //100ms待つ } servo(0,D4); //サーボモータを 0度の位置まで回転 for(i=10;i>=0;i--){ motor(-3*i,MotCN3); //DCモータ(CN3)を-60の速度で回転 motor(-2*i,MotCN4); //DCモータ(CN4)を-30の速度で回転 wait(100); //100ms待つ } } }/*------------------↑↑↑書き換えるのはここまで↑↑↑-----------------*/ }
[Motors練習問題2]
1. 1周期8秒間のSIN関数を用いて速度±80を往復する
HINT: float型変数を使う。SIN()の引数はラジアンであることに注意
float→int変数をCASTをする必要あり
#include<math.h>を忘れない
2. 上記課題について速度変化につれてLEDを点灯させる
速度0-20 範囲にてLED1を点灯
速度20-40範囲にてLED2を点灯
速度40-60範囲にてLED3を点灯
速度60-100範囲にてLED4を点灯
HINT: float型変数を使う。SIN()の引数はラジアンであることに注意
float→int変数をCASTをする必要あり
#include<math.h>を忘れない
2. 上記課題について速度変化につれてLEDを点灯させる
速度0-20 範囲にてLED1を点灯
速度20-40範囲にてLED2を点灯
速度40-60範囲にてLED3を点灯
速度60-100範囲にてLED4を点灯
[解答例]
#include "DSP28x_Project.h" // Device Headerfile and Examples Include File #include "NolibM.h" #include <math.h> volatile struct EPWM_REGS *ePWM[] = { &EPwm1Regs, //intentional: (ePWM[0] not used) &EPwm1Regs, &EPwm2Regs, &EPwm3Regs, &EPwm4Regs, &EPwm5Regs, &EPwm6Regs, &EPwm7Regs, }; void main(void) { float f=0; int speed; initNolibM(); //初期化 for(;;) // 無限ループ {/*------------------↓↓↓ここから書き換える↓↓↓--------------------*/ f+=0.01; speed=(int)80*sin(f); motor(speed,MotCN3); motor(speed,MotCN4); speed=abs(speed); //絶対値速度に変換 if(speed>0&&speed<=20)ledFlash(ON,1);//0-20でLED1をON if(speed>20&&speed<=40)ledFlash(ON,2);//20-40でLED2をON if(speed>40&&speed<=60)ledFlash(ON,3);//40-60でLED3をON if(speed>60&&speed<=100)ledFlash(ON,4);//60-100でLED4をON wait(20); //sampling time is 20 msec ledFlash(OFF,1); ledFlash(OFF,2); ledFlash(OFF,3); ledFlash(OFF,4); }/*------------------↑↑↑書き換えるのはここまで↑↑↑-----------------*/ }
[Motor練習問題3]
台形則で回転を制御する。
加速:5[s]間で速度0→+80
定常:速度+80を維持して5[s]
減速:速度+80→0, 5[s]間でストップ
加速:5[s]間で速度0→+80
定常:速度+80を維持して5[s]
減速:速度+80→0, 5[s]間でストップ
[解答例]
#include "DSP28x_Project.h" // Device Headerfile and Examples Include File #include "NolibM.h" volatile struct EPWM_REGS *ePWM[] = { &EPwm1Regs, //intentional: (ePWM[0] not used) &EPwm1Regs, &EPwm2Regs, &EPwm3Regs, &EPwm4Regs, &EPwm5Regs, &EPwm6Regs, &EPwm7Regs, }; void main(void) { static float f_spd_ptn[][2]={{0.0,0.0},{80.0,5.0},{80.0,5.0},{0.0,5.0}};//{速度、時間差分} float f_spd,diff; int i; initNolibM(); //初期化 for(;;) // 無限ループ {/*------------------↓↓↓ここから書き換える↓↓↓--------------------*/ for(i=0;i<3;i++) { diff=(f_spd_ptn[i+1][0]-f_spd_ptn[i][0])/f_spd_ptn[i+1][1]; if(diff>0) //増速 { for(f_spd=f_spd_ptn[i][0];f_spd<=f_spd_ptn[i+1][0];f_spd+=diff*0.02) { motor((int)f_spd,MotCN3); wait(20); } } else if(diff<0) //減速 { for(f_spd=f_spd_ptn[i][0];f_spd>=f_spd_ptn[i+1][0];f_spd+=diff*0.02) { motor((int)f_spd,MotCN3); wait(20); } } else //差分なし { motor((int)f_spd,MotCN3); wait(f_spd_ptn[i+1][1]*1000); } } }/*------------------↑↑↑書き換えるのはここまで↑↑↑-----------------*/ }