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 }/*------------------↑↑↑書き換えるのはここまで↑↑↑-----------------*/ }