2月25日

Dependencies:   mbed SpeedController2_25 ros_lib_kinetic

main.cpp

Committer:
aoikoizumi
Date:
2019-11-08
Revision:
1:0e8ec231cb2f
Parent:
0:6db935b161f8
Child:
2:c4e456559941

File content as of revision 1:0e8ec231cb2f:

//CAN通信で受け取った(double)rotate‗1~rotate‗3に対し、実際に回転数制御を行う
#include "mbed.h"
#include "EC.h" //Encoderライブラリをインクルード
#include "SpeedController.h"    //SpeedControlライブラリをインクルード
#define RESOLUTION 512  //分解能
//#define BASIC_SPEED 1   //動確用
//#define TEST_DUTY 0.3   //動確用


Ec4multi EC_1(p15,p16,RESOLUTION);
Ec4multi EC_2(p17,p18,RESOLUTION);

SpeedControl motor_1(p21,p22,50,EC_1);
SpeedControl motor_2(p23,p24,50,EC_2);

Ticker motor_tick;  //角速度計算用ticker
Serial pc(USBTX,USBRX);

Timer timer;


int j=0;
double rotate_1=0,rotate_2=0;
double motor1_omega[1000]={},motor2_omega[1000]={},time_when[1000];
int motor1_count[1000]={},motor2_count[1000]={};

void CalOmega()
{
    motor1_count[j]=EC_1.getCount();
    motor1_omega[j]=EC_1.getOmega();
    motor2_count[j]=EC_2.getCount();
    motor2_omega[j]=EC_2.getOmega();
//    time_when[j]=EC_1.timer_.read();
    if(rotate_1==0) motor_1.stop();
    else motor_1.Sc(rotate_1);
    if(rotate_2==0) motor_2.stop();
    else motor_2.Sc(rotate_2);
    j++;
}

int main()
{
    motor_1.period_us(50);
    motor_2.period_us(50);
    motor_1.setEquation(0.322,0.08,0,0.0100);    //求めたC,Dの値を設定
    motor_2.setEquation(0.0302,0.0755,-0.0241,0.1301);    //求めたC,Dの値を設定
    motor_1.setPDparam(0,0.0);  //PIDの係数を設定
    motor_2.setPDparam(0,0.0);  //PIDの係数を設定
    motor_tick.attach(&CalOmega,0.05);

    while(1) {

        if(pc.readable()) {
            char sel=pc.getc();
            if(sel=='q') {
                for(int i=0; i<1000; i++) {

//                    pc.printf("%f    ",time_when[i]);
                    pc.printf("%f,%f    ",motor1_omega[i],motor2_omega[i]);
                    pc.printf("%d,%d\r\n",motor1_count[i],motor2_count[i]);
                }
            }
        }
    }
}