2013年全国电子设计大赛题目简易旋转倒立摆及控制装置(C题)
全国电子设计大赛旋转倒立摆

全国电子设计大赛旋转倒立摆Prepared on 22 November 2020目录摘要本设计综合考虑基础部分和发挥部分要点,采用mega128a为主控芯片,BTS7960驱动电机并在程序中涉及到pid算法对电机进行调控,在设计中,我们采用1000线编码器为角度传感器。
在该简单控制装置中,我们实现了摆动,圆周运动和短时间的自动控制下的倒立。
关键字:倒立摆,mega128a,编码器第一章系统方案比较与选择总实现方案方案一:用陀螺仪和加速度计通过卡尔曼数据融合得到角度,用此处的角度为载体用单片机进行数据处理,并调整电机。
方案二:用电位器做角度传感,通过单片机自带ADC来读取电位数值以此为依据来判断角度,并调整电机。
方案三:用编码器做角度传感器,通过读取编码器的输出脉冲来计算角度传感器的输出角度,用此角度做处理调整电机。
通过对两个方案的对比选择,方案一中的加速度计和陀螺仪算法实现复杂,我们在融入卡尔曼滤波后有明显滤波效果,但是由于圆周运动,会使得各个方向轴返回的数据出错,且波动大,会减弱卡尔曼的滤波效果,对于pid的精准调整还是远远达不到预期。
在方案二中,考虑到电位器内部结构问题,虽然理论上电位器在转动过程中是线性的,但是考虑到每次停靠的电阻位可能会产生误差,最后考虑到我们最终选定的单片机ADC只有10位,在方案三中,由于实现编码器的功能实现方便简单,并能更多的趋近于精确值,因此最后我们采用了方案三。
主控制器方案比较与选择为了完成在短时间快速采集并计算角度,主控器件必须有较高的CPU工作频率和存储空间。
方案一:采用51系列加强型STC12C5A60S2作为主控器件,用来实现题目所要求的各种功能。
此方案最大的特点是系统规模可以做得很小,成本较低。
操作控制简单。
但是,我们在利用单片机处理高速信号快速扫描及电机控制时显得吃力, 51系列单片机很难实现这一要求。
方案二:采用ATMEL公司的AVR系列ATMEGA128A单片机为核心控制器件,MEGA128A有8个外部中断,中断系统丰富,并且有128K 字节的系统内可编程Flash,我们对它的性能和指标相对也较为熟悉,如此能够实现快速扫描和数据处理!按照题目的要求,综合考虑我们最终选择了方案二,采用ATMEGA128A单片机为核心控制器件。
全国电子设计大赛题目简易旋转倒立摆及控制装置C题

2013 年全国大学生电子设计竞赛试题参赛注意事项(1)9 月4 日8:00 竞赛正式开始。
本科组参赛队只能在【本科组】题目中任选一题;高职高专组参赛队在【高职高专组】题目中任选一题,也可以选择【本科组】题目。
(2)参赛队认真填写《登记表》内容,填写好的《登记表》交赛场巡视员暂时保存。
(3)参赛者必须是有正式学籍的全日制在校本、专科学生,应出示能够证明参赛者学生身份的有效证件(如学生证)随时备查。
(4)每队严格限制3 人,开赛后不得中途更换队员。
(5)竞赛期间,可使用各种图书资料和网络资源,但不得在学校指定竞赛场地外进行设计制作,不得以任何方式与他人交流,包括教师在内的非参赛队员必须回避,对违纪参赛队取消评审资格。
(6)9 月7 日20:00 竞赛结束,上交设计报告、制作实物及《登记表》,由专人封存。
简易旋转倒立摆及控制装置(C 题)【本科组】一、任务设计并制作一套简易旋转倒立摆及其控制装置。
旋转倒立摆的结构如图1 所示。
电动机A 固定在支架B 上,通过转轴F 驱动旋转臂C 旋转。
摆杆E 通过转轴D 固定在旋转臂C 的一端,当旋转臂C 在电动机A 驱动下作往复旋转运动时,带动摆杆E 在垂直于旋转臂C 的平面作自由旋转。
二、要求图1 旋转倒立摆结构示意图1.基本要求(1)摆杆从处于自然下垂状态(摆角0°)开始,驱动电机带动旋转臂作往复旋转使摆杆摆动,并尽快使摆角达到或超过-60°~ +60°;(2)从摆杆处于自然下垂状态开始,尽快增大摆杆的摆动幅度,直至完成圆周运动;(3)在摆杆处于自然下垂状态下,外力拉起摆杆至接近165°位置,外力撤除同时,启动控制旋转臂使摆杆保持倒立状态时间不少于5s;期间旋转臂的转动角度不大于90°。
2.发挥部分(1)从摆杆处于自然下垂状态开始,控制旋转臂作往复旋转运动,尽快使摆杆摆起倒立,保持倒立状态时间不少于10s;(2)在摆杆保持倒立状态下,施加干扰后摆杆能继续保持倒立或2s 内恢复倒立状态;(3)在摆杆保持倒立状态的前提下,旋转臂作圆周运动,并尽快使单方向转过角度达到或超过360°;(4)其他。
2013年电子设计大赛旋转倒立摆资料

