4

抢答

【回复讨论即得200IC币】在NXP恩智浦智能车比赛中,电磁直立组是近年来新增的一项有趣项目。比赛是要求仿照两轮自平衡电动车的行进模式,让车模以两个后轮驱动进行直立行走。在电磁组比赛中,利用了原来C型车模双后轮驱动的特点,实现两轮自平衡行走。相对于传统的四轮行走的车模竞赛模式,车模直立行走在硬件设计、控制软件开发以及现场调试等方面提出了更高的要求。接下来由19年的参赛者:一城烟雨一楼台,分享自己参赛时,从零基础,到理解平衡车,实战比赛的学习心得。直立车模的调试分为三个部分:1.直立环 2.速度环3.转向环有人说速度环可以省略,我认为在你的转向环调得好的情况下可以省略,因为失去了速度环的车模就会一直处于加速状态(在弯道时由于摩擦的作用会使速度降下来),这就会导致在直道入弯时的速度无法控制,在转向环不强的时候很容易飞出赛道。直立组先上直立环的代码,当然这种代码网上很多,形式也都差不多。 /@@**************************************************************************函数功能:小车平衡电机占空比控制,直立PD控制入口参数:倾角角度、角速度返回  值:平衡控制用PWM**************************************************************************/int Balance_Ctrl_Pwm(float Angfloat Gyro){    float Bias=Ang-QingJiaoZhongZhi;        //中值,求出平衡的角度中值 和机械相关    int balance;    float kp = 42 kd = - 26;     balance= -(int)(kp*Bias+Gyro*kd);   //计算平衡控制的电机PWM  PD控制   kp是P系数 kd是D系数         return balance;}   变量的含义QingJiaoZhongZhi // 小车平衡时候的数值,关闭电机,用手使得小车正好平衡时候的float Angfloat Gyro //这两个是mpu6050卡尔曼滤波后的倾角角度、角速度。然后再来说一下PD两个参数的调试。先调试kp,需要把kd置为0。首先需要确定正负,我们先随便给一个正值例如kp=10吧。然后我们相对于车模的平衡角度倾斜车模,如果车轮的转向和你倾斜车模的方向一致则可以确定kp应取正值,否则kp取负值。然后再来确定大小 逐渐增大Kp直至车身出现大幅低频摇摆的直立在地上,然后把这个数值乘以0.6基本就是一个比较稳定kp值。调试kd时同样需要把kp置为0。首先需要确定正负:例如先给他个kd=2;当你转动车模时车轮的转向与你车模转向一直则kd是正值,否则就是负值,注意pd与车模的平衡角度无关。大小的话同样也是逐渐增大直至出现低幅高频抖动时停止,也是把这个数值乘以0.6即可。注意:这里涉及到一个负反馈调节因为直立环是要保证正常站立。因为当实际角度脱离平衡角度时,轮子只有给车身一个更大的同方向的力才会使车身保持平衡。如果还是不理解可以拿支笔放在手指上试试,手指怎样移动才会使笔立在手指上?速度环速度环也是一个标准的负反馈例子。例如:我们想让车模加速,速度环就会降低车轮的速度使车身前倾,就会导致直立环起作用让车轮加速保持直立。这就完成了一个加速过程。需要注意的是速度环会干扰直立环,如果速度环的强度过大,车身就会非常不稳定。我在调用该函数时每一百次直立环才会调用一次速度环,这样就降低了速度环对直立环的干扰。/@@**************************************************************************函数功能:速度PI控制 修改前进后退速度,请修Target_Velocity,比如,改成60就比较慢了入口参数:左轮编码器、右轮编码器返回  值:速度控制PWM**************************************************************************/float Target_Velocity = 0;extern float kp_steep;int Velocity_Ctrl_Pwm(int encoder_leftint encoder_right){    static float VelocityEncoder_LeastEncoder;    static float Encoder_Integral;    float sudumax = 2700;    float kp=kp_steepki = kp/200;      //速度PI控制    Encoder_Least =(encoder_left+encoder_right)-Target_Velocity;                    //获取最新速度偏差==测量速度(左右编码器之和)-目标速度(此处为零)         Encoder *= 0.7;                                              //一阶低通滤波器           Encoder += Encoder_Least*0.3;                                  //一阶低通滤波器        Encoder_Integral +=Encoder;                                       //积分出位移 积分时间:?ms    if(Encoder_Integral>2000)   Encoder_Integral=2000;              //积分限幅    if(Encoder_Integral<-2000)   Encoder_Integral=-2000;              //积分限幅    Velocity=Encoder*kp+Encoder_Integral*ki;                          //速度控制            if(flag_zhongdian!=0)    Encoder_Integral=0;      //电机关闭后清除积分         //输出限幅    if(Velocity > sudumax) Velocity = sudumax;    else if(Velocity < -sudumax) Velocity = -sudumax;        return (int)Velocity;} 转向环转向环其实有很多方法。我是用的比较简单的一种办法:动态的pid算法,P的系数是电磁传过来的偏差,D的系数是MPU6050的Z轴加速度(因为车模静止时我所在的地区Z轴加速度为2,所以在代码最后gyro+ 2进行了一次加速度补偿)。速度越快P越大D越小。当电磁传过来的偏差小于5时,判为直道,采用很小的P。可有效地减少直道上的晃动。我一开始这样做发现过弯时会有特别严重的抖动,经常飞出赛道,因此在最后加了个判断 if((My_Abs(Turn_Target) - My_Abs(Turn_Target_last)) >= 37) //入弯防抖 else if((My_Abs(Turn_Target_last) - My_Abs(Turn_Target)) >= -40) //出弯防抖 入弯防抖同时增大3倍P2倍D是车模更快更准的转弯,避免速度快时过弯不及时(毕竟我这一届只有不到30cm的前瞻)。出弯防抖与前者配合减少转弯过度带来的晃动。变量 RoadPianCha 是左右横电感和斜电感的差除以左右电感的和。也就是说这个变量的范围是 0-100。/@@**************************************************************************函数功能:转向控制  修改转向速度,请修改Turn_MaxPwm即可入口参数:左轮编码器、右轮编码器、Z轴陀螺仪返回  值:转向控制PWM作    者:**************************************************************************/int Turn_Ctrl_Pwm2(int encoder_leftint encoder_rightfloat gyro)//转向控制{    static float Turn_TargetTurnTurn_Target_last;    float Turn_MaxPwmKpKd;   //   if(My_Abs(RoadPianCha) <= 2)   //   RoadPianCha = 0;          Turn_Target_last = Turn_Target;      Turn_Target=RoadPianCha - (encoder_left-encoder_right)/5;               if(My_Abs(RoadPianCha) >= 5) {         Kp = 41.0 * (200+encoder_left + encoder_right)/200.0;        Kd = -4.2/ ((200+encoder_left + encoder_right)/200.0);        Turn_MaxPwm = 2000;      }      else {      Kp =3;      Kd = -5;      Turn_MaxPwm =200;      }       if((My_Abs(Turn_Target) - My_Abs(Turn_Target_last)) >= 37) //入弯防抖      {       // Target_Velocity = 100;        Kp = Kp * 3.2;        Kd = Kd * 2.3;      }      else if((My_Abs(Turn_Target_last) - My_Abs(Turn_Target)) >= -40)  //出弯防抖      {       // Target_Velocity = 1000;        Kp = Kp * 1.7;        Kd = Kd * 3.4;      }      if(Turn_Target>Turn_MaxPwm)  Turn_Target=Turn_MaxPwm;           //转向速度限幅      if(Turn_Target<-Turn_MaxPwm) Turn_Target=-Turn_MaxPwm;              //=转向PD控制器==//      Turn=  -Turn_Target*Kp + (gyro+ 2)*Kd;       //结合Z轴陀螺仪进行PD控制      return (int)Turn;} 汇总最后关于这几个环串起来:在主函数中开一个定时器(时间大概为1-2毫米)把这几个函数轮番调用下面的是我定时器触发函数////====数据处理====平衡控制==速度环控制==转向环控制void PIT1_isr (void){       flag1ms++;    if(flag1ms%2 == 1)    {            Get_Dip_Angle();            //角度获取                Balance_Pwm = Balance_Ctrl_Pwm(Angle_BalanceGyro_Balance);         //===平衡PID控制                if(flag1ms >= 100)            {            flag_100ms++;            flag1ms = 0;            Velocity_Pwm = Velocity_Ctrl_Pwm( Encoder_Left Encoder_Right);        //===速度环PID控制     记住,速度反馈是正反馈,就是小车快的时候要慢下来就需要再跑快一点            }    }    else    {      Encoder_Right =   FTM_AB_Get(FTM1);          //脉冲为前进+,后退为-          Encoder_Left  =   -FTM_AB_Get(FTM2);             Get_AD_data();      //获取电感,测距的AD值    AD_chuli();         //处理AD值,得出最终偏差    Turn_Pwm = Turn_Ctrl_Pwm2(Encoder_Left Encoder_RightGyro_Turn);  //===转向环PID控制       }        //输出电机PWM————负脉冲向前    Moto_Left=Balance_Pwm+Velocity_Pwm+Turn_Pwm;                   //===计算左轮电机最终PWM    Moto_Right=Balance_Pwm+Velocity_Pwm-Turn_Pwm;                  //===计算右轮电机最终PWM          //end    PIT_TFLG(1) |= PIT_TFLG_TIF_MASK;    //清中断标志位    }版权声明:本文为CSDN博主「一城烟雨 一楼台」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。原文链接:

电子芯吧客 2020-04-09 阅读:27

47

抢答

【回复即得200IC币】作为更加亲民的智能车比赛,NXP恩智浦智能车比赛大家都有所耳闻,也在社区有了解过相关项目。相信很多朋友一定十分感兴趣,但又没有实际参与过。今天为大家带来大神选手WillChan_的实战资料,揭秘一个优秀的参赛选手如何备战NXP智能车比赛。一、概要比赛规则与赛道:比赛没有赛道,只有电磁线。但赛道元素包括有直道、弯道、坡道、十字路口以及横断路障。室外电磁组原则上选择室外的马路、草坪、体育场组织比赛,场地内可能会存在高度不大于 2 厘米的硬质路坎、沙坑、深度不超过 2 厘米的水坑等。选手制作的车模完成赛道运行一周。比赛时间从车模冲过起跑线到重新回到起跑线为止。越野车外形车的功能与实现: 本文脉络 二、硬件部分:1.主控板(1)原理图:K60引脚分配:引脚通过查K60引脚功能来分配,除去特殊功能引脚外,其余引脚为普通I/O口特殊引脚:I2C通信:SDA,SCLFTM(PWM输出):PWMA,DPWMAD(模数转换):AD1~AD6串口通信:TX2,RX2电源部分及笔记:(7~8v输入,5v和3.3v输出)以下为原理笔记: 按键模块:(SW2为4并排按键,用于设置车的模式) 电机输出(为排针插座,接驱动板,DIRA为电机方向控制,PWMA为速度控制): 舵机输出(为排针插座,5v供电电压,DPWM为脉冲输出,以控制舵机转角): AD输入(为排针插座,接传感器板,6路电感值输入): 普通IO口: 串口: 蜂鸣器: (2)PCB和3D图 PCB中,logo部分和敷铜(GND)已去除,以更清晰显示电路 2.电机驱动板:用于驱动电机(1)原理图H桥电机驱动:VCC直接接电池(7~8V) H桥原理: 12v升压(用于IR2104s驱动mos管): 电源部分: VCC是电机供电 12V(用于IR2104s驱动MOS)和3.3v(逻辑芯片供电): 调速及转向: Led显示电机方向及速度大小(速度越大越亮): 排针插座信号输入,3.3v用于逻辑芯片供电: 逻辑非和逻辑与芯片: 原理笔记:(2)PCB(GND敷铜已去)和3D图 3.传感器板:处理电感数据(1)原理图电源部分:信号放大:(opa2350为运放,根据电阻,放大倍数最大50倍,输入输出为正弦波,共6路) 信号整流(经实验,连接AD输出和GND的电容会严重削弱信号,故去除): 信号输入输出(为插座): (2)PCB(GND敷铜已去除)和3D图 4.电磁探测板:探测电磁线信号(1)原理图谐振部分:谐振可以很好放大信号,电感电容值根据20K频率谐振计算。 其他部分(LED和排针插座): (2)PCB(GND敷铜已去除)和3D图 电感与电磁线垂直时信号最强,故六路电感位置摆放: 这样放置电感,可以满足在多方位的检测需求。 版权声明:本文为CSDN博主「WillChan_」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。原文链接:

电子芯吧客 2020-04-03 阅读:327

43

抢答

【RM中的PID】作为目前最主流的控制算法之一,PID的优点在于简单高效。在RM机器人控制中起着举足轻重的作用。在RM机甲大师比赛中,PID 控制算法侧重于软件实现。在赛场上,PID 也同样的被应用在很多场景下的机器人状态控制。比例积分微分控制,简称PID控制,是最早发展起来的控制策略之一,由于其算法简单、鲁棒性好和可靠性高,被广泛应用于工业过程控制,至今仍有90%左右的控制回路具有PID结构。比方说触发大能量机关,机器人要先识别屏幕上的指定数字,还要用 PID 来控制云台和发射机构(俗称枪口)快速和准确地射击数字。又比如在RM比赛中,为了让机器人的枪口可以在一定角度内自由调整,同时为了保证在不平坦的场地运行时,发射机构能尽量稳定(减少枪口晃动),就会在机器人的底盘上加装一套云台。赛场上的云台大多数是由无刷电机驱动的。通过改变电机的电流大小,可以调整电机运行的速度;通过改变电机的电流正负,可以调整电机的转动方向。同时,电机内部还有传感器在记录电机的转动位置,再加上一定的算法处理,就可以知道云台应该摆在哪个方向,也就是实际角度值。选手们使用的方案是,根据距离目标值的远近来调节云台的速度,离得远就转快一些,离得近就慢一些。这样就需要我们实时获取云台当前的实际角度,然后和目标角度做对比,根据差值来动态地调整云台的速度和方向。只根据上述的参数来调节还不足以达到云台控制的理想性能,为了让云台实现快速响应、减小误差、消除扰动,在实际控制过程中选手们还使用了 PID 控制器。PID 控制器(比例-积分-微分控制器)是一种通过控制系统的偏差来调整输入信号的线性反馈控制算法。通俗的说,它可以给出使执行器(电机)快速准确到达目标的“指导方案”。【PID实战问答】1.Q:如何快速入门PID?   A:首先要对反馈系统有基本的了解,然后自己推导一遍PID的公式,最好能结合频域的知识理解一下。实战的话,最简单的先仿照例程搞一个速度环PID的程序,拿上电机然它动起来,实际改变参数,观察J-Scope曲线的变化,加深理解。2.Q:PID在调试时要注意什么?   A:一定要合理使用调试工具,把需要观测的数值打印程曲线出来, 可以用J-link的工具J-Scope,或者串口发送出来用上位机观察。例如对于串级PID需要打印出多个环节的给定值和、反馈值。然后调试的时候先调内环,保证内环的响应速度能够基本跟上,再加上外环,同时需要微调内环。一般来说用P、I控制器就够用了。3.Q:如何根据不同环境整来调整PID增益?   A:PID的鲁棒性较好,能够适应一定范围的系统模型变化,但是如果负载发生较大变化导致系统模型改变,需要对自适应PID或者其他控制器。具体实战我也没有操作过,但是有几个可以考虑的方向:        1.直接对导致系统模型变化的变量进行观测,例如云台的载弹量,然后针对不同情况调出多组PID参数进行切换。        2.对系统的模型进行在线辨识,然后调节PID参数。        3.使用别的带有观测器的控制器。4.Q:需要什么工具吗?例如示波器之类的。   A:我们现在接触的基本上都是通过MCU控制,因此使用单片机的调试工具即可,使用虚拟示波器观察曲线。如果是涉及到到无法检测的中间量(例如电压、运动),可以使用示波器或者其他设备(例如激光运动传感器),这个要根据自己的需求来。5.Q:PID位置环的真实值与设定值有没有必要加入滤波,防止传感器数据突变呢?   A:这是两个问题,真实值基本上是来自传感器的观测值,这个需要根据传感器的特性来决定。输出值滤波需要根据系统的特点来决定使用何种滤波器,一般会用到低通滤波器用来减小高频噪声,或者带通滤波器消除某个频段的震动(例如摩擦轮抖动)。6.Q:关于PID闭环嵌套的问题。如果我加了多个环,比如底盘的电机要加速度环、电流环和速度环,改如何进行嵌套呢?   A:这就是串级PID,嵌套方式从外到内依次是位置环、速度环、加速度环,位置环计算出来需要的速度,此即速度环的目标值,然后速度环再计算出需要的加速度,依次类推很容易理解的。然后关于计算频率,内环的计算频率要大于等于外环。【PID资料】视频:【渣字幕】简单教你PID控制原理资料下载:PID学习资料和演示软件先进PID控制及其MATLAB仿真从入门到精通吃透PID第二版PID-小车类-两轮自平衡小车资料技术文章:【电机矢量控制】BLDC方波电流环PID整定方案大家对PID控制有什么经验、问题或是私藏资料呢?欢迎讨论分享!

电子芯吧客 2020-04-01 阅读:511

38

抢答

大家都知道,目前主流的智能机器人都是电力驱动。RM的参赛选手当然也是如此。在对控制要求极高的RM比赛中,能检测电机当前转速的有刷无感电机就极其重要了。本期,就让我们一起来探索霍尔传感器的原理和有刷无感电机的组成吧!不喜欢看文字版的朋友,可以观看更详细的视频节目哦!视频链接:【RM】机器人的关键动力,有感无刷电机是怎么组成的?对于有刷无感电机,比普通电机要多一根线,通往检测电机转速的传感器。这个传感器通常就是霍尔传感器。霍尔效应是电磁效应的一种,这一现象是美国物理学家霍尔于1879年在研究金属的导电机制时发现的。 当电流垂直于外磁场通过半导体时,载流子发生偏转,垂直于电流和磁场的方向会产生一附加电场,从而在半导体的两端产生电势差,这一现象就是霍尔效应,这个电势差也被称为霍尔电势差。这就是霍尔传感器的原理。那么对于无刷电机来说,转子上有一圈均匀安装的磁铁,按次级均匀间隔排布。且N极和S极数量相等,磁场分布固定不变。霍尔传感器安置在转子磁铁下方,固定在定子上。转子转动时,就能感知转子的磁场变化,继而把信息上传给电调,就能知道转子转了几圈。由于编程时已把磁极数量写入程序,配合传感器输出的Uh模拟量、AD转换芯片,就可以感受微小的磁场变化,得出转速。如图一个典型的通知系统负反馈方框图,代入上述的系统,就是有感无刷电机的基本原理啦!你对于有感无刷电机有什么经验和心得呢?欢迎大家讨论!还没搞清楚的朋友们,可以观看视频更详细哦!视频链接:【RM】机器人的关键动力,有感无刷电机是怎么组成的?图片视频来源于RoboMaster官网www.robomaster.com

电子芯吧客 2020-03-26 阅读:429

2

回答

IAP在升级的过程中除了用串口还可以用其他的接口吗

wakayi 2020-04-09 阅读:14

2

回答

步进电机的细分驱动和半步驱动哪一个精度更高一点

shidalin 2020-04-09 阅读:15

3

回答

为什么会出现这种温度跳动比较大的情况

难舍难分 2020-04-09 阅读:15

1

回答

什么情况下才会用到编码器的Z相输出

天山来客 2020-04-09 阅读:9

4

回答

有没有可以分包传输的传输控制算法

victorcao 2020-04-09 阅读:14

4

回答
单片机之间哪种通讯最好 单片机综合应用

单片机之间哪种通讯最好

ditlkkn54645 2020-04-09 阅读:16

4

回答

电机一转,单片机就重启了

yucrtghvd 2020-04-09 阅读:16

1

回答

是不是只要把加速反过来就是减速

gaozhongfen 2020-04-09 阅读:9

1

回答
IAR能支持多线程编译吗 单片机综合应用

IAR怎么才能打开多线程编译

彼岸花谢 2020-04-09 阅读:7

2

回答

STM8在低功耗模式下可以直接关闭时钟吗

STFAE 2020-04-09 阅读:12

3

回答

是否有可以参考的代码

戈卫东 2020-04-09 阅读:13

2

回答

对STM32进行编程的时候为什么要先擦除全部的flash数据

lxzdhgcs 2020-04-09 阅读:8

2

回答

有没有可以调用的办法

无段前进 2020-04-09 阅读:10

1

回答

无刷电机的刹车功能是怎么实现的

云拓海 2020-04-09 阅读:8

3

回答

怎么避免程序出现空指针异常的情况

树上的龙猫 2020-04-09 阅读:12

5

回答

为什么电容屏用的这么多

辉常可乐 2020-04-09 阅读:13
  • 帮助人数
  • 0
  • 获得赞数
  • 0
  • 一周积分
  • 0

每日任务

提问一次
30IC币
回答一次
30IC币

问题达人换一批

本月问答IC币兑换

排名
用户名
问答积分
可兑换IC币
1
464
10000
2
432
10000
3
360
8000
4
354
8000
5
312
8000
6
286
6000
7
248
6000
8
232
6000
9
232
6000
10
230
6000
11
230
6000
12
226
6000
13
226
6000
14
160
4000
15
148
4000
16
140
4000
17
134
4000
18
110
4000
19
102
4000
20
102
4000
21
84
2000
22
74
2000
23
56
2000
24
44
1000
25
40
1000
26
34
1000
27
26
0
28
24
0
29
24
0
30
22
0
< 123 >