kk

Dependencies:   QEI mbed

Fork of Jidouki by towa ngo

main.cpp

Committer:
blanchul96
Date:
2015-09-10
Revision:
0:6ea9b36d7630
Child:
1:65415bf8a01a

File content as of revision 0:6ea9b36d7630:

#include "mbed.h"
#include "QEI.h"
#define DELTA_T 0.004   //処理周期4msec
#define KP 0.0          //比例定数
#define KI 0.0          //積分定数
#define KD 0.0          //微分定数
#define n  100          //最大値最小値設定

mbed::PwmOut mypwm011(D11);
PwmOut mypwm012(D10);    //モーター1

PwmOut mypwm021(D6);
PwmOut mypwm022(D5);    //モーター2

PwmOut mypwm030(D3);    //アームのモータ?
PwmOut mypwm031(D4);

#define ROTATE_PER_REVOLUTIONS  24
QEI wheel01(   D7,D8,     //A相のピン、B相のピン
             NC,                             //回転数数えるピン(任意)
             ROTATE_PER_REVOLUTIONS,                          //1回転につき何パルスの出力をするか?
             QEI::X2_ENCODING );         //モード設定、X4_ENCODING→分解能が細かくなるが精度低い
             
QEI wheel02(   D9,D10,     //A相のピン、B相のピン
             NC,                             //回転数数えるピン(任意)
             ROTATE_PER_REVOLUTIONS,                          //1回転につき何パルスの出力をするか?
             QEI::X2_ENCODING );         //モード設定、X4_ENCODING→分解能が細かくなるが精度低い

DigitalOut myled(LED1);     //特に必要性のないLED定義
typedef signed long S32;
typedef float F32;
static S32 diff[2];
static F32 integral;

F32 pid_sample(int a,int b)
{
    int turn;
    F32 p,i,d;
    
    diff[0] = diff[1];
    diff[1]= a - b;
    integral += (diff[1]+diff[0])/2.0*DELTA_T;
    
    p = KP*diff[1];
    i = KI*integral;
    d = KD *(diff[1]-diff[0])/DELTA_T;
    
    turn = p + i + d;
    
    if(n<turn)turn = n;
    if(n>turn)turn = -n;    //最大値最小値の設定
    
    return turn;
    }

int main() {    while(true){
    int c =0;                //cはスイッチによって値うける、cの値を3パターン規定し、n,mに加算減算することで使えるものにする(または単純に定義してもいいか)
    int s = c;
    int m = c;
    mypwm011 = 1.0;
    mypwm012 = 0.0;
    
    mypwm021 = 1.0;
    mypwm022 = 0.0;
    
/*    mypwm.period_ms(10);
    mypwm.pulsewidth_ms(1);  */
 for(int i = s; i < wheel01.getPulses();)
        {       if(wheel01.getPulses()>wheel02.getPulses())
                        {mypwm012 = 1 - pid_sample(wheel01.getPulses(),wheel02.getPulses());}
                if(wheel01.getPulses()<wheel02.getPulses())
                        {mypwm022 = 1 - pid_sample(wheel02.getPulses(),wheel01.getPulses());}
                                                            }
    mypwm030 = 1.0;
    mypwm031 = 1.0;
    
    //アーム部の駆動
    
wheel01.reset();
wheel02.reset();   //パルス値の初期化

    mypwm011 = 0.0;
    mypwm012 = 1.0;         //逆転
    
    mypwm021 = 0.0;
    mypwm022 = 1.0;         //逆転 


for(int i = m; i > wheel01.getPulses();)
        {if(wheel01.getPulses()>wheel02.getPulses())
                        {mypwm011 = 1 - pid_sample(wheel01.getPulses(),wheel02.getPulses());}
                if(wheel01.getPulses()<wheel02.getPulses())
                        {mypwm021 = 1 - pid_sample(wheel02.getPulses(),wheel01.getPulses());}
                                                            }
            
    myled = 1;   //パルスがnの値にいくまで
    
    mypwm011 = 1.0;
    mypwm012 = 1.0;

    mypwm021 = 1.0;
    mypwm022 = 1.0;
    


wheel01.reset();
wheel02.reset();    //パルス値の初期化


}
}