4018|3

661

帖子

29

TA的资源

版主

楼主
 

20“万里”树莓派小车——电机控制学习(控制速度) [复制链接]

       前面介绍了树莓派电机速度的获取,也介绍了树莓派的定时器的使用,将这两者结合,在使用控制算法,就可也对电机速度进行控制了。

PID控制算法

速度控制使用PID算法,这个网上很多介绍,原理图如下图所示。

 

实际使用PI控制就可以了,也就是速度误差乘以Kp系数,然后速度误差的累计乘以Ki系数,然后两者相加,就是给电机的控制值。这两个系数的值的选择则是控制的难点。

代码编写

  • #include <stdio.h>
  • #include <wiringPi.h>
  • #include <iostream>
  • #include "Emakefun_MotorShield.h"
  • #define SPEED_INTEGRAL_MAX  1
  • float Speed_Kp=255,Speed_Ki=150;
  • float Set_Speet=0.5;
  • int A_pin=21;
  • int B_pin=22;
  • float Encoder_Integral=0;
  • long Cnt;
  • long Cha;
  • long now,pre_time;
  • float Speed=0;
  • float Set_PWM_float=0;
  • uint8_t Set_PWM=0;
  • Emakefun_DCMotor *DCmotor1 ;
  • //电机速度PI控制函数
  • float Speed_PI(float Now_Speed,float Set_Speet)
  • {
  • static float fP;
  • fP=Set_Speet-Now_Speed;
  • Encoder_Integral+=fP;
  • if(Encoder_Integral>SPEED_INTEGRAL_MAX)   Encoder_Integral=SPEED_INTEGRAL_MAX;           
  • return fP*Speed_Kp+Encoder_Integral*Speed_Ki;  
  • }
  • //外部中断回调函数,用来计数电机速度
  • void Interrupt (void) {
  •    Cnt++;
  • }
  • //定时器线程函数
  • PI_THREAD (timer)
  • {
  •   for (;;)
  •   {
  • now=micros();
  •    Cha=(now-pre_time);
  • Speed=(float)Cnt/Cha*50;
  • Cnt=0;
  • pre_time= now;
  • Set_PWM_float=Speed_PI(Speed, Set_Speet);
  • if(Set_PWM_float>255)Set_PWM_float=255;
  • if(Set_PWM_float<0)Set_PWM_float=0;
  • Set_PWM=(uint8_t)Set_PWM_float;
  • DCmotor1->setSpeed(Set_PWM);
  •   printf ("%ld,%f,%f,%f\n",Cha,Speed,Set_PWM_float,Encoder_Integral);
  • delay(100);
  •   }
  • }
  • int main () {
  • Emakefun_MotorShield Pwm = Emakefun_MotorShield();
  • Pwm.begin(50);
  •   DCmotor1 = Pwm.getMotor(1);
  •   DCmotor1->setSpeed(0);
  •   DCmotor1->run(FORWARD);
  •    wiringPiSetup () ;
  •    wiringPiISR (A_pin, INT_EDGE_BOTH, &Interrupt) ;
  •    wiringPiISR (B_pin, INT_EDGE_BOTH, &Interrupt) ;
  •    piThreadCreate (timer) ;
  • while(1) {
  • delay(1000);
  • }
  • }

参数调试

代码中的参数是要通过计算与调试得出来的,下面来分别介绍。

最大速度归一化:先让电机满速运行,得出满速下计算出来电机最大的速度大约0.02,(这个数值并没有实际速度含义),乘以50让最大速度变成1。

Kp参数确定:电机控制数值是0到255,而最大速度是1,那Kp就直接确定为255。

Ki参数确定:几分参数是不要不断的调节的,既要快速响应,同时也不能太大导致震荡。经过不断的调节,选取150。

积分限制参数确定:积分如果不对最大值进行限制,那么积分的数值就会无限的大下去,这样显然是不行的,代码运行后输出如下图。

输出第一列是时间,第二列是速度,第三列是控制量,第四列是积分值,最理想情况是运行后积分控制输出为零,当然有值也是可以,通过给轮子一些阻力,这个数值不会超过1,那么积分限制参数就设置为1。

运行效果

运行后树莓派会控制轮子按照设置好的速度进行转动,从打印出来的速度看,速度一直维持的不错,可是控制量却变化十分剧烈,而且听声音也能听出来轮子转速一快一慢的。但是轮子的实际速度我是无法测量的,只有等全部代码都写好后,在地上实际跑看效果才知道。

问题

工程中将驱动库文件和应用程序文件放在一个文件夹里面,这样做浪费空间,也不利于复用。想将驱动库额外的放在另一个文件中,要怎么设置头文件包含路径呢?

源码

GitHub

Gitee

查看本帖全部内容,请登录或者注册
此帖出自创意市集论坛

最新回复

