2015国电设风力摆练手

继续总结一下之前的经验,东西不多,随便讲讲吧。

源码链接https://download.csdn.net/download/YOUNGAAAAA/85005265

4个空心杯电机和一个陀螺仪,加上主控和驱动板。
驱动板建议用栅极驱动器或者btn,输出功率大,控制效果好

风力摆底部当然越轻越好,然后在底部放一个激光模块。
整体思路就是速度环pid控制空心杯电机,再在速度环外部加一个位置环pid,控制风力摆的位置。

代码

控制函数,放定时器中断里,

为什么设置了两套pid参数,是因为发现静止时的pid和运动中的pid差别挺大,经验之谈,用两套效果更好而已。

void mode_select(int mode,float length)
{static int first = 1;float mode1_angle = 0;if(first == 1){first = 0;if(mode == 0){Increment_PID_Initialize(&speed_pid[0],50,1,2000);   // x  50,1,2000Increment_PID_Initialize(&speed_pid[1],50,1,2000);   // y  50,1,2000}else if(mode == 1 || mode == 2){Increment_PID_Initialize(&speed_pid[2],20,0.1,30);   // xIncrement_PID_Initialize(&speed_pid[3],20,0.1,30);   // y}}switch (mode){case 0: // 静止angle_control(0,5,5);break;case 1: // 直线straight_cal(0,length);straight_control(0);break;case 2:circle_cal(length);break;}}

模式0 静止

这个很简单,读取当前角度值,反馈让其定点在一个固定角度

void angle_control(int mode,float angle_x,float angle_y)
{if(mode == 0){motor_pwm_y = Increment_PID(&speed_pid[1],angle_y,jy_y);motor_pwm_x = Increment_PID(&speed_pid[0],angle_x,jy_x);}else if(mode == 1){motor_pwm_y = Increment_PID(&speed_pid[3],angle_y,-an_speed_y);motor_pwm_x = Increment_PID(&speed_pid[2],angle_x,an_speed_x);}// 上下运动if(motor_pwm_y >= 0){if(motor_pwm_y >= 400)motor_pwm_y = 400;__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,0);__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,abs(motor_pwm_y));}else{if(motor_pwm_y <= -400)motor_pwm_y = -400;__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,0);__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,abs(motor_pwm_y));}// 左右运动if(motor_pwm_x >= 0){if(motor_pwm_x >= 400)motor_pwm_x = 400;__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_4,0);__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_3,abs(motor_pwm_x));}else{if(motor_pwm_x <= -400)motor_pwm_x = -400;__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_3,0);__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_4,abs(motor_pwm_x));}}

模式1 直线

思路很清晰,就是利用能量守恒的原理,在任何位置重力势能加上动能应该始终不变,反馈的量应该是能量的总和。这样就能画出指定长度的直线

void straight_control(int mode)
{if(mode == 0){if( an_speed_x >= 0){angle_control(1,ang_speed,0);}else{angle_control(1,-ang_speed,0);}}else if(mode == 1){if( an_speed_y >= 0){angle_control(1,0,ang_speed);}else{angle_control(1,0,-ang_speed);}}}void  straight_cal(int mode,float length)
{//mode: 0-x   1-y//standard_energyfloat tan_cita= 0,cos_cita = 0,hight_diff = 0,standard_energy = 0;tan_cita = length/88;cos_cita = 1/(sqrt(tan_cita*tan_cita+1));hight_diff = 72 - 72*cos_cita;standard_energy = 9.8*hight_diff*0.01;//current_enertyfloat diff_energy = 0,current_high = 0;if(mode == 0){tan_cita =tan( jy_x*M_PI/180);cos_cita = 1/(sqrt(tan_cita*tan_cita+1));current_high = 72 - 72*cos_cita;}else if(mode == 1){tan_cita =tan( jy_x*M_PI/180);cos_cita = 1/(sqrt(tan_cita*tan_cita+1));current_high = 72 - 72*cos_cita;}diff_energy = standard_energy - 9.8*current_high*0.01;if(diff_energy>=0){ang_speed = sqrt(fabs(diff_energy)*2)/(0.72)*100;}else{ang_speed = -sqrt(fabs(diff_energy)*2)/(0.72)*100;}}

效果如图

模式3 圆形

画指定圆形的代码较为复杂,实际上还是和物理挂钩,维持能量守恒,然后将速度分解为x和y方向,然后用x和y方向的电机分别控制,即可得到响应的结果

void circle_cal(float length)
{float tan_cita= 0,tan_x = 0,tan_y = 0,tan_cigma = 0,v_sum = 0,v_x = 0,v_y = 0;tan_cita = length / 88;v_sum = tan_cita*sqrt(9.8*0.72);tan_x = tan( jy_x*M_PI/180);tan_y = -tan( jy_y*M_PI/180);tan_cigma = sqrt(tan_x*tan_x + tan_y*tan_y);if (tan_cigma != 0){v_x = v_sum*tan_y/tan_cigma/(0.72)*100;v_y = v_sum*tan_x/tan_cigma/(0.72)*100;}test[0] = tan_cigma;test[1] = v_x;test[2] = v_y;angle_control(1,v_x,v_y);}

视频找不到了,当时效果不错,鲁棒性也挺好的,无论是风吹还是手扰动都能自己调回来

2015国电设风力摆练手相关推荐

  1. 2021-06-13(自用)电赛风力摆学习记录1

    目录 程序阅读 题目解析 第一问--MODE1 第二问--MODE2 第三问--MODE3 第四问--MODE4 第五问--MODE5 程序架构 indkey Motor MPU6050 usart1 ...

  2. 【电赛合集】19电磁炮.zip、17板球.zip、15风力摆.zip、13倒立摆.zip、(1994-2021)全国大学生电子设计竞赛历年真题.zip

    [电赛合集]19电磁炮.zip.17板球.zip.15风力摆.zip.13倒立摆.zip.(1994-2021)全国大学生电子设计竞赛历年真题.zip 电赛宝藏链接: 四天三夜,那布满着未知与紧迫感的 ...

  3. 15电赛b题风力摆小记:陀螺仪计算激光点在大地坐标系下坐标

    加速度计计算激光点在大地坐标系下坐标 最近在做风力摆题目,我们想着求解激光点坐标.有两种方案: 利用摄像头做传感器,将摄像头放在坐标纸旁边,然后透视变换即可得到激光坐标. 利用陀螺仪解算. 因为不熟悉 ...

  4. 电赛笔记——风力摆 硬件篇

    以下是我们在练习电赛题时出现的问题,我会分两部分写出来,希望对后面练习本题的同学有所参考和帮助. 第一次写文章,如有错误,请多多包含. 电路板   如果是自己画板子,提交订单之前一定要对电路再三检查, ...

  5. 软件测试分享15个适合练手的项目【金融/银行/商城/电商/医药......】

    还愁没有练手的项目?我已经给你准备好了,需要评论区留下你的想法吧 1.引言 1.1 文档版本 版本 作者 审批 备注 V1.0 XXXX 创建测试方案文档 1.2 项目情况 项目名称 XXX 项目版本 ...

  6. java项目_值得学习和练手的Java企业级开源项目,强烈推荐!

    热门文章推荐:100本纸质书籍免费包邮!22款高颜值的终端工具,点燃了小姐姐对编程的热爱! 一条 SQL 引发的事故,同时小姐姐直接被开除!! 11月全国程序员平均工资新鲜出炉,内附封面图! 文末有彩 ...

  7. 基于STM32单片机的风力摆控制系统

    摘    要  本系统采用STM32F103V开发板作为控制中心,与万向节.摆杆.直流风机(无刷电机+扇叶).激光头.反馈装置一起构成摆杆运动状态与风机速度分配的双闭环调速系统.单片机输出可变的PWM ...

  8. springboot+vue练手级项目,真实的在线博客系统

    文章目录 spring boot 练手实战项目说明 基础知识 面试准备 1. 工程搭建 1.1 新建maven工程 1.1.2遇到的bug 1.2 配置 1.3 启动类 2. 首页-文章列表 2.1 ...

  9. 棱形旋转c语言程序_C 语言时隔 5 年重回巅峰,这 20 个热门项目拿去练手!

    在上个月的 TIOBE 编程语言排名中,C 语言和 Java 的差距只有 0.01%.在近日 TIOBE 公布的 2020 年 5 月编程语言排行榜中,C 语言成功超越了 Java,重返第一的王者宝座 ...

最新文章

  1. Maven安装中央仓库没有的jar到本地
  2. PNAS “深度学习的科学”论文合集导读
  3. html精灵图坐标如何确定,如何使用HTML中的精灵图
  4. 微信小程序lottiejs动画事例代码
  5. 别问我SolarWinds Orion API怎么用,自己进来看看,看完还不会来骂我
  6. redis种类型对应java类型_Redis的五种基本数据类型介绍
  7. 反转一个值中的最后n位
  8. SVG 图标和sketch 模版免费网站
  9. modbus主机、从机、虚拟串口调试软件
  10. cl.b8y.php,群晖如何重装系统
  11. 平安夜html5源码,平安夜
  12. 阿里云盘 网页版地址 阿里云盘pc版 阿里云盘下载
  13. 为什么你要考虑使用Prisma
  14. map的基本使用-go篇
  15. 前端项目:从0开始实现一个合成大西瓜
  16. ESP8266连接阿里云--MQTT协议
  17. tplink怎么进去_如何进入tp-link路由器设置页面
  18. python条件选择语句,Python中条件选择语句可以嵌套使用。
  19. JQuery入门学习教程
  20. android layout html,layoutgravity

热门文章

  1. 【PTA】【C语言】复盘练习——编程题
  2. 实习日志 - 第二天
  3. Windows学习总结(21)——常用网络命令ping、Telnet等详解
  4. 用python代码做个圣诞树,送给心爱的她
  5. 二叉树:先序遍历,中序遍历,后序遍历,层序/层次遍历
  6. 网上购车平台低首付购车噱头的运作模式
  7. 网易七鱼在线客服系统web端对接
  8. 条码软件为什么要有等级要求(A级条码)
  9. AML BitCoin在数字货币交易所IDAX上市
  10. 嵌入式远程机房数采监控报警系统