test4

Dependencies:   mbed BufferedSerial LS7366LIB2 FastPWM

motor.h

Committer:
gohgwaja
Date:
2020-05-11
Revision:
0:7cff999a7f5c
Child:
3:7b195612e26d
Child:
4:bf278ddb8504

File content as of revision 0:7cff999a7f5c:

#ifndef _MOTOR_H_
#define _MOTOR_H_

#include "FastPWM.h"



FastPWM pwm1(MOTOR_PWM1, -1);
FastPWM pwm2(MOTOR_PWM2, -1);
FastPWM pwm3(MOTOR_PWM3, -1);
FastPWM pwm4(MOTOR_PWM4, -1);
FastPWM pwm5(MOTOR_PWM5, -1);
FastPWM pwm6(MOTOR_PWM6, -1);
FastPWM pwm7(MOTOR_PWM7, -1);

void motor_init()
{
    pwm1.period_us(2500);
    pwm2.period_us(2500);
    pwm3.period_us(2500);
    pwm4.period_us(2500);
    pwm5.period_us(2500);
    pwm6.period_us(2500);
    pwm7.period_us(2500);
    
    pwm7.write(0.2);
}

int ex_encoder[6]={0,0,0,0,0,0};
int now_encoder[6]={0,0,0,0,0,0};
int stop_cnt[6]={0,0,0,0,0,0};

double now_motor_duty[6]={0,0,0,0,0,0};
double after_motor_duty[6]={0,0,0,0,0,0};
double motor_currnt_cut=1.0;
double sum_duty_123axis=0;
double sum_duty_456axis=0;
double total_duty=0;;
int duty_limit=1000;

int duty_limit_cnt=0;
bool duty_limit_on=false;

int error_check_boost_duty[6]={0,};

void motor_power(int motor_num,double percent)
{
    
    percent=-percent;
    double output=offset[motor_num];
    if(percent<-500)
        percent=-500;
    if(percent>500)
        percent=500;
    
        
    if(percent>150 || percent<-150)
    {
        now_encoder[motor_num]=encoder_data[motor_num];
    
        if(ex_encoder[motor_num]==now_encoder[motor_num])
            stop_cnt[motor_num]++;
        else
            stop_cnt[motor_num]=0;
    
        ex_encoder[motor_num]=now_encoder[motor_num];
        
        if(stop_cnt[motor_num]>300)
        {
            if(abs(error_check_boost_duty[motor_num])>500)
                motor_onoff[motor_num]=false;  
            else
            {
                if(percent<0)
                    error_check_boost_duty[motor_num]--;
                else
                    error_check_boost_duty[motor_num]++;
                
                percent=percent+error_check_boost_duty[motor_num];
            }
                
        }
    }else
    {
      stop_cnt[motor_num]=0;  
      
      if(error_check_boost_duty[motor_num]<0)
        error_check_boost_duty[motor_num]++;
      else if(error_check_boost_duty[motor_num]>0)
        error_check_boost_duty[motor_num]--;
        
    }
    
    
    
        now_motor_duty[motor_num]=abs(percent);
    
    sum_duty_123axis    =   now_motor_duty[0]+now_motor_duty[1]+now_motor_duty[2]+now_motor_duty[3];
    sum_duty_456axis    =   now_motor_duty[4]+now_motor_duty[5];
    
    total_duty=sum_duty_123axis;
    
    
    if(total_duty>duty_limit)
        motor_currnt_cut=(duty_limit/total_duty);
    else
        motor_currnt_cut=1.0;
    
    if(duty_limit_on)
    {
        if( (motor_num==1) || (motor_num==2) || (motor_num==3) || (motor_num==4) )
            percent=percent*motor_currnt_cut;
        
        duty_limit_cnt++;
    if(duty_limit_cnt>200)
    {
      duty_limit_cnt=0;
      pc.printf("%0.1f,%4.0f,%4.0f,%4.0f,%4.0f\r\n",motor_currnt_cut,now_motor_duty[0],now_motor_duty[1],now_motor_duty[2],now_motor_duty[3]);  
    }   
    }
    
        if(motor_num==0)
        {
            if(motor_onoff[motor_num]==false)
                percent=1000;
                
            output = 1-(offset[motor_num] + percent)/2500;
            pwm1.write(output);
        }
        else if(motor_num==1)
        {
            if(motor_onoff[motor_num]==false)
                percent=1000;
                
            output = 1-(offset[motor_num] + percent)/2500;
            pwm2.write(output);
        }
        else if(motor_num==2)
        {
            if(motor_onoff[motor_num]==false)
                percent=1000;
                
            output = 1-(offset[motor_num] + percent)/2500;
            pwm3.write(output);
        }
        else if(motor_num==3)
        {
            if(motor_onoff[motor_num]==false)
                percent=1000;
                
            output = 1-(offset[motor_num] + percent)/2500;
            pwm4.write(output);
        }
        else if(motor_num==4)
        {
            if(motor_onoff[motor_num]==false)
                percent=1000;
                
            output = 1-(offset[motor_num] + percent)/2500;
            pwm5.write(output);
        }
        else if(motor_num==5)
        {
            if(motor_onoff[motor_num]==false)
                percent=1000;
                
            output = 1-(offset[motor_num] + percent)/2500;
            pwm6.write(output);
        }
}


#endif