2013电子设计竞赛-旋转倒立摆-整体方案-2014.10.26更新

Malc 于 2015-6-10 13:15 编辑



电赛结束了一段时间了,趁这段时间,总结、整理一下自己的方案



------------------------------------------------------------------------------------------------------------



先来看看题目要求吧:

task1.png

2013-10-7 18:45 上传
(152.62 KB)


task2.png

2013-10-7 18:45 上传
(217.19 KB)





看完题目,经过一番思索和百度之后,有了大概的方案,于是乎开始准备材料,设计机械(我负责),同时其他队员开始设计tb6560驱动、电源模块等等,当然如果你本来就打算选择控制类题目,步进、直流电机及其驱动最好在比赛之前就有充分的准备,我们是使用现成模块的同时开始制作tb6560(比赛的时候其实评委不看我们做的电路,只看我们能否完成题目要求)

用到的材料大部分都是以前的雕刻机项目剩下的材料,倒是省了不少时间,时间宝贵,当然怎么简单有效怎么来了,编码器连接件等东西是这几天加工出来的,abs材料

来张机械结构渲染图,比赛的时候并没有把全部结果画出来,画出个大概就开始做了,那些细节都是比赛后加上去的:

模型渲染.JPG

2013-10-7 18:55 上传
(47.16 KB)



具体的solidworks文件、工程图全部打包在附件中



接下来是电路部分,由于这是控制类题,所以电路比较简单,24v开关电源供电,2596-5v供系统工作,一块arduino nano,一块tb6560,一个ADC键盘用于现场演示,两个mini绝对型编码器1024线

ADC键盘,一个ADC口检测10个按键,我估计检测16个没问题:

ADC key.png

2013-10-7 19:04 上传
(23.56 KB)



tb6560:

tb6050.png

2013-10-7 19:04 上传
(54.28 KB)



2596稳压:

voltage regulator.png

2013-10-7 19:04 上传
(11.99 KB)





2014.10.26更新:

系统函数图如下:

pid.png

2014-10-27 00:01 上传
(104.58 KB)







在接下来就是程序了

总共写了14个版本程序,最后用的就是PID_1_3、PID_1_4,所以这里就给出这两个版本的注释吧:

///////////PID_1_3/////////

PID_1_3.ino :主程序,开机自动检测0°并计算出180°,之后进入循环功能演示。平衡采用PID控制,第一个PID,以摆杆角度作为作为输入,步进电机速度作为输出。第二个PID,以步进速度作为输入,平衡点作为输出(180°±8°)

当摆杆在-110°~-180°或110°~180°范围内时,进行平衡控制,否则关闭步进输出



编码器读数、PID控制放在Timer2中断中,以保证控制周期精准,控制周期5ms

串口命令读取、状态发送放在主函数循环中



起摆思路1:反复震荡摆杆使其摆角越来越大;步进电机往一个方向运动一点距离,停止,等待摆杆达到最高点,再反向运动,停止,等待摆杆达到反向最高点,如此反复,摆杆进入平衡范围后进行平衡控制(起摆时间太长,不采用)



起摆思路2:步进电机突然给一个方向速度,再急刹车,摆杆由于惯性继续圆周运动,当进入平衡范围时,进行平衡控制(时间基本1s以内)



起摆思路3:步进电机突然给一个方向速度,再急刹车,等待摆杆达到最高点,步进电机再反向快速运动,以提高摆杆动能(杆子太重可用此方法)





Stepp.ino :步进电机驱动,使用了Timer1,setStepperSpeed(long myspeed)用于更新速度,StepperEvent()根据速度值驱动步进,如果有加减速效果会更好



Command.ino :接收命令,更新参数,P100代表参数P=100,etc





Encoder.ino :绝对型编码器读数





Filter.ino :FIR低通滤波、中值滤波



function1~6.ino :分别实现基本要求1~3,提高要求1~3







///////////PID_1_4/////////

PID_1_4.ino : loop中命令值略有更改





Command.ino : 将读取串口数据改为读取ADC键盘值,ADC键盘优点:仅一个AD口可实现10个按键,缺点:读数略复杂,只能单点按键,适合atmega328管脚少的芯片



其他函数同PID_1_3



程序比较长,这里就贴出PID_1_3的主函数吧,完整代码附在附件中:

ARDUINO 代码复制打印

#include <TimerOne.h>#define setBit(val, bitn)  (val |=(1<<(bitn))) #define clearBit(val, bitn) (val&=~(1<<(bitn))) #define getBit(val, bitn)  (val &(1<<(bitn)) ) int functionSpeed=0,functionFlag=0;int PIDSign=true,SpeedPIDSign=true;;int function3Sign=false;/////////////Angle Parameter/////////long setPoint=0,setPointOpp=0,originPoint=0;int degree=0,degreeLast=0,setPointDegree=0;/////////Arm Speed Parameter/////////#define PULSE_PER_ROUND 1600#define MAX_SP_SPEED (PULSE_PER_ROUND1)#define MIN_SP_SPEED (-PULSE_PER_ROUND1)long setPosition=0,position=0,positionLast=0;long absPositionLast=0,absPosition=0;int setSpeed=0,armSpeed=0,lastSpeed=0;int np=500,ni=0,nd=0;long sp_error_p=0,sp_error_i=0,sp_error_d=0;int tempSpSpeed=0,tempPosition;int delta=2,maxDelta=8;int calcAngle(int x){ if(setPointOpp<=x&&x<originPoint)return (x-setPointOpp)*-0.352; else if(<=x&&x<setPointOpp)return (setPointOpp-x)*0.352; else return 180-(x-originPoint)*0.352;}void setup(){EncoderInit();StepperInit();Serial.begin(57600);Serial.print("test begin\ndelay 2s\n");int i,num=5,temp;for(i=0;i<num;i++){  temp=SSI(




视频、图片在这里:

153757nya63ama43244az3.jpg

2013-10-7 19:15 上传
(286.75 KB)





附件:

倒立摆.part1.rar

(7.81 MB, 下载次数: 1795)

2013-10-7 19:19 上传
点击文件名下载附件


倒立摆.part2.rar

(7.81 MB, 下载次数: 1568)

2013-10-7 19:21 上传
点击文件名下载附件


倒立摆.part3.rar

(7.81 MB, 下载次数: 1512)

2013-10-7 19:24 上传
点击文件名下载附件


倒立摆.part4.rar

(7.4 MB, 下载次数: 1534)

2013-10-7 19:23 上传
点击文件名下载附件



115:

http://115.com/lb/5lbawy4ygq2#

倒立摆1.rar

115网盘礼包码:5lbawy4ygq2



TB6560 资料:

TB6560.rar

(4.42 MB, 下载次数: 413)

2015-6-10 13:12 上传
点击文件名下载附件


via - 极客工坊

标签: Arduino教程