servo練習問題集
[servo練習問題1]
D4に接続したサーボモータの角度を以下に示すパターンで動かせ。
1. 0度からスタートして+90度まで動かす。正し1800msecでそこまで到達する。
2.+90度から+45度まで1800msecで到達する。
3.+45度から0度まで450msecで到達する。
4. 1秒休む
1. 0度からスタートして+90度まで動かす。正し1800msecでそこまで到達する。
2.+90度から+45度まで1800msecで到達する。
3.+45度から0度まで450msecで到達する。
4. 1秒休む
[解答例]
#include "DSP28x_Project.h" // Device Headerfile and Examples Include File
#include "NolibM.h"
#include <stdio.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(;;) // 無限ループ
{/*------------------↓↓↓ここから書き換える↓↓↓--------------------*/
for(i=0;i<=90;i++)
{
servo(i,D4); //サーボモータを i度の位置まで回転
wait(20); //20ms待つ
}
for(i=90;i>=45;i--)
{
servo(i,D4); //サーボモータを i度の位置まで回転
wait(40); //40ms待つ
}
for(i=45;i>=0;i--)
{
servo(i,D4); //サーボモータを i度の位置まで回転
wait(10); //10ms待つ
}
wait(1000); //1秒休む
}/*------------------↑↑↑書き換えるのはここまで↑↑↑-----------------*/
}
[servo練習問題2]
D4に接続したサーボモータの角度を-90度から+90度までsin波で動かせ。
[解答例]
#include "DSP28x_Project.h" // Device Headerfile and Examples Include File
#include "NolibM.h"
#include <math.h> //math.hをsin関数を使用するときは必ずインクルードする
volatile struct EPWM_REGS *ePWM[] =
{ &EPwm1Regs, //intentional: (ePWM[0] not used)
&EPwm1Regs,
&EPwm2Regs,
&EPwm3Regs,
&EPwm4Regs,
&EPwm5Regs,
&EPwm6Regs,
&EPwm7Regs,
};
void main(void)
{
float f=0;
initNolibM(); //初期化
for(;;) // 無限ループ
{/*------------------↓↓↓ここから書き換える↓↓↓--------------------*/
f+=0.01;
servo(90*sin(f),D4);
wait(10);
}/*------------------↑↑↑書き換えるのはここまで↑↑↑-----------------*/
}
[servo練習問題3]
1. 10[s]で-90[deg]~90[deg]を等速回転させる。
HINT: 時間変化量を計算し、プログラムする.
HINT: 時間変化量を計算し、プログラムする.
#include "DSP28x_Project.h" // Device Headerfile and Examples Include File
#include "NolibM.h"
#include <math.h> //math.hをsin関数を使用するときは必ずインクルードする
volatile struct EPWM_REGS *ePWM[] =
{ &EPwm1Regs, //intentional: (ePWM[0] not used)
&EPwm1Regs,
&EPwm2Regs,
&EPwm3Regs,
&EPwm4Regs,
&EPwm5Regs,
&EPwm6Regs,
&EPwm7Regs,
};
void main(void)
{
float f_ang;
initNolibM(); //初期化
for(;;) // 無限ループ
{/*------------------↓↓↓ここから書き換える↓↓↓--------------------*/
for(f_ang=-90;f_ang<90;f_ang+=0.36)
{
servo((int)f_ang,D4);
wait(20);
}
for(f_ang=90;f_ang>-90;f_ang-=0.36)
{
servo((int)f_ang,D4);
wait(20);
}
}/*------------------↑↑↑書き換えるのはここまで↑↑↑-----------------*/
}
[servo練習問題4]
以下パターンで動かす
1. 1sで0deg->45degを移動
2. 2s 45deg->90deg
3. 5s 90deg-> 0deg
4. 10s 0deg -> -90deg
5. 4s -90deg -> 90deg
6. 10s 90deg->0deg
HINT: 刻み幅20ms
1. 1sで0deg->45degを移動
2. 2s 45deg->90deg
3. 5s 90deg-> 0deg
4. 10s 0deg -> -90deg
5. 4s -90deg -> 90deg
6. 10s 90deg->0deg
HINT: 刻み幅20ms
#include "DSP28x_Project.h" // Device Headerfile and Examples Include File
#include "NolibM.h"
#include <math.h> //math.hをsin関数を使用するときは必ずインクルードする
volatile struct EPWM_REGS *ePWM[] =
{ &EPwm1Regs, //intentional: (ePWM[0] not used)
&EPwm1Regs,
&EPwm2Regs,
&EPwm3Regs,
&EPwm4Regs,
&EPwm5Regs,
&EPwm6Regs,
&EPwm7Regs,
};
void main(void)
{
int i;
float f_ang;
float diff;
static float fang_pattern[][2]={{0.0,0.0},{45.0,1.0},{90.0,2.0},{0.0,5.0},{-90.0,10.0},{90.0,4.0},{0.0,10.0}}; //サーボが動くパターンを配列化{角度、到達時間}
initNolibM(); //初期化
for(;;) // 無限ループ
{/*------------------↓↓↓ここから書き換える↓↓↓--------------------*/
for(i=0;i<7;i++)
{
diff=(fang_pattern[i+1][0]-fang_pattern[i][0])/fang_pattern[i+1][1]; // 一秒間での角度差分
if(diff>0) //現在のとの角度差分が正の場合
{
for(f_ang=fang_pattern[i][0];f_ang<=fang_pattern[i+1][0];f_ang+=diff*0.02)
{
servo((int)f_ang,D4);
wait(20);
}
}
else //現在のとの角度差分が負の場合
{
for(f_ang=fang_pattern[i][0];f_ang>=fang_pattern[i+1][0];f_ang+=diff*0.02)
{
servo((int)f_ang,D4);
wait(20);
}
}
}
}/*------------------↑↑↑書き換えるのはここまで↑↑↑-----------------*/
}
[servo練習問題5]
SW1のON/OFFによってサーボの動きを制御する。
ONであれば右に回転、OFFであれば左に回転する。
SW1の状況でリアルタイムに反応するようにする。
注意:角度リミッターを+90/-90で付けないとサーボに付加がかかる
ONであれば右に回転、OFFであれば左に回転する。
SW1の状況でリアルタイムに反応するようにする。
注意:角度リミッターを+90/-90で付けないとサーボに付加がかかる
[解答例]
#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 ang=0;
initNolibM(); //初期化
for(;;) // 無限ループ
{/*------------------↓↓↓ここから書き換える↓↓↓--------------------*/
if(sw1(ON))
{
ang+=2;
}
else
{
ang-=2;
}
//角度リミッター
if(ang>=90)ang=90;
if(ang<=-90)ang=-90;
servo(ang,D4);
wait(20); //サンプリングタイムは20msec
}/*------------------↑↑↑書き換えるのはここまで↑↑↑-----------------*/
}

