2021-06-13(自用)电赛风力摆学习记录1
目录
- 程序阅读
- 题目解析
- 第一问--MODE1
- 第二问--MODE2
- 第三问--MODE3
- 第四问--MODE4
- 第五问--MODE5
- 程序架构
- indkey
- Motor
- MPU6050
- usart1
- 参考链接
程序阅读
题目解析
第一问–MODE1
由单摆公式得到周期1.3-1.6秒,换算成频率f在0.625-0.77Hz之间
疑惑:
MoveTimeCnt 是干什么用的(还是没有很懂)
set_y 是公式x=Asin(wt+ψ) (位移时间方程),但是程序里的A不是振幅,而是最大偏角(这块看了一下午,要哭死了)
但是要是把set_y看作是设置的角度,似乎也没有问题,毕竟简谐振动还有一个方程是θ(t)=Asin(ωt+ψ)。好吧还是有点不懂。
部分解释:
w=2pi*f(f是进行归一化后的,也就是normalization)
A要换成°,1弧度=57.2958°
这个度、弧度的转换可能跟函数本身有关(sin,cos,atan),MODE3里面也有一步转换,我猜测应该是函数用的都必须是弧度,但是程序写的(为了方便看或者计算之类的原因)都是度。
第一问的思路:
就是设置x和y方向上的PID,x方向上设置为0,不变,y方向上前后摆动。
但是要注意硬件是否满足(电机物理限制、软件计算限制)
读程序感想:
好家伙,人家想的好细致啊,而且思路特别清晰。不只是简单的原理,而且还包括物理限制、归一化(归一化目前没搞懂为什么要使用它。可能是软件设计对于参数的范围选定有要求?)
第二问–MODE2
第二问跟第一问一样,只是对于振幅有所要求,也就是对于A的大小有所要求。这个在选择摆长的时候就考虑到了,所以第二问跟第一问的程序一样(唯一不同就是动的是X还是Y方向)
关于参数确定:
周期T=2π√(L/g),L是摆长,由题意可知是0.6~0.7m(这里我其实算出来的周期是1.55–1.68s,跟链接里那位大神算的不太一样,不知道是不是我的思路有问题)。周期确定了,频率也就确定了(f=1/T)。
第三问–MODE3
第三问是利用李萨茹图形,其参数方程为:
x(θ)=Asinθ
y(θ)=Bsin(nθ+ψ)
当n=1,ψ=0或Π时,画出来的是直线段。
关于李萨茹图形可以直接百度https://baike.baidu.com/item/%E5%88%A9%E8%90%A8%E5%A6%82%E5%9B%BE%E5%BD%A2/10517125?fr=aladdin.
该部分函数代码如下
解读:
利用莉萨如图形的公式,设置x和y方向的pid参数。
未解:相位补偿的值是怎么得到的。
虽然不知道那个Phase数组的值是怎么得到的,但是如果要是画直线的话,这部分不知道也没关系,直接设置0就行,因为ψ=0画出的是直线
void Mode_3(void)
{const float priod = 1410.0; //单摆周期(毫秒)//相位补偿 0, 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180const float Phase[19]= {0,-0.1,-0.05,0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,0.05,0.05,0.05,0.07,0};static uint32_t MoveTimeCnt = 0;float set_x = 0.0;float set_y = 0.0;float Ax = 0.0;float Ay = 0.0;float A = 0.0;uint32_t pOffset = 0;float Normalization = 0.0;float Omega = 0.0;pOffset = (uint32_t)(angle/10.0f); //相位补偿数组下标MoveTimeCnt += 5; //每5ms运算1次Normalization = (float)MoveTimeCnt / priod; //对单摆周期归一化Omega = 2.0*3.14159*Normalization; //对2π进行归一化处理A = atan((R/88.0f))*57.2958f;//根据摆幅求出角度A,88为摆杆离地高度 Ax = A*cos(angle*0.017453); //计算出X方向摆幅分量0.017453为弧度转换Ay = A*sin(angle*0.017453); //计算出Y方向摆幅分量set_x = Ax*sin(Omega); //计算出X方向当前摆角set_y = Ay*sin(Omega+Phase[pOffset]); //计算出Y方向当前摆角PID_M1_SetPoint(set_x); //X方向PID跟踪目标值sinPID_M1_SetKp(60); PID_M1_SetKi(0.79); PID_M1_SetKd(800);PID_M2_SetPoint(set_y); //Y方向PID跟踪目标值sinPID_M2_SetKp(60); PID_M2_SetKi(0.79); PID_M2_SetKd(800); M1.PWM = PID_M1_PosLocCalc(M1.CurPos); //PitchM2.PWM = PID_M2_PosLocCalc(M2.CurPos); //Rollif(M1.PWM > POWER_MAX) M1.PWM = POWER_MAX;if(M1.PWM < -POWER_MAX) M1.PWM = -POWER_MAX;if(M2.PWM > POWER_MAX) M2.PWM = POWER_MAX;if(M2.PWM < -POWER_MAX) M2.PWM = -POWER_MAX; MotorMove(M1.PWM,M2.PWM);
}
第四问–MODE4
直接判断当前位置(角度)是不是到45°,如果小于,精确制动,如果不是,PWM输出为0,直到小于后进行制动。
第五问–MODE5
根据正反转判断ψ的值,其他和第三问一样。
程序架构
indkey
里面是设置的独立按键的功能
Motor
电机的驱动啊、PWM的输出啊、PID的控制啊之类的
Motor_Control里面是上面说的几个问题的函数的定义
MPU6050
6050获取的pitch\roll\yaw
usart1
定时器端口配置、4个电机的各种方向(前后)运动定义
参考链接
链接:参考这位大神的 http://bbs.eeworld.com.cn/thread-476344-1-1.html.
暂时就写到这里叭,菜菜第一次写博客,也是刚看电赛风力摆控制没几天,对于大神程序的理解、题目的理解可能会有不清楚、迷惑的地方,怕误导大家就先说了(捂脸哭.jpg),希望各路大神能够批评指正。冲鸭!
2021-06-13(自用)电赛风力摆学习记录1相关推荐
- 2015国电设风力摆练手
2015国电设风力摆练手 继续总结一下之前的经验,东西不多,随便讲讲吧. 源码链接https://download.csdn.net/download/YOUNGAAAAA/85005265 4个空心 ...
- 01-Flutter移动电商实战-项目学习记录
01-Flutter移动电商实战-项目学习记录 一直想系统性的学习一下 Flutter,正好看到该课程<Flutter移动电商实战>的百度云资源,共 69 课时,由于怕自己坚持不下去(经常 ...
- 电赛风力摆制作过程中遇到的问题
主控用的是msp430,传感器MPU6050,驱动mos管,空心杯电机,外加一个oled显示屏显示数据调试 一.软件部分 1.MPU6050,DMP读取欧拉角 这个过程中遇到很多问题,首先移植DMP固 ...
- 2021年6月 第一个月的学习记录与感想
2021年6月2日,鸿蒙系统正式发布,回家路上看完发布会,很是激动,终于有了国产的操作系统可以学习和努力,对于一向以国产化为目标的我来说,期待这一天很久很久了. 身处半导体装备行业多年老工程师一枚,深 ...
- 13年电赛综合测评——三角波
目录 背景知识科普: 原理: 仿真图如下: 背景知识科普: 积分电路是使输出信号与输入信号的时间积分值成比例的电路.最简单的积分电路由一个电阻R和一个电容C构成,如图(a)所示.若时间常数RC足够大, ...
- 2017美赛D题—学习记录
原题及其翻译:https://blog.csdn.net/zhangtengyuan23/article/details/5464641 问题类型:排队论 任务: 建立至少一个模型来预估瓶颈.分析当前 ...
- 【硬件设计】关于电赛——硬件设计和PCB绘制的一些心得(持续更新)
[5.20校内训练] 1.一般线宽设置成0.254mm.[具体线宽设置看6] 2.对于功能不大的小模块板子,贴片电容电阻的封装尽量选择C0805和R0805,便于焊接.0603和0402封装的贴片电容 ...
- 【电赛合集】19电磁炮.zip、17板球.zip、15风力摆.zip、13倒立摆.zip、(1994-2021)全国大学生电子设计竞赛历年真题.zip
[电赛合集]19电磁炮.zip.17板球.zip.15风力摆.zip.13倒立摆.zip.(1994-2021)全国大学生电子设计竞赛历年真题.zip 电赛宝藏链接: 四天三夜,那布满着未知与紧迫感的 ...
- 15电赛b题风力摆小记:陀螺仪计算激光点在大地坐标系下坐标
加速度计计算激光点在大地坐标系下坐标 最近在做风力摆题目,我们想着求解激光点坐标.有两种方案: 利用摄像头做传感器,将摄像头放在坐标纸旁边,然后透视变换即可得到激光坐标. 利用陀螺仪解算. 因为不熟悉 ...
最新文章
- 温水里的程序员,技术将淘汰一切。
- 《C和指针》学习备忘
- Python——[Anaconda+Jupyter Notebook+Python3.6]环境下安装face_recognition
- NYOJ--1236--挑战密室(第八届河南省程序设计大赛)
- C#并行编程(6):线程同步面面观
- HTMLCSS 超简单的前端设计入门-2!
- oracle 读懂10046视频,10046、10053、实操记录
- openstack密钥对_您对OpenStack了解多少?
- SpringBoot从入门到精通教程
- 入门篇:函数计算中角色和访问策略的讲解
- L3-019 代码排版 (30 分)-PAT 团体程序设计天梯赛 GPLT
- 无法找到模块“mint-ui”的声明文件_[搬运] JavaScript 模块化:CommonJS vs AMD vs ES6...
- 用计算机算华为平板密码,华为平板电脑密码忘记怎么办
- php 集成 spss,spss怎么录入数据
- 在csdn中,如何获取积分
- Oracle报错1031,dataguard 归档日志报1031错误的一次处理
- go解析yaml文件示例
- KEIL,#ifdef宏定义下失效代码差异性显示
- 19. 详解网络请求Axios
- 求N分之一序列的前N项和
热门文章
- Flask-SQLAlchemy
- 人们为什么都喜欢大屏手机
- 关键词爬虫,Python花瓣画板关键词采集存储数据库
- Postman API测试工具的使用
- server精简版代理意外终止 sql_MSSQLSERVER 服务意外终止 ,新安装的操作系统和数据库,怎么解决?...
- 魔术sql_魔术不会成为独角兽,这需要付出艰辛的努力
- 虚拟机如何组建局域网的技巧方法
- 光猫,路由器,机顶盒
- 错误记录:error: call to implicitly-deleted copy constructor
- wpf fontweight system.argumentoutofrangeexception