2019年电赛已经结束,虽然结果不能令人满意,但闲下来,还是总结一下电赛学到的东西与失败的地方。这一次先来谈一下一阶旋转倒立摆。

一、题目分析:

拿到一道题目,其实最应该做的事情是分析题目,因为我们往往可以发现某些发挥题是在基础题的基础上进行的,但是,可能某些发挥题需要在基础题的基础上修改结构,我们也可以发现,题目中的某些问题具有相似性,当我们合并同类项的时候,可以把题目的要求变得简单。一下,我粘贴过来2013年一阶旋转倒立摆的题目以及要求:


我们很容易知道本题的核心是使得摆杆保持稳定,之后再其基础上进行一些功能的延伸。为了更好地理解题意,我做了如下的分析:

一阶旋转到倒立摆
手动起摆
自动起摆
摆杆的运动
电动机的控制

可以看到,题目中所要求完成的就是通过对一个电机的控制来实现的,控制题的核心还是要落在控制上。历届电子设计大赛经常被人戏称为电子机械设计大赛,虽然控制题的核心是落在控制上,但系统的机械结构也至关重要。此次练习采用的是平衡小车之家的套件,所以省去了搭硬件的很多麻烦。单单就完成题目要求的功能来说,数值分析并不是很必要(强迫症或者冲击国奖者除外)。因此,本篇内容仅仅从代码的角度来进行分析。
俗话说的好,不写注释的程序猿是流氓。我个人很喜欢在主函数的前面写上所用引脚的定义,这样一来方便接线,二来可以避免引脚重复使用,造成不必要的麻烦。

/************************************************
圆周倒立摆实验
ADC:PA1    Motor:PC0 PC1   Pwm:PB4 PB5
编码器A相:PB6  B相:PB7
按键:PA0 2 3 4 @JackFu
************************************************/

先来谈一谈我程序的风格,
一、
在主函数里我将初始化的函数写在了Board_Init();这个函数里,这样看起来比较方便后期的更改与检查,减少了主函数的代码量,使得主函数看起来简洁、调理。

void Board_Init(void)
{delay_init();Adc_Init();KEY_Init();Ecoder_TIM4_Init(); Motor_Init();Timer_pwm_Init(999,8);
//  Timer_Init_TIM5(4999,71);
//  TIM_SetCompare2(TIM3,800);uart_init(115200);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
}

二、我一般习惯于建立两个文件夹:HARDWARE、CONTROL。其中前者用来存放于硬件相关的一些配置函数,后者用来放与软件相关的一些配置函数。这样方便后期的维护与移植。

对于其中用到的基本配置,如ADC,ENCODER,MOTOR等等,此处不再赘述。网上有很多的例程与讲解。
该题的核心控制为电机,关键函数如下:

//电机调节函数    (控制电机倒立,很重要)
void Motor_Config(short pwm)
{int speed;if(start == 1)                         //开启倒立,调节倒立摆平衡{if(pwm<0 && pwm > -PWM_MAX){speed = PWM_MAX + pwm;if(speed < 0){speed = 0;}TIM_SetCompare2(TIM3,speed);Motor_reverse();}else if(pwm > 0 && pwm < PWM_MAX){speed = PWM_MAX - pwm;if(speed > 400){speed = 400;}TIM_SetCompare2(TIM3,speed);Motor_Forward();}}else                                   //电位器偏角过大,无法调节,为了安全,关闭电机{Motor_stop();}
}

传入的参数为电机ENCODER,电位器ADC采集值后经过PID处理的数据,具体的处理函数如下:

short PID_Pos_PosCalc(short NextPoint)
{register float  iError,dError;iError = pos_Set_Pos - NextPoint;                       // 偏差pos_SumError += iError*0.2;                                  // 积分if(pos_SumError > 1000.0)                               //积分限幅1000pos_SumError = 1000.0;if(pos_SumError < -1000.0)pos_SumError = -1000.0;  dError = iError - pos_LastError;                       // 当前微分pos_LastError = iError;return(short)(pos_p * iError*0.8 + pos_i * pos_SumError + pos_d * dError); //返回计算值
}short PID_Ang_PosCalc(short NextPoint)
{register float  iError,dError;iError = ang_Set_Pos - NextPoint;                       // 偏差ang_SumError += iError;                                  // 积分if(ang_SumError > 1000.0)                               //积分限幅1000ang_SumError = 1000.0;if(ang_SumError < -1000.0)ang_SumError = -1000.0;  dError = iError - ang_LastError;                       // 当前微分ang_LastError = iError;return(short)(ang_p * iError + ang_i * ang_SumError + ang_d * dError); //返回计算值
}
void Task3(void)
{short temp,temp1,temp2;temp = 0;temp1 = ANG_MIN_VAL;                                     //角度最大值temp2 = ANG_MAX_VAL;                                        //角度最小值ang_Cur_Pos = Get_Adc_Average(ADC_Channel_1,15);            //获取当前角度ang_Set_Pos = ANG_MID_VAL;                                 //将平衡时位置角度应当采样的值赋给设定值if((ang_Cur_Pos > temp1)&&(ang_Cur_Pos<temp2)){temp += PID_Ang_PosCalc(ang_Cur_Pos);                   //角度还在可以调整的范围内  start = 1;     }else{                                                          //角度过大,调整不了,为了安全,关机start = 0;}//  if(++Position_Target>5)pos_Cur_Pos = PID_Pos_PosCalc(Encoder),Position_Target=0;temp -= pos_Cur_Pos;
//  if(pos_Cur_Pos > 0 && flag == -1)
//  {//      ANG_MID_VAL = ANG_MID_VAL-5;
//      flag = flag*(-1);
//  }
//  else if(pos_Cur_Pos < 0 && flag == 1)
//  {//      ANG_MID_VAL = ANG_MID_VAL+5;
//      flag = flag*(-1);
//  }Motor_Config(temp);printf("%d    ",temp);printf("%d\r\n",Encoder);
}

