全部资料51hei下载地址:
校电赛已完成部分.zip
(1.17 MB, 下载次数: 135)
二、 要求
1. 基本要求
1) 由起点开始启动装置,控制风板在不少于 5s,不大于 10s 的时间内从起点到达终点。
2) 预置风板控制角度(控制角度在 45°~135°之间设定)。由起点开始启动装置,控制风板达到预置角度,过渡过程时间不大于 15s,控制角
2 / 2
度误差不大于 5°,在预置角度上的稳定停留时间为 5s,误差不大于1s。动作完成后风板平稳停留在终点位置上;
3) 显示风板设置的控制角度。风板从一个状态转变到另一个状态时应有明显的声光提示。
2. 发挥部分
1) 在 45°~135°范围内预置两个角度值(Φ 1 和 Φ 2 )。 由终点开始启动装置,在 10s 内控制风板到达第一个预置角度上;然后到达第二个预置角度,在两个预置角度之间做 3 次摆动,摆动周期不大于 5s,摆动幅角误差不大于 5°,动作完成后风板平稳停留在起点位置上;
2) 利用 LCD 或 OLED 进行风板角度的实时显示(精确到度);
3) 在基本要求 2)的基础上实现控制角度误差不大于 2°
三、 说明
1. 给出的图 1 仅作参考,风板的外形尺寸要求为:高 150mm×宽 200mm,厚度和制作材料及风板支架的机械连接方式不做限定;风板上除安装风板转动轴、角度指示针和传感器外,不能安装其他任何装置;风机数量和控制风向方式可自行设计确定;可以设置风板起始位置、终点位置的限位装置,限定风板能在与水平线成 30°~150°的夹角内摆动。
2. 风板的运动状态,都要通过控制风机的风量来完成,不能受机械结构或其它外力的控制。 机械结构摩擦力不能过大,将风板由竖直状态释放后, 给予微小扰动, 风板可以在重力作用下倒下。 控制角度误差为实测角度与预置角度之差的绝对值。风板由静止开始运动到规定控制角度的时间定义为过渡过程时间。风板从一个状态转变到另一个状态时应有明显的声光提示,声光提示只作为测评计时的参考,以现场实测数据为准。
3. 如装置在测评时出现故障导致其无法继续进行测评,则成绩无效。
单片机源程序如下:
- /* 连接:MSP430 P3.0 P3.1 GND GND
- * | | | | |
- * MPU6050 SDA SCL GND AD0 */
- #include "msp430f5529.h"
- #include "DataScope_DP.h"
- #include "UART_F5529.h"
- #include "I2C_F5529.h"
- #include "MPU6050.h"
- #include "math.h"
- #include "Ucs_Init_Set.h"
- #include "lcd12864c.h"
- #define CPU_F ((double)25000000)//MCLK=25KHZ,利用自带的延时函数来实现高精度的延时
- #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
- #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
- int a=0,b=0;
- float ax,ay,az; //加速度原始数据
- float Ax,Ay,Az;//单位 g(9.8m/s^2)
- float Angel_accZ[10];//存储加速度计算出的角度
- float Angel_accZ1;//存储加速度计算出的角度
- int Angel_accZ2=0;
- void PIDset();
- void GetData_Accel(void)//获取加速度值,及存储加速度计算出的角度
- {
- //for(i=0;i<5;i++)
- //{
- ax = GetAccelX ();//加速度原始数据
- ay = GetAccelY ();
- az = GetAccelZ ();
- Ax=ax/16384.00; //对加速度进行量化,得出单位为g的加速度值
- Ay=ay/16384.00;
- Az=az/16384.00;
- Angel_accZ2=acos(Az/(sqrt(Ax*Ax+Ay*Ay+Az*Az)))*180/3.14; //加速度计算三个轴和水平面坐标系之间的夹角
- //}
- // Angel_accZ1 = Angel_accZ[0]+Angel_accZ[1]+Angel_accZ[2]+Angel_accZ[3]+Angel_accZ[4]
- ;
- // Angel_accZ2 = Angel_accZ1;
- }
- int Incremental_PID_C1(float Encoder,float Target)
- {
- static float Bias=0,Last_bias=0,Pwm=0,ll_bias=0;
- Bias=Encoder-Target;
- Pwm+=30*(2.45*Bias-3.5*Last_bias+1.25*ll_bias);
- ll_bias=Last_bias;
- Last_bias=Bias;
- if(Pwm>29000) Pwm=29000;
- if(Pwm<1000) Pwm=1000;
- return Pwm;
- }
- void PIDset()
- {
- int i0=0;
- int a1=0;
- P6DIR|= BIT6+BIT7;
- P7DIR|=BIT1+BIT2;
- P6OUT|= BIT6;
- P6OUT&= ~BIT7;
- P7OUT|= BIT1;
- P7OUT&= ~BIT2;
- a1=Incremental_PID_C1(Angel_accZ2,120);
- P2DIR|=BIT0+BIT1;
- for(i0=0;i0<30000;i0++)
- {
- if(i0<=a1) {P2OUT =10; }
- else {P2OUT=01; }
- }
- }
- /*void PIDs1()
- {
- a=Incremental_PID_C1(Angel_accZ2,90);
- P6DIR|= BIT6+BIT7;
- P7DIR|=BIT1+BIT2;
- P6OUT|= BIT6;
- P6OUT&= ~BIT7;
- P7OUT|= BIT1;
- P7OUT&= ~BIT2;
- P2DIR |= BIT0+BIT1; // P2.0 and P2.1 output
- P2SEL |= BIT0+BIT1; // P2.0 and P2.1 options select
- TA1CCR0 =511; // PWM Period
- TA1CCTL1 = OUTMOD_7; // CCR1 reset/set
- TA1CCR1 = a ; // CCR1 PWM duty cycl
- TA1CCTL2 = OUTMOD_7; // CCR2 reset/set
- TA1CCR2 = 511- a ; // CCR2 PWM duty cycle
- TA1CTL = TASSEL_1 + MC_1 + TACLR; // ACLK, up mode, clear TAR
- }*/
- void main(void)
- {
- int ii2=0;
- WDTCTL = WDTPW + WDTHOLD;//Stop watchdog timer to prevent time out reset
- LCD_init();
- Ucs_25Mhz();
- UART_Init();
- PIDset();
- MPU6050Init();
- _EINT();
- while(1)
- {
- ii2++;
- if(ii2==1)
- {
- ii2=0;
- GetData_Accel();
- //LCD_write_float(1,0,Angel_accZ2);
- }
- PIDset();
- //PIDs1();
- // LCD_write_float(0,1,TA1CCR1);
- // LCD_write_float(1,0,Angel_accZ2);
- //LCD_write_float(0,2,TA1CCR2);
- }
- }
复制代码
|