Sample Programs

Motor練習問題集

[motor練習問題1]

1. SW1がONのとき、メロディが鳴っている間だけDCモータを停止させてみよう。
2. SW1がOFFのとき、DCモータの速度が滑らかに増減するようにしてみよう。
 (⇒サーボモータの往復運動は1秒間隔のままでも可能だよ)

[解答例]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#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を点灯

[解答例]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#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]間でストップ

[解答例]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#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);
            }
        }
    }/*------------------↑↑↑書き換えるのはここまで↑↑↑-----------------*/
}
Follow Me!
  • Twitter