STC32G 三轮车负压电磁

news/2024/10/26 5:47:12/

文章目录

  • 前言
  • 整车效果
  • 控制思路
    • 循迹
    • 环岛处理
    • 障碍处理
  • 关键代码部分
    • 差比和以及当前速度计算
    • 角速度环
    • 速度环
    • 环岛处理
    • 障碍处理

前言

年后就没怎么碰车了,到3月中旬换三轮了,可算有一点成效了,做个记录。

整车效果

移步B站
18届负压电磁全元素
18届负压电磁无元素,速度纯享版
资源
工程代码

控制思路

循迹

角速度环以及速度环

差比和的结果与0做差得到的误差作为角速度环的输入。
角速度环的输出输出作为我们期望小车转向的角速度。

简单对差速小车建模,以顺时针方向的角速度为正参考方向,推导数学公式可得

v L r e f = v m + ω L 2 v_{Lref}=v_m+\frac{\omega L}{2} vLref=vm+2ωL
v R r e f = v m − ω L 2 v_{Rref}=v_m-\frac{\omega L}{2} vRref=vm2ωL

其中 v L r e f v_{Lref} vLref是左轮的参考速度, v R r e f v_{Rref} vRref是右轮的参考速度, v m v_m vm是小车整体的运行速度,或假想小车中心有一个轮子的运行速度, L L L是车模后轮的轮距,我测量的D车模的后轮距为0.17m, ω \omega ω为小车的角速度,即角速度环的输出

得到左右两轮子的参考速度以后,经过速度环控制后得到左右电机的占空比并幅值即可。

其中角速度环用PD控制,P环节用于放大误差送入矫正环节(在这里的三轮车矫正环节即控制两个轮子的速度以矫正误差),D环节用于抑制车体的震荡;速度环用PI控制,P放大误差进行速度调节,I用于消除静差,尤其是当我们上负压以后,I尤为重要。

由于三轮车的运动轨迹完全取决于两个轮子速度之间的关系,两个轮子的速度环控制必须做到快速而精准,需花时间调节速度环的参数。

电机PID参数整定

环岛处理

  1. 检测到圆环(预圆环)(某个电感大于某个阈值)
  2. 到达最佳入环位置(强制入环,直到陀螺仪大于某个,开始园内循迹)
  3. 圆内循迹
  4. 出环。

障碍处理

  1. 识别障碍**(TOF测距小于某个限制)**
  2. 避开障碍(左右轮固定差速,直到陀螺仪积分大于某个角度)
  3. 回到赛道(左右轮固定差速,直到陀螺仪为小于某个角度)
  4. 姿态调整(让小车的姿态基本与赛道平齐,直到陀螺仪角度在某个范围内或误差在某个范围内)

关键代码部分

差比和以及当前速度计算

三电感电磁循迹小车

角速度环

void dir_loop()
{float temp;pid_steer.ek =  0 - error;temp = pid_steer.KP * pid_steer.ek+ imu660ra_gyro_z / 65.6;
//           + 300 * (pid_steer.ek - pid_steer.ek_1); // 参考角速度pid_motor_L.SetValue = speed_rate * speed_goal  -  temp * 0.0875;pid_motor_R.SetValue = speed_rate * speed_goal  +  temp * 0.0875;
}

速度环

void speed_loop()
{float inc_L, inc_R;// 限制内轮速度if(pid_motor_L.SetValue < 0)pid_motor_L.SetValue = 0;if(pid_motor_R.SetValue < 0)pid_motor_R.SetValue = 0;// 外轮速度限制if(pid_motor_L.SetValue > 2 * speed_goal * speed_rate)pid_motor_L.SetValue = 2 * speed_goal * speed_rate;if(pid_motor_R.SetValue > 2 * speed_goal * speed_rate)pid_motor_R.SetValue = 2 * speed_goal * speed_rate;inc_L = PID_Control_Inc(&pid_motor_L, 0);inc_R = PID_Control_Inc(&pid_motor_R, 0);duty_L += inc_L;duty_R += inc_R;if(duty_L > Motor_UpperLimit)duty_L = Motor_UpperLimit;if(duty_L < Motor_LowerLimit)duty_L = Motor_LowerLimit;if(duty_R > Motor_UpperLimit)duty_R = Motor_UpperLimit;if(duty_R < Motor_LowerLimit)duty_R = Motor_LowerLimit;
}

环岛处理

void circ_handler()
{static uint16 count_delay_R_circ_pre;static uint16 count_delay;if(flag_L_circ_pre) // 预圆环阶段{count_delay_R_circ_pre++;if(count_delay_R_circ_pre > 0.5 / speed_goal * 60 * TIM1_ISR_F) //{flag_L_circ_pre = 0;flag_L_circ_frc = 1; // force to get into circ}}if(flag_L_circ_frc){Angle_circ += imu660ra_gyro_z * 0.002 / 65.6;if(Angle_circ < -35){flag_L_circ_frc = 0;flag_L_circ_in = 1;flag_L_circ_out = 0;}else{pid_motor_L.SetValue = 0 * speed_rate * speed_goal;pid_motor_R.SetValue = 2 * speed_rate * speed_goal;}}if(flag_L_circ_in){Angle_circ += imu660ra_gyro_z * 0.002 / 65.6;if(Angle_circ <= -300)flag_L_circ_in = 0;}if(flag_L_circ_in == 0 && flag_L_circ_out == 0){count_delay++;if(count_delay > 5 * TIM1_ISR_F){flag_L_circ_out = 1; // 已出环count_delay = 0;Angle_circ = 0;}}
}