"万里"树莓派小车汇总贴: lb8820265的“万里”树莓派小车开源分享 - DIY/开源硬件专区 - 电子工程世界-论坛 (eeworld.com.cn)   目录:   “万里”树莓派小车开张贴  1“万里”树莓派小车——建立项目仓库 2“万里”树莓派小车——python学习(Thonny的使用) 3“万里”树莓派小车——python学习(定时任务) 4“万里”树莓派小车——C++学习(编译与运行,geany使用) 5“万里”树莓派小车——wiringPi学习(延时与线程模拟定时器) 6“万里”树莓派小车——wiringPi学习(PWM与外部中断模拟定时器) 7“万里”树莓派小车——RPi.GPIO学习(PWM与外部中断模拟定时器) 8“万里”树莓派小车——socket学习(本机通讯) 9“万里”树莓派小车——socket学习(TCP两机通讯) 10“万里”树莓派小车——socket学习(UDP两机通讯) 11“万里”树莓派小车——socket学习(Android发送) 12“万里”树莓派小车——socket学习(Android收发) 13“万里”树莓派小车——配件准备 14“万里”树莓派小车——电机驱动学习 15“万里”树莓派小车——光电编码器学习(正反转的判断) 16“万里”树莓派小车——光电编码器学习(转速的获取) 17“万里”树莓派小车——VSCode学习(编译和调试) 18“万里”树莓派小车——Makefile学习 19“万里”树莓派小车——VSCode学习(多C文件链接调试) 20“万里”树莓派小车——电机控制学习(控制速度) 21“万里”树莓派小车——电机控制学习(4轮速度控制) 22“万里”树莓派小车——手机遥控电机转动 23“万里”树莓派小车——无屏幕连接树莓派 24“万里”树莓派小车——树莓派64位系统bullseye跑分测试 25“万里”树莓派小车——纳姆轮控制 26“万里”树莓派小车——程序开机启动 27“万里”树莓派小车——固定和获取树莓派IP地址 28“万里”树莓派小车——小车组装 29“万里”树莓派小车——直行偏向问题与新控制模式 30.“万里”树莓派小车——第一阶段完成展示(从零开始介绍)   详情 回复 发表于 2022-3-21 13:38
点赞 关注
个人签名QQ:252669569
 
 

回复
举报

1万

帖子

202

TA的资源

管理员

来自 4楼
 

"万里"树莓派小车汇总贴:

lb8820265的“万里”树莓派小车开源分享 - DIY/开源硬件专区 - 电子工程世界-论坛 (eeworld.com.cn)

 

目录:

 

“万里”树莓派小车开张贴 

1“万里”树莓派小车——建立项目仓库

2“万里”树莓派小车——python学习(Thonny的使用)

3“万里”树莓派小车——python学习(定时任务)

4“万里”树莓派小车——C++学习(编译与运行,geany使用)

5“万里”树莓派小车——wiringPi学习(延时与线程模拟定时器)

6“万里”树莓派小车——wiringPi学习(PWM与外部中断模拟定时器)

7“万里”树莓派小车——RPi.GPIO学习(PWM与外部中断模拟定时器)

8“万里”树莓派小车——socket学习(本机通讯)

9“万里”树莓派小车——socket学习(TCP两机通讯)

10“万里”树莓派小车——socket学习(UDP两机通讯)

11“万里”树莓派小车——socket学习(Android发送)

12“万里”树莓派小车——socket学习(Android收发)

13“万里”树莓派小车——配件准备

14“万里”树莓派小车——电机驱动学习

15“万里”树莓派小车——光电编码器学习(正反转的判断)

16“万里”树莓派小车——光电编码器学习(转速的获取)

17“万里”树莓派小车——VSCode学习(编译和调试)

18“万里”树莓派小车——Makefile学习

19“万里”树莓派小车——VSCode学习(多C文件链接调试)

20“万里”树莓派小车——电机控制学习(控制速度)

21“万里”树莓派小车——电机控制学习(4轮速度控制)
22“万里”树莓派小车——手机遥控电机转动

23“万里”树莓派小车——无屏幕连接树莓派

24“万里”树莓派小车——树莓派64位系统bullseye跑分测试

25“万里”树莓派小车——纳姆轮控制

26“万里”树莓派小车——程序开机启动

27“万里”树莓派小车——固定和获取树莓派IP地址

28“万里”树莓派小车——小车组装

29“万里”树莓派小车——直行偏向问题与新控制模式

30.“万里”树莓派小车——第一阶段完成展示(从零开始介绍)

此帖出自创意市集论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
个人签名玩板看这里:
https://bbs.eeworld.com.cn/elecplay.html
EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!
 
 
 

回复

1万

帖子

25

TA的资源

版主

沙发
 

看着20“万里”标题,很感人啊

此帖出自创意市集论坛
 
 
 

回复

2万

帖子

74

TA的资源

管理员

板凳
 

加油 :)

此帖出自创意市集论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 
 

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

猜你喜欢
随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播报名| TI 面向楼宇和工厂自动化行业的毫米波雷达解决方案
【内容简介】TI 60GHz IWRL6432和 IWRL1432毫米波雷达传感器如何帮助解决楼宇和工厂自动化应用中的感应难题
【直播时间】5月28日(周三)上午10:00
【直播礼品】小米双肩包、contigo水杯、胶囊伞、安克充电器

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 14

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表