该题的控制采用了双环的PID来进行处理,在进行学习的过程中发现,仅仅采用电位器环的PID可以使得摆杆倒立起来,但整个摆杆会整体顺时针或者逆时针的旋转,并不能满足题目要求。正如前面所述,在考虑机械结构时,要整体考虑,否则当做到这里时,发现需要用双环来进行控制,再改机械结构,会浪费很多的时间。

这里附上源码 (链接: Mycode(双环控制)

电赛练习之旋转倒立摆相关推荐

  1. 电赛猜题?我觉得没用,还不如做好这些!

    01 前言 大家好,我是张巧龙,转眼又到22年电赛,这个公众号上有很多同学可能都参加过电赛,有毕业的已经工作的,也有没毕业的今年要参加. 我第一次接触电赛是在大一暑期,从参加电赛到指导学生参加电赛,转 ...

  2. 2019电赛总结(一)

    2019电赛总结(一) 文章目录 2019电赛总结(一) 4 那之前 5 电赛初期 6 电赛中期 7 电赛强化练习 8 电赛预热阶段8月初 9 那以后 4 那之前 2019电赛总结(序) 5 电赛初期 ...

  3. 电赛设计报告模板及相关要求

    报告要求: <设计报告>写作装订 参赛学生在撰写<设计报告>时应注意,报告封面及每页纸上均不得出现参赛队的学校.代码.姓名等文字,否则取消评审资格. 报告正文长度严格限制为 A ...

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

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

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

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

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

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

  7. 【2022年电赛】有人开摆,有人跑路,有人5秒不识数

    前言:该作品是2022年四川省电子设计竞赛一等奖作品,其能稳定完成全部四个问题,但存在停车距离的精度问题.该文章将会介绍该作品的整体设计思路,关键控制算法等技术相关问题,也会给出工程的下载链接.同时本 ...

  8. 2022年江苏省大学生电子设计竞赛(TI杯)电赛 B题 无人机 省级一等奖记录 “一个摆烂人的独白”

    前期 从大一进校开始,我就参加了学校的创新实验室.遇到了很多很好的老师,但种种原因吧,实验室断代了.我也算搭草台班子,大一开始就作为实验室负责人,开始负责实验室的各项事务.大一寒假的时候,老师让我在校 ...

  9. 「第四篇」电赛控制题可以准备一些什么?

    点击上方"大鱼机器人",选择"置顶/星标公众号" 福利干货,第一时间送达! 0  前言 在我看来,其实控制题是较好做(混)的一种题型,你懂我意思吧.控制题简单概 ...

  10. 19年电赛B题设计总结

    这几天2019年电赛结束了,感觉心里不是滋味,要问为什么的话,当然是因为我已经不是本科生了,不然的话我就又能拿国奖了.(贱笑中...) 因为一些原因,我也参与到了一群学弟的指导中.(当然是无偿的... ...

最新文章

  1. Spring发布新成员:Spring GraphQL!高调出场的GraphQL能火起来了吗?
  2. 统一沟通成本节约数据表
  3. Angular Component之间的事件通知机制
  4. final 实例域+final类+final方法(阻止继承)
  5. 程序员面试金典 - 面试题 16.04. 井字游戏(计数)
  6. python调用接口获取文件_python接口文件使用说明
  7. vue :style 设置背景图片 backgroundImage
  8. The dialect was not set. Set the property hibernate.dialect
  9. 下载SAP hana镜像文件
  10. 这才叫会PS,普通照片分分钟P成好莱坞海报!
  11. Java 字符串拼接
  12. 有用的函数-系统采集(一)
  13. 手机普通浏览器唤起微信打开网页url
  14. [转]给明年依然年轻的我们:欲望、外界、标签、天才、时间、人生目标、现实、后悔、和经历
  15. 王慧文清华产品课(一)
  16. python实现pdf文件合并,多个pdf文件合并,pdf文件叠加
  17. 模拟器飞行训练-2022.12.1
  18. Origin作图流程
  19. vue/uni-app一键复制
  20. QG工作室——智能与图形处理小组

热门文章

  1. 区块链入门笔记(五) —— 加密货币博弈论
  2. 【Windows】添加开机启动项
  3. CentOS 下编译安装AliSQL
  4. 基于 RT-Thread Studio的CPK-RA6M4 开发环境搭建指南
  5. Open Cube 时信魔方介绍
  6. 比较好的自学IT的网站
  7. Ubuntu各类版本下载地址(网易镜像)
  8. 关于电力系统标准规约的一些理解
  9. 2022张宇考研基础30讲 第九讲 一元函数积分学的几何应用
  10. Prescan学习笔记