智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3590|回复: 11
打印 上一主题 下一主题

电机如何闭环

[复制链接]

5

主题

56

帖子

0

精华

高级会员

Rank: 4

积分
855
威望
403
贡献
220
兑换币
259
注册时间
2016-12-27
在线时间
116 小时
毕业学校
中堂小学
跳转到指定楼层
1#
发表于 2017-4-16 18:22:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
电机如何闭环???真心不会了,搞了一阵子,电机现在不听预定速度的话,一直加到最大速度。单独测试编码器读数没问题,一直搞不懂编码器读回来的是啥数,直接就可以和电机占空比相减????
附上我的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-------------------------*/
}

求大神看看.....
回复

使用道具 举报

5

主题

56

帖子

0

精华

高级会员

Rank: 4

积分
855
威望
403
贡献
220
兑换币
259
注册时间
2016-12-27
在线时间
116 小时
毕业学校
中堂小学
2#
 楼主| 发表于 2017-4-16 19:18:26 | 只看该作者
这是测出来编码器的波形。我也看不懂.....

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

5

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
481
威望
293
贡献
116
兑换币
97
注册时间
2016-12-28
在线时间
36 小时
毕业学校
JIANG
3#
发表于 2017-4-16 21:40:38 | 只看该作者
你这个增量式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,,,,这不是初始化吗,,,,
回复 支持 反对

使用道具 举报

5

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
481
威望
293
贡献
116
兑换币
97
注册时间
2016-12-28
在线时间
36 小时
毕业学校
JIANG
4#
发表于 2017-4-16 21:41:29 | 只看该作者
你的p和i参数怎么整定的?最近闭环我也搞不好
回复 支持 反对

使用道具 举报

5

主题

56

帖子

0

精华

高级会员

Rank: 4

积分
855
威望
403
贡献
220
兑换币
259
注册时间
2016-12-27
在线时间
116 小时
毕业学校
中堂小学
5#
 楼主| 发表于 2017-4-16 22:09:59 | 只看该作者
WorldLY 发表于 2017-4-16 21:41
你的p和i参数怎么整定的?最近闭环我也搞不好

我也搞不好啊,今晚只好加班了.....
回复 支持 反对

使用道具 举报

5

主题

56

帖子

0

精华

高级会员

Rank: 4

积分
855
威望
403
贡献
220
兑换币
259
注册时间
2016-12-27
在线时间
116 小时
毕业学校
中堂小学
6#
 楼主| 发表于 2017-4-16 22:11:13 | 只看该作者
WorldLY 发表于 2017-4-16 21:40
你这个增量式pid算法好像不太一样啊,
Motor_PWM=motor_P*(error-last_error)+motor_I*(error)+motor_D*(e ...

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

使用道具 举报

21

主题

366

帖子

0

精华

跨届大侠

种下一块板砖

Rank: 10Rank: 10Rank: 10

积分
6729
威望
2857
贡献
1688
兑换币
1892
注册时间
2015-6-13
在线时间
1092 小时
毕业学校
圣马家沟
7#
发表于 2017-4-17 00:56:11 | 只看该作者
一直搞不懂的就是为什么这么多人用增量式,其实并没有什么优势。

位置式是可以先调p的,只是稳态误差比较厉害,增量式只有p没法用,必须pi
回复 支持 反对

使用道具 举报

5

主题

56

帖子

0

精华

高级会员

Rank: 4

积分
855
威望
403
贡献
220
兑换币
259
注册时间
2016-12-27
在线时间
116 小时
毕业学校
中堂小学
8#
 楼主| 发表于 2017-4-17 08:47:32 | 只看该作者
2585341750 发表于 2017-4-17 00:56
一直搞不懂的就是为什么这么多人用增量式,其实并没有什么优势。

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

啥是增量式和位置式
回复 支持 反对

使用道具 举报

21

主题

366

帖子

0

精华

跨届大侠

种下一块板砖

Rank: 10Rank: 10Rank: 10

积分
6729
威望
2857
贡献
1688
兑换币
1892
注册时间
2015-6-13
在线时间
1092 小时
毕业学校
圣马家沟
9#
发表于 2017-4-17 10:00:40 | 只看该作者
b494971421 发表于 2017-4-17 08:47
啥是增量式和位置式

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

程序不是你自己写的吗
回复 支持 反对

使用道具 举报

11

主题

368

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4377
威望
2287
贡献
1340
兑换币
1240
注册时间
2017-2-21
在线时间
375 小时
10#
发表于 2017-4-17 11:34:24 | 只看该作者
b494971421 发表于 2017-4-16 19:18
这是测出来编码器的波形。我也看不懂.....

目测,阁下的编码器好像坏了!!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-11-5 13:03 , Processed in 0.052778 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表