1

DATA_COMMAND/data_command.cpp

Committer:
ccxx1200
Date:
2020-03-12
Revision:
10:f94e325fc1e6
Parent:
9:bf02fd2d7a0a

File content as of revision 10:f94e325fc1e6:

#include "data_command.h"
#include "leg_message.h"

Serial      command(PC_12, PD_2);
//DigitalOut  sf_m_c(PC_12);
int e_num=0;
int w_num=0;
int enabled = 0;                                                                // 进入电机模式标志位
int counter = 0;                                                                // 输出计数器
int c_control = 0; 
int send_enable=0; 
int e_state=e_REST_MODE; 
int w_state=w_REST_MODE; 
int duoji_state= DUOJI_REST__MODE ;
int duoji_command=0;                                                           // 命令帧标志位
float SP_wf = 0, SP_ef = 0; 
int e_data[2]={0};
int w_data[2]={0};  
char data[3]={0};
int data_num=0;                                          
void serial_command_isr()
{   
    while(command.readable())  //从Matlab接收到命令(字符)
    {
        char c =command.getc();//将从matlab接收的命令赋值到c
         data[data_num]=c;//把matlab的命令放入数组中,两个电机,数组有两个变量
         data_num++;
         if(data_num>=3)
         data_num=0;
        if(data[0]=='e')//matlab第一个字符(命令)输入‘e'电机复位停止工作//肘关节电机
        {
            e_state=e_REST_MODE;
            send_enable=0;
            printf("\n\r ejoint Motor Reset Mode \r");    
        }
        if(data[1]=='e')//matlab第二个字符(命令)输入‘e'电机复位停止工作//腕关节电机
        {
            w_state=w_REST_MODE;
            send_enable=0;
            printf("\n\r wjoint Motor Reset Mode \r");    
        }
        
          if(data[2]=='k') //matlab第三个字符(命令)手爪舵机,输入'k'舵机进入工作准备状态
        {
            duoji_state= DUOJI_MODE ;
              
        }
       
        
        
        if((e_state==e_REST_MODE)|| (e_state==e_REST_MODE))      //matlab第二次数据(指上一次为复位状态)
            {
                switch(data[0]) //肘关节数据命令
             {
                case('m'):
                 printf("\n\rMotor entering E motor mode\r");
                 EnterMotorMode(&EF_can);                                            // 电机位置锁定 
                 send_enable = 0; 
                 e_state=MOTOR_MODE; 
                break;
            
                case('z'):
                 printf("\n\rMotor zeroing\r");
                 Zero(&EF_can);
                 send_enable = 0;
                  e_state=ZERO_MODE; 
                  break;  
              }
               switch(data[1]) //腕关节数据命令
             {
                case('m'):
                 printf("\n\rMotor entering E motor mode\r");
                 EnterMotorMode(&WF_can);                                            // 电机位置锁定 
                 send_enable = 0; 
                 w_state=MOTOR_MODE; 
                break;
            
                case('z'):
                 printf("\n\rMotor zeroing\r");
                 Zero(&WF_can);
                 send_enable = 0;
                  w_state=ZERO_MODE; 
                  break;  
              }
             }
       if((e_state==MOTOR_MODE)&&(data[0]!='m'))//肘关节数据判断成功,电机跟随位置转动
        { 
           //a_control.ef.p_des=int(c);//*2*PI/360;
           a_control.ef.p_des=int(data[0])*2*PI/360;//matlab给定的肘关节角度信息
            send_enable = 1;
            printf("f: %.3f\n\r", a_control.ef.p_des);
            }
            
       if((w_state==MOTOR_MODE)&&(data[1]!='m'))//腕关节数据判断成功,电机跟随位置转动
        { 
           a_control.wf.p_des=int(data[1])*2*PI/360;//matlab给定的腕关节角度信息
            send_enable = 1;
            printf("f: %.3f\n\r", a_control.wf.p_des);
            }
        if((duoji_state==DUOJI_MODE)&&(data[2]!='k'))//腕关节数据判断成功,电机跟随位置转动
        { 
          duoji_control.p_des=int(data[2]);//matlab给定的舵机(手爪)的位置信息
          duoji_command=1;
          printf("\n\r Duoji Start\r"); //舵机开始运动到指定的位置
          printf("f: %.3f\n\r", duoji_control.p_des);//显示舵机的角度信息
            }
            }
        }

    }

  

void command_control()
{
   a_control.ef.v_des=0;  //v设置为0
   a_control.ef.kp=50;//0.0012;//kp通过实验得到
   a_control.ef.kd= 0;   
   a_control.ef.t_ff= 0;//forwade_torque=0;
   
   a_control.wf.v_des=0;
   a_control.wf.kp=0.0012; //kp通过实验得到
   a_control.wf.kd= 0;  
   a_control.wf.t_ff= 0;
    
}