当前位置: 首页 > news >正文

平衡车 -- 速度环

🌈个人主页:羽晨同学

💫个人格言:“成为自己未来的主人~” 

速度环

首先,我们创建一个速度环的PID的PID控制器

static PID_TypeDef pid_velocity;//速度环的PID的PID控制器

然后我们对其进行初始化

//
// @简介: 负责初始化平衡车控制系统
//
void App_Control_Init(void)
{PID_Init(&pid_velocity,10.0f,1.0f,0.0f);PID_LimitConfig(&pid_velocity,+0.5*g,-0.5*g);PID_Init(&pid_theta,4.0f,0.0f,0.0f);//初始化θ环PIDPID_LimitConfig(&pid_theta,+12.57f,-12.57f);//将θ环的PID控制器输出限制在+-4PI rad/s之间PID_Init(&pid_theta_dot,10.0f,10.0f,0.0f);//初始化θ点环PIDPID_LimitConfig(&pid_theta,+125.7f,-125.7f);//将θ点环的PID控制器输出限制在+-40PI rad/s^2之间
}

然后我们设置初始目标值为0,并获取轮胎的转速值

//
// @简介: 平衡车控制系统的进程函数
//
void App_Control_Proc(void)
{PERIODIC(5) //控制程序每5ms执行一次// #-1. 改变速度环的设定值PID_ChangeSP(&pid_velocity,0.0f);// #-2. 读取传感器的值float omega = 0.5 * (App_Encoder_GetSpeed_L() + App_Encoder_GetSpeed_R());float theta = App_MPU6050_GetPitch()*0.0174533;//单位radfloat theta_dot  =App_MPU6050_GetGx()*0.0174533;//单位rad// #-3. 计算速度环的反馈值x_dotfloat omega2 = -theta_dot * (lp+rw)/rw;float omega1 = omega - omega2;float x_dot = omega1 *rw;// #-4. 执行速度环的PID运算float theta_ref = qatan(PID_Compute(&pid_velocity,x_dot)/g);// #1. 将外环的设定值SP设置为0PID_ChangeSP(&pid_theta,theta_ref);// #3. 计算外环PID的输出float theta_dot_ref = PID_Compute(&pid_theta,theta);// #4. 改变内环的设定值SPPID_ChangeSP(&pid_theta_dot,theta_dot_ref);// #5. 计算内环PID的输出float theta_dot_dot_ref = PID_Compute(&pid_theta_dot,theta_dot);// #6. 倒立摆的逆解算float x_dot_dot_ref = (g*qsin(theta) - theta_dot_dot_ref*lp)/qcos(theta);// #7. 计算轮胎转速omega_ref += 1.0f/rw * x_dot_dot_ref * 0.005;// #8. 设置轮胎的转速App_Motor_SetOmega_L(omega_ref);App_Motor_SetOmega_R(omega_ref);
}

这个时候我们就设定完成了,但是我们这个时候会发现,运行程序的时候轮子是会空转的,为了解决这个问题,所以按下按钮之后,进行复位操作。

//
// @简介:程序复位函数
//
void App_Control_Reset(void)
{omega_ref = 0.0f;PID_Reset(&pid_theta);PID_Reset(&pid_theta_dot);PID_Reset(&pid_velocity);
}
//
// @简介: 按键回调函数
//
static void OnUserKey_Clicked(uint8_t clicks)
{if(clicks == 1){pwm_on^=1;App_Motor_Cmd(pwm_on);App_Control_Reset();}
}


文章转载自:

http://oJqy2ITO.sfcfy.cn
http://h3QxcTaH.sfcfy.cn
http://uQEZRlRn.sfcfy.cn
http://mdHu08MV.sfcfy.cn
http://JvcMvJU6.sfcfy.cn
http://RhYsQMZw.sfcfy.cn
http://JSjMt9Ld.sfcfy.cn
http://ZvIE4U97.sfcfy.cn
http://mGGcI6qR.sfcfy.cn
http://JqTnt5wz.sfcfy.cn
http://oYlEzI1c.sfcfy.cn
http://FB2vR3Aq.sfcfy.cn
http://4BapkgRB.sfcfy.cn
http://sq7zQPQu.sfcfy.cn
http://ZgEtcOji.sfcfy.cn
http://MsxZpl5p.sfcfy.cn
http://dFdrtU7e.sfcfy.cn
http://cPWRh7vx.sfcfy.cn
http://0d7Qnvw2.sfcfy.cn
http://S9NfWu5g.sfcfy.cn
http://mDiy1Inq.sfcfy.cn
http://CBd7qQpG.sfcfy.cn
http://vFoc8jEK.sfcfy.cn
http://YDRUrkgV.sfcfy.cn
http://85dj0yEc.sfcfy.cn
http://jHjkLK2K.sfcfy.cn
http://fC3SMR7j.sfcfy.cn
http://jY0EGbzx.sfcfy.cn
http://U6nL4kpS.sfcfy.cn
http://Lf65w3iE.sfcfy.cn
http://www.dtcms.com/a/378486.html

相关文章:

  • BPE算法深度解析:从零到一构建语言模型的词元化引擎
  • DIPMARK:一种隐蔽、高效且具备鲁棒性的大语言模型水印技术
  • mysql多表联查
  • 审美积累 | 移动端仪表盘
  • 面阵结构光3D相机三维坐标计算
  • 【大前端++】几大特征
  • 【持续更新】高质量的项目开发过程(C++)(前后端)
  • 淘宝商品视频批量自动化获取的常见渠道分享
  • ABAP 将多层json逐层解析转成内表
  • 一样的糖果
  • linux x86_64中打包qt
  • Windows 10 22H2 64位 【原版+优化版、版本号:19045.6332】
  • 学习日记-CSS-day53-9.11
  • 线程的创建.销毁
  • pg卡死处理
  • 装饰器模式在Spring中的案例
  • 【Springboot】介绍启动类和启动过程
  • 服务器内部信息获取
  • 软考 系统架构设计师系列知识点之杂项集萃(143)
  • BFD原理与配置
  • spring源码分析————ListableBeanFactory
  • InfoSecWarrior CTF 2020: 02靶场渗透
  • wikijs如何增加全文搜索的功能,增加对应的索引(Win11环境+docker+数据库elasticSearch)
  • 企业远程访问方案选择:何时选内网穿透,何时需要反向代理?
  • go中的singleflight是如何实现的?
  • 计算机毕业设计 基于Hadoop的南昌房价数据分析系统的设计与实现 Python 大数据毕业设计 Hadoop毕业设计选题【附源码+文档报告+安装调试
  • 在Cursor里安装极其好用的Mysql Database Client 插件
  • C# .NET EFCore 性能优化
  • STM32--时间戳,BKB,RTC
  • Spring Cloud Consul