Sample Programs

servo練習問題集

[servo練習問題1]

D4に接続したサーボモータの角度を以下に示すパターンで動かせ。 
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: 時間変化量を計算し、プログラムする.
#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
#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で付けないとサーボに付加がかかる

[解答例]

#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
	}/*------------------↑↑↑書き換えるのはここまで↑↑↑-----------------*/
}
Follow Me!
  • Twitter