智能车制作

标题: 电机如何闭环 [打印本页]

作者: b494971421    时间: 2017-4-16 18:22
标题: 电机如何闭环
电机如何闭环???真心不会了,搞了一阵子,电机现在不听预定速度的话,一直加到最大速度。单独测试编码器读数没问题,一直搞不懂编码器读回来的是啥数,直接就可以和电机占空比相减????
附上我的PID代码:
void motor_PID(int32 left_motor, int32 right_motor, float P, float I ,float D)
{
    static uint32 left_ek_2 = 0, left_ek_1 = 0, right_ek_1 = 0, right_ek_2 = 0, first_run = 0;
    int32 error_left = 0, error_right = 0;
    int32 en_count_left = 0, en_count_right = 0;;
    left_motor *= 0.02;         right_motor *= 0.02;
    en_count_left  = ftm_quad_get(encode_left);     //读速度
    en_count_right = ftm_quad_get(encode_right;    //取整

    up= en_count_right;
    if(first_run == 0)
    {
        first_run = 1;
        left_ek_2 = 1; right_ek_2 = 1;
        left_ek_1 = 1; right_ek_1 = 1;
    }
    error_left = left_motor - en_count_left;   error_right = right_motor - en_count_right;
    PWM_left = PWM_left_last + (int32)P * error_left + I * (error_left - (2 * left_ek_1 + left_ek_2)) + D *(error_left - left_ek_1);
    PWM_right = PWM_right_last + (int32)P * error_right + I * (error_right - (2 * right_ek_1 + right_ek_2)) + D *(error_right -  right_ek_1);
//____________________更新偏差_______________________//
    left_ek_2 = left_ek_1;      right_ek_2 = right_ek_1;
    left_ek_1 = error_left;     right_ek_2 = error_right;

//____________________电机限额______________________//
    if(PWM_left > MAX_left_motor_PWM)
    {
        PWM_left = MAX_left_motor_PWM;
    }
    else if(PWM_left < MIN_left_motor_PWM)
    {
        PWM_left = MIN_left_motor_PWM;
    }

    if(PWM_right > MAX_right_motor_PWM)
    {
        PWM_right = MAX_right_motor_PWM;
    }
    else if(PWM_right < MIN_right_motor_PWM)
    {
        PWM_right = MIN_right_motor_PWM;
    }
    PWM_left_last = PWM_left;   PWM_right_last = PWM_right;
//_____________________送给电机_________________________//
    if(PWM_left > 0)   //正转
    {
        PWM_left = PWM_left;
        ftm_pwm_init(FTM0, FTM_CH4, 20000, PWM_left);
        ftm_pwm_init(FTM0, FTM_CH5, 20000, 0);
    }
    else if(PWM_left < 0)      //反转
    {
        PWM_left = -PWM_left;
        ftm_pwm_init(FTM0, FTM_CH4, 20000, 0);
        ftm_pwm_init(FTM0, FTM_CH5, 20000, PWM_left);
    }

    if(PWM_right > 0)          //正转
    {
        PWM_right = PWM_right;
        ftm_pwm_init(FTM0, FTM_CH6, 20000, PWM_right);
        ftm_pwm_init(FTM0, FTM_CH7, 20000, 0);
    }
    else if(PWM_right < 0)    //反转
    {
        PWM_right = -PWM_right;
        ftm_pwm_init(FTM0, FTM_CH6, 20000, 0);
        ftm_pwm_init(FTM0, FTM_CH7, 20000, PWM_right);
    }
    PWM_right_last = PWM_right;
    PWM_left_last = PWM_left;
/*-------------------end-------------------------*/
}

求大神看看.....

作者: b494971421    时间: 2017-4-16 19:18
这是测出来编码器的波形。我也看不懂.....

作者: WorldLY    时间: 2017-4-16 21:40
你这个增量式pid算法好像不太一样啊,
Motor_PWM=motor_P*(error-last_error)+motor_I*(error)+motor_D*(error+pre_error-2*last_error); //增量式PID公式
    Motor_PWM+= Motor_PWM;
是这样的吧,
还有你给电机速度为什么是ftm_pwm_init,,,,这不是初始化吗,,,,

作者: WorldLY    时间: 2017-4-16 21:41
你的p和i参数怎么整定的?最近闭环我也搞不好
作者: b494971421    时间: 2017-4-16 22:09
WorldLY 发表于 2017-4-16 21:41
你的p和i参数怎么整定的?最近闭环我也搞不好

我也搞不好啊,今晚只好加班了.....

作者: b494971421    时间: 2017-4-16 22:11
WorldLY 发表于 2017-4-16 21:40
你这个增量式pid算法好像不太一样啊,
Motor_PWM=motor_P*(error-last_error)+motor_I*(error)+motor_D*(e ...

电机速度占空比的函数不知道为什么一输入就疯转,只有初始化好使.....

作者: 2585341750    时间: 2017-4-17 00:56
一直搞不懂的就是为什么这么多人用增量式,其实并没有什么优势。

位置式是可以先调p的,只是稳态误差比较厉害,增量式只有p没法用,必须pi
作者: b494971421    时间: 2017-4-17 08:47
2585341750 发表于 2017-4-17 00:56
一直搞不懂的就是为什么这么多人用增量式,其实并没有什么优势。

位置式是可以先调p的,只是稳态误差比 ...

啥是增量式和位置式

作者: 2585341750    时间: 2017-4-17 10:00
b494971421 发表于 2017-4-17 08:47
啥是增量式和位置式

控制的是输出增量的就是增量式

程序不是你自己写的吗

作者: 星空_xALOC    时间: 2017-4-17 11:34
b494971421 发表于 2017-4-16 19:18
这是测出来编码器的波形。我也看不懂.....

目测,阁下的编码器好像坏了!!!!

作者: Teternal    时间: 2017-4-17 14:21
你需要去学习PID控制算法……
作者: scglyh    时间: 2017-4-20 19:56
编码器输出你应该上拉一下




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2