2013 年全国大学生电子设计竞赛简易旋转倒立摆及控制装置(C 题)[ 本科组2013年9月7日摘要:设计并制作了一个基于P ID 控制的倒立摆系统。
选用低功耗单片机AT89C51 、减速电机、电位器等器件,完成基本功能。
以单片机控制减速电机转速,改变摆杆转角θ,并保证让摆杆在同一平面内做圆周运动,最终使摆杆达到倒立(在规定的-165 °至165°范围内)稳定状态。
关键字: AT89C51 单片机;减速电机;电位器Abstract :Designed and produced an inverted pendulum system based on PID control. Choose low power single chip microcomputerAT89C51, gear motor, potentiometer, such as device, complete the basic functions. With single-chip microcomputer control deceleration motor speed, change the swinging rod Angle theta, and ensure that the swinging rod is circular motion in the same plane, eventually make the swinging rod upside down (in the rules - 165 to 165 ) s°teady state.Keywords: AT89C51 、 Gear motor 、 potentiometer目录序⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯.5 前言⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯............. ⋯⋯⋯⋯⋯⋯ 61系统方案 (7)1.1系统结构 (8)1.2方案的比较和选择 (10)1.2.1电机的论证与选择 (10)1.2.2 电机驱动的论证与选择⋯⋯⋯⋯..... ⋯⋯⋯11 1.2.3速度控制.. (12)2理论分析与计算 (13)2.1电动机选型 (13)2.2摆杆状态检测 (15)2.3驱动与控制算法 (19)3电路与程序设计 (23)3.1 ......................................................... 电路的设计 (23)3.1.1控制部分用51单片机 (23)3.1.2硬件部分 (24)3.1.3 软件部分 (24)3.1.4部分器件原理 (25)3.2 ......................................................... 程序结构与设计.. (26)4设计小结 (30)5参考资料 (32)倒立摆系统是理想的自动控制教学实验设备,使用它能全方位的满足自动控制教学的要求。
2013年全国大学生电子设计大赛本科C题倒立摆程序

#include<stc/STC12C5A60S2.h>#include <math.h>#include <stdio.h>#include <INTRINS.H>typedef unsigned char uchar;typedef unsigned short ushort;typedef unsigned int uint;sbit bmq=P1^5;sbit sn=P1^2;sbit l1=P1^0;sbit l2=P1^1;sbit j1=P0^0;sbit j2=P0^1;sbit j3=P0^2;sbit j4=P0^3;sbit j5=P0^4;sbit j6=P0^5;sbit j7=P0^6;sbit j8=P0^7;unsigned char tttt=0;unsigned char step=0;#define unchar unsigned char#define unint unsigned int#define clear 0x01#define home 0x02#define f_set 0x30#define dis_on 0x0f#define in_mode 0x06sbit P_RS=P2^2;sbit P_RW=P2^1;sbit P_E= P2^0;sbit SCL=P1^6; //IIC时钟引脚定义sbit SDA=P1^7; //IIC数据引脚定义char s[15];//****************************************// 定义MPU6050内部地址//****************************************#define SMPLRT_DIV 0x19 //陀螺仪采样率,典型值:0x07(125Hz)#define CONFIG 0x1A //低通滤波频率,典型值:0x06(5Hz)#define GYRO_CONFIG 0x1B //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)#define ACCEL_CONFIG 0x1C //加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)#define ACCEL_XOUT_H 0x3B#define ACCEL_XOUT_L 0x3C#define ACCEL_YOUT_H 0x3D#define ACCEL_YOUT_L 0x3E#define ACCEL_ZOUT_H 0x3F#define ACCEL_ZOUT_L 0x40#define TEMP_OUT_H 0x41#define TEMP_OUT_L 0x42#define GYRO_XOUT_H 0x43#define GYRO_XOUT_L 0x44#define GYRO_YOUT_H 0x45#define GYRO_YOUT_L 0x46#define GYRO_ZOUT_H 0x47#define GYRO_ZOUT_L 0x48#define PWR_MGMT_1 0x6B //电源管理,典型值:0x00(正常启用)#define WHO_AM_I 0x75 //IIC地址寄存器(默认数值0x68,只读)#define SlaveAddress 0xD0 //IIC写入时的地址字节数据,+1为读取//****************************************//函数声明//****************************************//MPU6050操作函数void InitMPU6050(); //初始化MPU6050void Delay5us();void I2C_Start();void I2C_Stop();void I2C_SendACK(bit ack);bit I2C_RecvACK();void I2C_SendByte(uchar dat);uchar I2C_RecvByte();void I2C_ReadPage();void I2C_WritePage();uchar Single_ReadI2C(uchar REG_Address); //读取I2C数据void Single_WriteI2C(uchar REG_Address,uchar REG_data); //向I2C写入数据//**************************************//延时5微秒(STC90C52RC@12M)//不同的工作环境,需要调整此函数//当改用1T的MCU时,请调整此延时函数//**************************************void Delay5us(){unsigned char i;i = 22;while (--i);}//**************************************//I2C起始信号//************************************** void I2C_Start(){SDA = 1; //拉高数据线SCL = 1; //拉高时钟线Delay5us(); //延时SDA = 0; //产生下降沿Delay5us(); //延时SCL = 0; //拉低时钟线}//**************************************//I2C停止信号//************************************** void I2C_Stop(){SDA = 0; //拉低数据线SCL = 1; //拉高时钟线Delay5us(); //延时SDA = 1; //产生上升沿Delay5us(); //延时}//**************************************//I2C发送应答信号//入口参数:ack (0:ACK 1:NAK)//************************************** void I2C_SendACK(bit ack){SDA = ack; //写应答信号SCL = 1; //拉高时钟线Delay5us(); //延时SCL = 0; //拉低时钟线Delay5us(); //延时}//**************************************//I2C接收应答信号//**************************************bit I2C_RecvACK(){SCL = 1; //拉高时钟线Delay5us(); //延时CY = SDA; //读应答信号SCL = 0; //拉低时钟线Delay5us(); //延时return CY;}//**************************************//向I2C总线发送一个字节数据//**************************************void I2C_SendByte(uchar dat){uchar i;for (i=0; i<8; i++) //8位计数器{dat <<= 1; //移出数据的最高位SDA = CY; //送数据口SCL = 1; //拉高时钟线Delay5us(); //延时SCL = 0; //拉低时钟线Delay5us(); //延时}I2C_RecvACK();}//**************************************//从I2C总线接收一个字节数据//**************************************uchar I2C_RecvByte(){uchar i;uchar dat = 0;SDA = 1; //使能内部上拉,准备读取数据, for (i=0; i<8; i++) //8位计数器{dat <<= 1;SCL = 1; //拉高时钟线Delay5us(); //延时dat |= SDA; //读数据SCL = 0; //拉低时钟线Delay5us(); //延时}return dat;}//**************************************//向I2C设备写入一个字节数据//**************************************void Single_WriteI2C(uchar REG_Address,uchar REG_data)I2C_Start(); //起始信号I2C_SendByte(SlaveAddress); //发送设备地址+写信号I2C_SendByte(REG_Address); //内部寄存器地址,I2C_SendByte(REG_data); //内部寄存器数据,I2C_Stop(); //发送停止信号}//**************************************//从I2C设备读取一个字节数据//**************************************uchar Single_ReadI2C(uchar REG_Address){uchar REG_data;I2C_Start(); //起始信号I2C_SendByte(SlaveAddress); //发送设备地址+写信号I2C_SendByte(REG_Address); //发送存储单元地址,从0开始I2C_Start(); //起始信号I2C_SendByte(SlaveAddress+1); //发送设备地址+读信号REG_data=I2C_RecvByte(); //读出寄存器数据I2C_SendACK(1); //接收应答信号I2C_Stop(); //停止信号return REG_data;}//**************************************//初始化MPU6050//**************************************void InitMPU6050(){Single_WriteI2C(PWR_MGMT_1, 0x00); //解除休眠状态Single_WriteI2C(SMPLRT_DIV, 0x07);Single_WriteI2C(CONFIG, 0x06);Single_WriteI2C(GYRO_CONFIG, 0x18);Single_WriteI2C(ACCEL_CONFIG, 0x01);}//**************************************//合成数据//**************************************int GetData(uchar REG_Address){char H,L;H=Single_ReadI2C(REG_Address);L=Single_ReadI2C(REG_Address+1);return (H<<8)+L; //合成数据}void bit8_serial_input(unchar ix){unchar i;P_E=0;for(i=0x80;i>=0x01;i=i>>1){if((ix&i)==0) P_RW=0; else P_RW=1;P_E=1;P_E=0;}}void instruct(unchar dat){unchar ch;P_RS=1;ch=0xf8;bit8_serial_input(ch);ch=dat&0xf0;bit8_serial_input(ch);ch=dat<<4;bit8_serial_input(ch);P_RS=0;}void write_abyte(unchar dat){data unchar ch;P_RS=1;ch=0xfa;bit8_serial_input(ch);ch=dat&0xf0;bit8_serial_input(ch);ch=dat<<4;bit8_serial_input(ch);P_RS=0;}void dis_str(unchar x, unchar y, unchar *str) {unchar loc,*p;unchar xline[5]={0,1,3,2,4};p=str;x=xline[x];instruct(home);loc=(16*(x-1)+y-1);if(loc&0x01){loc/=2;instruct(loc|0x80);write_abyte(' ');}else{loc/=2;instruct(loc|0x80);}while(*p){write_abyte(*p++);}}void initial(void){data unchar i,j;P_RS=0;P_E=0;instruct(f_set);for(i=0;i<30;i++){}for(i=0;i<250;i++){}for(i=0;i<250;i++){}instruct(f_set);for(i=0;i<30;i++){}for(i=0;i<250;i++){}for(i=0;i<250;i++){}instruct(0x0c);for(i=0;i<30;i++){}instruct(clear);for(j=0;j<10;j++){for(i=0;i<250;i++){} }instruct(in_mode);for(i=0;i<30;i++){}instruct(home);}int gx,gy,gz,wy;unsigned char PWM1,PWM2,PWM3;unsigned char l;//unsigned int idata atab[91]={0,2,11,26,47,74,107,146,190,241,297,360,428,502,582,668,759,857,959,1068,1182,130 2,1428,1559,1695,1837,1984,2137,2295,2459,2627,2801,2980,3164,3353,3547,3745,3949,4157,4 370,4588,4810,5037,5269,5504,5744,5988,6237,6489,6745,7006,7270,7538,7809,8084,8363,864 5,8931,9219,9511,9806,10104,10405,10709,11015,11324,11635,11949,12266,12584,12905,1322 7,13552,13878,14207,14537,14868,15201,15535,15870,16207,16545,16883,17223,17563,17903, 18245,18586,18928,19271,19613};void Delay50m() //@20.000MHz{unsigned char i, j, k;i = 4;j = 205;k = 187;do{do{while (--k);} while (--j);} while (--i);}void Delay50ms(unsigned char aa){while(aa--)Delay50m();}unsigned char input();void inputstep(){char s[]=" ";unsigned char f=0,num;while(1){initial();dis_str(1,1,"选择\xb9\xfd程");sprintf(s,"%d",(int)step);dis_str(2,1,s);Delay50ms(1);num=input();switch(num){case 16:f=1;break;default:step=num;case 0:break;}if(f)break;}}void saveint(int d){IAP_DATA=d>>8;IAP_TRIG=0x5A;IAP_TRIG=0xA5;IAP_ADDRL++;IAP_DATA=d&0xff;IAP_TRIG=0x5A;IAP_TRIG=0xA5;}void savechar(unsigned char d) {IAP_DATA=d;IAP_TRIG=0x5A;IAP_TRIG=0xA5;}unsigned char readchar(){IAP_TRIG=0x5A;IAP_TRIG=0xA5;return IAP_DATA;}int readint(){int d;IAP_TRIG=0x5A;IAP_TRIG=0xA5;d=IAP_DATA;d<<=8;IAP_ADDRL++;IAP_TRIG=0x5A;IAP_TRIG=0xA5;d+=IAP_DATA;return d;}unsigned char pa1,ps1,pa2,ps2;int getangle();void Delay50us();void inputmode(){char s[]=" ";unsigned char num,t;while(1){initial();dis_str(1,1,"当前角度");sprintf(s,"%d",getangle());dis_str(1,9,s);dis_str(3,1,"角速度");sprintf(s,"%d",GetData(GYRO_YOUT_H)/100-wy);dis_str(3,9,s);Delay50ms(1);if(input()==15)break;}t=PWM1>>4;while(1){initial();while(input()==15);Delay50ms(2);dis_str(4,1,"输入PWM1高四位");sprintf(s,"%d",(int)t);dis_str(1,9,s);Delay50ms(1);num=input();switch(num){case 16:case 0:break;default:t=num;}if(num==16)break;}PWM1&=0x0f;PWM1+=t<<4;t=PWM1&0x0f;while(input()==16);Delay50ms(2);while(1){initial();dis_str(4,1,"输入PWM1低四位");sprintf(s,"%d",(int)t);dis_str(1,9,s);Delay50ms(1);num=input();switch(num){case 16:case 0:break;default:t=num;}if(num==16)break;}PWM1&=0xf0;PWM1+=t;while(input()==16);Delay50ms(2);t=PWM2>>4;while(1){initial();dis_str(4,1,"输入PWM2高四位");sprintf(s,"%d",(int)t);dis_str(1,9,s);Delay50ms(1);num=input();switch(num){case 16:case 0:break;default:t=num;}if(num==16)break;}PWM2&=0x0f;PWM2+=t<<4;t=PWM2&0x0f;while(input()==16);Delay50ms(2);while(1){initial();dis_str(4,1,"输入PWM2低四位");sprintf(s,"%d",(int)t);dis_str(1,9,s);Delay50ms(1);num=input();switch(num){case 16:case 0:break;default:t=num;}if(num==16)break;}PWM2&=0xf0;PWM2+=t;while(input()==16);Delay50ms(2);t=PWM3>>4;while(1){initial();dis_str(4,1,"输入PWM3高四位");sprintf(s,"%d",(int)t);dis_str(1,9,s);Delay50ms(1);num=input();switch(num){case 16:case 0:break;default:t=num-1;}if(num==16)break;}PWM3&=0x0f;PWM3+=t<<4;t=PWM3&0x0f;while(input()==16);Delay50ms(2);while(1){initial();dis_str(4,1,"输入PWM3低四位");sprintf(s,"%d",(int)t);dis_str(1,9,s);Delay50ms(1);num=input();switch(num){case 16:case 0:break;default:t=num-1;}if(num==16)break;}while(input()==16);Delay50ms(2);PWM3&=0xf0;PWM3+=t;t=pa1;while(1){initial();dis_str(4,1,"输入一加速时间");sprintf(s,"%d",(int)t);dis_str(1,9,s);Delay50ms(1);num=input();switch(num){case 16:case 0:break;default:t=num-1;if(num==16)break;}while(input()==16);Delay50ms(2);pa1=t;t=ps1;while(1){initial();dis_str(4,1,"输入一减速时间");sprintf(s,"%d",(int)t);dis_str(1,9,s);Delay50ms(1);num=input();switch(num){case 16:case 0:break;default:t=num-1;}if(num==16)break;}while(input()==16);Delay50ms(2);ps1=t;t=pa2;while(1){initial();dis_str(4,1,"输入二加速时间");sprintf(s,"%d",(int)t);dis_str(1,9,s);Delay50ms(1);num=input();switch(num){case 16:case 0:break;default:t=num-1;if(num==16)break;}while(input()==16);Delay50ms(2);pa2=t;t=ps2;while(1){initial();dis_str(4,1,"输入二减速时间");sprintf(s,"%d",(int)t);dis_str(1,9,s);Delay50ms(1);num=input();switch(num){case 16:case 0:break;default:t=num-1;}if(num==16)break;}while(input()==16);Delay50ms(2);ps2=t;gx=GetData(ACCEL_XOUT_H)/100-164; IAP_CONTR=0x83;IAP_ADDRH=0;IAP_ADDRL=0;IAP_CMD=3;IAP_TRIG=0x5A;IAP_TRIG=0xA5;IAP_CMD=2;saveint(gx);gy=GetData(ACCEL_YOUT_H)/100; IAP_ADDRL++;saveint(gy);gz=GetData(ACCEL_ZOUT_H)/100; IAP_ADDRL++;saveint(gz);wy=GetData(GYRO_YOUT_H)/100;IAP_ADDRL++;saveint(wy);IAP_ADDRL++;savechar(PWM1);IAP_ADDRL++;savechar(PWM2);IAP_ADDRL++;savechar(PWM3);IAP_ADDRL++;savechar(pa1);IAP_ADDRL++;savechar(ps1);IAP_ADDRL++;savechar(pa2);IAP_ADDRL++;savechar(ps2);initial();return;}int x,y,z;int getangle(){x=GetData(ACCEL_XOUT_H)/100+164-gx;y=GetData(ACCEL_YOUT_H)/100-gy;z=GetData(ACCEL_ZOUT_H)/100-gz;if(z<0)x=-x;return x;}void Delay50us() //@20.000MHz{unsigned char i, j;_nop_();_nop_();i = 1;j = 245;do{while (--j);} while (--i);}unsigned char input(){unsigned char state,ps; P0=0xff;while(1){j1=0;Delay50us();state=P0;state=state>>4;ps=0;if(state<15)break;j1=1;j2=0;Delay50us();state=P0;state=state>>4;ps++;if(state<15)break;j2=1;j3=0;Delay50us();state=P0;state=state>>4;ps++;if(state<15)break;j3=1;j4=0;Delay50us();state=P0;state=state>>4;ps++;if(state<15)break;j4=1;break;}switch(state){case 15:return 0;case 14:return 1+4*ps;case 13:return 2+4*ps;case 11:return 3+4*ps;case 7:return 4+4*ps;}return 0;}void rd(){l1=1;l2=0;Delay50ms(pa1);l1=0;Delay50ms(ps1);}unsigned char a;float b;unsigned char reset=0;unsigned char xd,xa;int angle;void main(){InitMPU6050(); //初始化MPU6050IAP_CONTR=0x83;IAP_ADDRH=0;IAP_ADDRL=0;IAP_CMD=1;gx=readint();IAP_ADDRL++;gy=readint();IAP_ADDRL++;gz=readint();IAP_ADDRL++;wy=readint();IAP_ADDRL++;PWM1=readchar();IAP_ADDRL++;PWM2=readchar();IAP_ADDRL++;PWM3=readchar();IAP_ADDRL++;pa1=readchar();IAP_ADDRL++;ps1=readchar();IAP_ADDRL++;pa2=readchar();IAP_ADDRL++;ps2=readchar();TMOD=0X20;TH1=0xfb;TL1=0xfb;SCON=0x50;TR1=1;ES=1;CCON=0;CL=0;CH=0;CMOD=0x02;CCAP0H=CCAP0L=0x20; CCAPM0=0x42;CR=1;EA=1;TI=0;RI=0;/*gx=0;gy=0;gz=0;wy=0;*/initial();dis_str(1,1,"预处理");l=20;initial();dis_str(3,1,"按功能键校准重力"); dis_str(1,2,"3秒后启动……"); for(a=1;a<=20;a++){Delay50ms(1);if(input()==16)inputmode(); }dis_str(1,2,"2秒后启动……"); for(a=1;a<=20;a++){Delay50ms(1);if(input()==16)inputmode(); }dis_str(1,2,"1秒后启动……"); for(a=1;a<=20;a++){Delay50ms(1);if(input()==16)inputmode();}reset=0;step=1;inputstep();if(step==1)rd();if(step==2){l1=1;l2=0;Delay50ms(pa2);l1=0;Delay50ms(ps2);}xa=1;while(1){/*initial();sprintf(s,"%d",GetData(ACCEL_XOUT_H)-gx);dis_str(1,1,s);Delay50ms(1);*//*angle=GetData(ACCEL_XOUT_H);sprintf(s,"%d",angle);dis_str(1,1,s);angle=GetData(ACCEL_YOUT_H);sprintf(s,"%d",angle);dis_str(2,1,s);angle=GetData(ACCEL_ZOUT_H);sprintf(s,"%d",angle);dis_str(3,1,s);angle=getangle();sprintf(s,"%d",angle);dis_str(4,1,s);sprintf(s,"%d",GetData(ACCEL_XOUT_H));dis_str(1,1,s);sprintf(s,"%d",GetData(GYRO_YOUT_H));dis_str(2,1,s);sprintf(s,"%d",GetData(ACCEL_ZOUT_H));dis_str(3,1,s);Delay50ms(1);*/switch(step){case 1:CCAP0H=CCAP0L=PWM1;if(GetData(ACCEL_XOUT_H)-gx>0)if(GetData(GYRO_YOUT_H)-wy>0&&getangle()>0){l1=1;l2=0;}else if(GetData(GYRO_YOUT_H)-wy<0&&getangle()<0){l1=0;l2=1;}else{}else{l1=0;l2=0;}break;case 2:CCAP0H=CCAP0L=PWM2;angle=getangle();if(GetData(GYRO_YOUT_H)-wy>0&&angle>150){l1=1;l2=0;xd=0;}else if(GetData(GYRO_YOUT_H)-wy<0&&angle<-150){l1=0;l2=1;xd=0;}else if(angle<70&&angle>-70){l1=0;l2=0;if(angle>0)xd|=2;else xd|=1;if(xd==3){while(1);}}break;case 3:CCAP0H=CCAP0L=PWM3;if(getangle()<0){l1=1;l2=0;}else{l1=0;l2=1;}break;}if(reset){initial();dis_str(1,1,"\xd5\xfd在烧写程序……");IAP_CONTR=0x60;Delay50ms(40);}}}unsigned char cmd;void RSINTR() interrupt 4{if(RI==1){cmd=SBUF;cmd=cmd<<4;cmd=cmd>>4;if(cmd==0x0e){reset=1;}RI=0;}}。
2013年全国电子设计大赛(c题)报告

2014年8月30日旋转倒立摆简易及控制装置(C题)【本科组】参赛队号:20130297简易旋转倒立摆及控制装置(C题)摘要倒立摆的控制是控制理论研究中的一个经典问题,是理想的自动控制教学实验设备,使用它能全方位满足自动控制教学要求,具有模块好和品种多样化等优点。
本组旋转倒立摆系统的稳定性较好,抗干扰能力较强。
机械部分包括旋转臂、摆杆、电动机、转轴、支架。
控制系统设计包括系统硬件电路及软件设计。
硬件部分采用角速度传感器与主控芯片相连,通过角度的测算实时向MCU发送摆杆的状态,MCU通过控制LM298进而控制电机的转向,进而控制摆杆的状态。
主控芯片采用STC12C5A60S2,通过LM298电机驱动与减速直流电机进行通信,并实时用LCD1602液晶显示参数。
软件部分根据最基本的PID算法,给出了程序设计流程图并用C语言编写了控制程序。
关键词:STC12C5A60S2 角速度传感器 LM298AbstractChuangyi Jane round the Chinese dragon light and archaic wall great the Great Wall of the song typeface do regular script variety of body control of inverted pendulum is a classical problem in the study of control theory, is an ideal automatic control teaching experiment equipment, the use of it can meet the requirements of automatic control teaching in all directions, has the advantages of good module and species diversity. This group of rotational inverted pendulum system is of good stability, strong anti-jamming capability. Mechanical parts including rotating arm, swinging rod, motor, shaft and support. Control system design including the system hardware circuit and software design. Hardware part adopts angular velocity sensor is connected to the main control chip, through the Angle of the measured real-time send MCU state of swinging rod, MCU by controlling LM298 and steering control motor, and control the state of the swinging rod. Master control chip USES STC12C5A60S2, through LM298 motor driver communicate with dc motor slowdown, and real-time use LCD1602 LCD display parameters. Software part according to the basic PID algorithm, and gives the flow chart of program design using C language to write the control program.Keywords:STC12C5A60S2 LM298 angular velocity transducer目录一、系统方案 (3)1、总体设计方案 (3)2、方案的比较 (3)2.1 电机的选择 (3)2.2 传感器的选择 (3)2.3 控制系统 (3)二、理论分析与计算 (4)1、理论分析 (4)1.1 角度传感器 (4)1.2 PWM脉冲宽度调制 (4)2、PID算法 (4)三、电路与程序设计 (4)1、电路 (5)1.1 系统总体框图 (5)1.2 最小系统框图 (5)1.3 电源 (5)2、程序流程图 (5)2.1 主程序流程图 (5)2.2 电机驱动子程序流程图 (5)2.3 角度传感器子程序流程图 (5)四、测试方案与测试结果 (6)1、测试方案 (6)1.1 硬件测试 (6)1.2硬件软件联调 (6)2、测试结果及其分析 (6)五、结论 (6)附录:附一:最小系统电路图 (7)附二:程序清单 (8)一、系统方案1、总体设计方案本系统主要由角速度传感器模块、单片机最小系统模块、电机模块、电源模块组成。
【VIP专享】近三年大赛题目、器件清单

4
D
LC 谐振放大器
----------------------------------------
间大于 10 分钟) 滑线变阻器(50Ω/2A) 变容二极管(30pF~100pF) 光电传感器 角度传感器 超声传感器 红外收发管
2011 年全国大学生电子设计竞赛题目
本科组
序号 题号 题目
----------------------------------------
2013 年全国大学生电子设计竞赛题目清单
【本科组题目】
题号 题目
A
B
C
D
E
F
G
单相 AC-DC 变换电路
四旋翼自主飞行器
简易旋转倒立摆及控制装置
射频宽带放大器
简易频率特性测试仪
红外光通信装置
手写绘图板
【高职高专组题目】
题号 题目
J
K
L
电磁控制运动装置
简易照明线路探测仪
直流稳压电源及漏电保护装置
2013 年全国大学生电子设计竞赛 基本仪器和主要元器件清单
/*文件目录\2013
/*文件目录\2013 /*文件目录\2013
/*文件目录\2013
标准高频信号发生器(1MHz~100MHz,可输出 1mV 小信号) 函数发生器(10 MHz,DDS) 低频毫伏表 高频毫伏表 100 MHz 频率计 数字式单相电参数测量仪 秒表 量角器 温度计 五位半数字万用表 单片机开发系统及 PLD 开发系统 2. 主要元器件清单 单片机最小系统板 R5F100LEA(瑞萨 MCU),已下发到赛区组委会 A/D、D/A 转换器 AD9854ASVZ(与 AD9854ASQ 等同) 运算放大器、电压比较器、乘法器 可编程逻辑器件及其下载板 显示器件 小型继电器 小型电机 带防撞圈的四旋翼飞行器(外形尺寸:长度≤50cm,宽度≤50cm;续航时
2013年全国电子设计大赛C题设计报告.doc

2013年全国大学生电子设计竞赛题目:简易旋转倒立摆及控制装置(C题)参赛学校:江苏师范大学队伍编号:XZ 015参赛队员:徐园明、刘海腾、黄波指导教师:朱士虎、王立巍2013年9月7日目录摘要 (1)Abstract (1)1方案论证与比较 (2)1.1电机类型的论证与选择 (2)1.2单片机的论证与选择 (2)1.3电机驱动电路的论证与选择 (2)1.4角度传感器的论证与选择 (3)2系统实现方框图和电路设计 (4)2.1系统总体框架图和实物构架图 (4)2.2硬件电路设计 (5)2.2.1电位器电路 (5)2.2.2显示模块的电路 (5)2.2.3电机驱动电路 (6)3系统软件设计 (7)3.1精密电位器误差计算 (7)3.2倒立摆控制策略 (7)3.3系统流程图 (9)4测试方案与测试结果 (10)4.1测试仪器 (10)4.2测试结果 (10)4.3测试结果分析 (11)参考文献 (12)摘要本文以STC12C5A60S2单片机为控制核心,通过角度传感器实时检测出倒立摆的位置并由单片机计算,计算PID控制算法,实现对直流电机转速的控制,达到倒立摆的动态平衡。
同时系统可以通过键盘设定运行模式和相关角度值,倒立摆运行角度和运行时间由液晶显示,具有较好人机界面。
系统设计结构简单,制作成本低,控制精度高。
关键字:STC12C5A60S2 倒立摆 PIDAbstractThis paper takes STC12C5A60S2 single chip as the control core,Through the real-time detection of the inverted pendulum's position and angle sensor is composed of a single chip computer calculation,Calculation of PID control algorithm,Control the speed of the DC motor,To achieve the dynamic balance of the inverted pendulum.At the same time the system can be set through the keyboard operation mode and related anglevalues.Inverted pendulum movement angle and running time by the liquid crystal display,With good man-machine interface.The system has the advantages of simple structure design,Low production cost,High control precision.Keyword: STC12C5A60S2 level inverted pendulum PID1 方案论证与比较1.1电机类型的论证与选择方案一:采用步进电机。
2013年全国电子设计大赛题目简易旋转倒立摆及控制装置(C题 )

2013年全国大学生电子设计竞赛试题参赛注意事项(1)9月4日8:00竞赛正式开始。
本科组参赛队只能在【本科组】题目中任选一题;高职高专组参赛队在【高职高专组】题目中任选一题,也可以选择【本科组】题目。
(2)参赛队认真填写《登记表》内容,填写好的《登记表》交赛场巡视员暂时保存。
(3)参赛者必须是有正式学籍的全日制在校本、专科学生,应出示能够证明参赛者学生身份的有效证件(如学生证)随时备查。
(4)每队严格限制3人,开赛后不得中途更换队员。
(5)竞赛期间,可使用各种图书资料和网络资源,但不得在学校指定竞赛场地外进行设计制作,不得以任何方式与他人交流,包括教师在内的非参赛队员必须回避,对违纪参赛队取消评审资格。
(6)9月7日20:00竞赛结束,上交设计报告、制作实物及《登记表》,由专人封存。
简易旋转倒立摆及控制装置(C题)【本科组】一、任务设计并制作一套简易旋转倒立摆及其控制装置。
旋转倒立摆的结构如图1所示。
电动机A固定在支架B上,通过转轴F驱动旋转臂C旋转。
摆杆E通过转轴D固定在旋转臂C的一端,当旋转臂C在电动机A驱动下作往复旋转运动时,带动摆杆E在垂直于旋转臂C的平面作自由旋转。
二、要求图1旋转倒立摆结构示意图1.基本要求(1)摆杆从处于自然下垂状态(摆角0°)开始,驱动电机带动旋转臂作往复旋转使摆杆摆动,并尽快使摆角达到或超过-60°~+60°;(2)从摆杆处于自然下垂状态开始,尽快增大摆杆的摆动幅度,直至完成圆周运动;(3)在摆杆处于自然下垂状态下,外力拉起摆杆至接近165°位置,外力撤除同时,启动控制旋转臂使摆杆保持倒立状态时间不少于5s;期间旋转臂的转动角度不大于90°。
2.发挥部分(1)从摆杆处于自然下垂状态开始,控制旋转臂作往复旋转运动,尽快使摆杆摆起倒立,保持倒立状态时间不少于10s;(2)在摆杆保持倒立状态下,施加干扰后摆杆能继续保持倒立或2s内恢复倒立状态;(3)在摆杆保持倒立状态的前提下,旋转臂作圆周运动,并尽快使单方向转过角度达到或超过360°;(4)其他。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
参赛注意事项
9月4日8:00竞赛正式开始。
本科组参赛队只能在【本科组】题目中任选一题;高
职高 专组参赛队在【高职高专组】题目中任选一题,也可以选择【本科组】题目。
参赛队认真填写《登记表》内容,填写好的《登记表》交赛场巡视员暂时保存。
参赛者必须是有正式学籍的全日制在校本、专科学生,应出示能够证明参赛者学生身份 的有效证件(如学生证)随时备查。
每队严格限制3人,开赛后不得中途更换队员。
竞赛期间,可使用各种图书资料和网络资源,但不得在学校指定竞赛场地外进行设计制 作,不得以任何方式与他人交流,包括教师在内的非参赛队员必须回避,对违纪参赛队 取消评审资格。
9月7日20:00竞赛结束,上交设计报告、制作实物及《登记表》
,由专人封存。
易旋转倒立摆及控制装置(C 题)
简【本科组】
、任务
D 固定在旋转臂C 的一端,当旋转臂C 在电动机A 驱动下作往复旋转运动时, 带动摆杆
E 在垂直于
旋转臂C 的平面作自由旋转。
二、要求
图1旋转倒立摆结构示意图
1.基本要求
(1)摆杆从处于自然下垂状态(摆角 0°开始,驱动电机带动旋转臂作往复 旋转使摆杆
摆动,并尽快使摆角达到或超过-60° +60°
(2)从摆杆处于自然下垂状态开始,尽快增大摆杆的摆动幅度,直至完成圆
周运动;
2013年全国大学生电子设计竞赛试题
(6)
设计并制作一套简易旋转倒 立摆及其控制装置。
旋转倒立摆 的结构如图1所示。
电动机A 定在支架B 上,通过转轴F 驱动 旋转臂C 旋转。
摆杆E 通过转轴 D 转轴
(1
6
1.旋转倒立摆机械部分必须自制,结构要求如下:硬质摆杆 E 通过转轴 D 连 接在旋转臂C 边
缘,且距旋转臂C 轴心距离为20cn ± 5cm ;摆杆的横截面 为圆形或正方形,直径或边长不超过 1cm ,长度在15cn ± 5cm 范围内;允 许使用传感器检测摆杆的状态,但不得影响摆杆的转动灵活性;图 1 中支 架 B 的形状仅作参考,其余未作规定的可自行设计结构;电动机自行选型。
2.摆杆要能够在垂直平面灵活旋转,检验方法如下:将摆杆拉起至水平位置后 松开,摆杆至少
能够自由摆动 3 个来回。
3.除电动机 A 之外,装置中不得有其他动力部件。
4.摆杆自然下垂状态是指摆角为
0°位置,见图 2。
5.摆杆倒立状态是指摆杆在 -165°至 165°范围内。
6.基本要求( 1)、(2)中,超过 30s 视为失败;发挥部分( 1)超过 90s 视为失 败;发挥
部分( 3)超过 3 分钟即视为失败;以上各项,完
3)在摆杆处于自然下垂状态下,外力拉起摆杆至接近 除同时,启动控制旋转臂使摆杆保持倒立状态时间不少于 转臂的转动角度不大于 90°。
165°位置,外力撤
5s ;期间旋
2.发挥部分
1) 从摆杆处于自然下垂状态开始,控制旋转臂作往复旋转运动,
杆摆起倒立,保持倒立状态时间不少于 10s ;
尽快使摆
2) 在摆杆保持倒立状态下,施加干扰后摆杆能继续保持倒立或 立状
态;
2s 内恢复倒
3) 在摆杆保持倒立状态的前提下,旋转臂作圆周运动,并尽快使单方向转
过角度达到或超过 360°; 4) 其他。
三、说明
成时间越短越好。
时施加干扰的方法是,以15cm 长细绳栓一只5克砝码,在摆杆上方将砝码拉 起15°~45°释放后用砝码沿摆杆摆动的切线方向撞击摆杆上端 1~2cm 处;以
抗扰动能力强弱判定成绩。
8.测试时,将在摆杆后1~2cm 处固定一如图2所示轻质量角器,以方便观察摆
杆的旋转角度。
四、评分标准
项目
主要内容
分数 系统方案 系统结构、方案比较与选择
4
理论分析与计算
电动机选型、摆杆状态检测, 驱动与控制算法
6
电路与程序设计
电路设计程序结构与设计
5
测试方案与测试 结果
测试结果及分析
3
设计报告结构及 规范性
摘要设计报告正文的结构 公式、图表的规范性
2
总分 20 完成(1)
15 完成(2)
15
设计报告
基本要求
-|M'|h4i
I 汕
-11?3
1%
•畑
.11宦
图2.摆杆位置示意图 7.摆杆倒立
■ IhS
-忤。