障碍处理

void block_handler()
{if(flag_block_detected){pid_motor_L.SetValue = 0 * speed_rate * speed_goal;pid_motor_R.SetValue = 2 * speed_rate * speed_goal;Angle_block += imu660ra_gyro_z * 0.002 / 65.6;}if(Angle_block < -45){flag_block_detected = 0;flag_block_back = 1;}if(flag_block_back){if(Angle_block < 50){pid_motor_R.SetValue = 0 * speed_rate * speed_goal;pid_motor_L.SetValue = 2 * speed_rate * speed_goal;}elseflag_block_adjust = 1;if(flag_block_adjust){pid_motor_L.SetValue = 0.3 * speed_rate * speed_goal;pid_motor_R.SetValue = 1.7 * speed_rate * speed_goal;}Angle_block += imu660ra_gyro_z * 0.002 / 65.6;}if(Angle_block < 10 && Angle_block > -10 && flag_block_adjust){flag_block_detected = 0;flag_block_back = 0;flag_block_adjust = 0;Angle_block = 0;}
}

http://www.ppmy.cn/news/240149.html

相关文章

miui v5 android版本,速度明显提升 小米2S刷安卓4.4版MIUI V5

1小米2S刷安卓4.4版MIUI V5 小米官方已经正式开始了基于Android 4.4的MIUI V5内测工作 ,按照此前的说法目前小米所有的机型的ROM均会升级到Android 4.4,第一批机型也选择了搭载骁龙800处理器的联通/电信版小米3,目测其他小米手机想要用上最新内核的MIUI V5还需要一段时间的等…

MOBA手游《小米超神》案例精讲

原文链接&#xff1a;https://blog.uwa4d.com/archives/2130.html 今天我们为大家带来由福州朱雀网络研发的MOBA手游《小米超神》的UWA测评报告分析。该游戏在不同配置的移动终端设备上&#xff0c;无论是画面表现力&#xff0c;还是性能开销都非常优异。在此&#xff0c;我们将…

基于STM32的智能风扇的制作

本次单片机实验&#xff0c;我主要是做了一个简单的智能风扇&#xff0c;风扇可以通过感知外部温度、按键、红外遥控来控制转速&#xff0c;并将转速与外部温度通过lcd显示屏显示。主要就是用了温度传感器DS18B20&#xff0c;红外遥控&#xff0c;lcd显示屏等外设。通过定时器产…

小米2s安卓10刷机包_小米 2S 4.3 ROM刷机包 CM10.2_8.30 官方流畅版

ROM介绍&#xff1a; 开发者模式开启方式&#xff1a;设置-关于本机-版本号点击5次以上即可。 电信3G(2S电信版) 移动E网联通3G 联通&#xff0c;移动用户&#xff0c;请自行到*#*#4636#*#* 选择GSM/CDMA-auto(支持归属地显示模式)或者选择WCDMA-preferred 电信手机无信号也可以…

改造智能风扇之——普通BLDC风扇拆机分析篇

拆机学院&#xff1a;直流变频塔扇 一、概述 随着国内经济的快速发展&#xff0c;如今的电风扇如已一改在人们印象中的传统形象&#xff0c;在外观和功能上都更追求个性化。当然风扇的动力核心也由最初的交流电机&#xff0c;延伸出使用直流电机。这次我们通过拆解一款直流变…

2023-06-06 LeetCode每日一题(相等行列对)

2023-06-06每日一题 一、题目编号 2352. 相等行列对二、题目链接 点击跳转到题目位置 三、题目描述 给你一个下标从 0 开始、大小为 n x n 的整数矩阵 grid &#xff0c;返回满足 Ri 行和 Cj 列相等的行列对 (Ri, Cj) 的数目。 如果行和列以相同的顺序包含相同的元素&…

【Flutter混合开发】开发一个简单的快速启动框架

目录 前言启动插件Flutter代码Android代码IOS代码 启动模块使用android端ios端 前言 因为在移动端中启动Flutter页面会有短暂空白&#xff0c;虽然官方提供了引擎预热机制&#xff0c;但是需要提前将所有页面都进行预热&#xff0c;这样开发成本较高&#xff0c;在研究了闲鱼的…

vue3-实战-05-管理后台顶部tabbar开发-全局守卫

目录 1-顶部tabbar组件静态搭建与拆分 2-菜单折叠效果 3-顶部面包屑动态展示 4-刷新和全屏 4.1-点击刷新操作 4.2-全屏 4.3-退出登录 5-路由鉴权 1-顶部tabbar组件静态搭建与拆分 分析一下&#xff0c;顶部分为左右两侧&#xff0c;左侧是面包屑&#xff0c;右边是 刷新…