m=GetData(ACCEL_XOUT_H)/96; //使m的值介于正负180 n=abs(m); j=m/5;
k=n*3/5+num1/2+j*num1/3+j*j*num1/4+num3+num3*num3/2; cun1=n*4/5+num5/2+j*num5/2+j*j*num5/3+num7+num7*num7/2; t1=k; t2=cun1;
if(m>0&&m<60) //如果车子倾斜在正向30度以内 { P01=0; //控制电机转向 P14=0; P02=1; P15=1; while(t1) { if(k%8==0||k%8==1||k%8==2||k%8==3||k%8==4||k%8==5) { P00=1; //PWM调速 P03=1; } if(k%8==6||k%8==7) { P03=0; P00=1; } t1--; } P00=0; P03=0; delay(4);
if(i0==0) //使显示频率为原来的1/30 { Display10BitData(GetData(ACCEL_XOUT_H),2,0); //显示X轴加速度 Display10BitData(GetData(GYRO_XOUT_H),2,1); //显示X轴角速度 DisplayOneChar(7,0,'1'); //如果正倾则显示001
DisplayOneChar(7,1,c); Display10BitData(num0,8,0); Display10BitData(num2,12,0);
//按键微调
Display10BitData(num4,8,1); Display10BitData(num6,12,1); } } if(m<0&&m>-60) //如果车子倾斜在负向30度以内 { P01=1; P14=1; P02=0; P15=0; while(t2) {
if(cun1%8==0||cun1%8==1||cun1%8==2||cun1%8==3||cun1%8==4||cun1%8==5) { P00=1; P03=1; } if(cun1%8==6||cun1%8==7) { P03=0; P00=1; } t2--; } P00=0; P03=0; delay(4); if(i0==0) { Display10BitData(GetData(ACCEL_XOUT_H),2,0); //显示X轴加速度 Display10BitData(GetData(GYRO_XOUT_H),2,1); //显示X轴角速度 DisplayOneChar(7,0,'0'); //如果反倾则显示000 DisplayOneChar(7,1,c); Display10BitData(num0,8,0); //显示按键值 Display10BitData(num2,12,0); Display10BitData(num4,8,1); Display10BitData(num6,12,1); }
/* }
if(m>=60||m<=-60) //如果车子倾斜角大于正负30则电机停止转动 {
P01=1; P14=1; P02=1; P15=1;
} } }
}
if(i0==0) { Display10BitData(GetData(ACCEL_XOUT_H),2,0); //显示X轴加速度 Display10BitData(GetData(GYRO_XOUT_H),2,1); //显示X轴角速度Display10BitData(num0,8,0); //显示按键值 Display10BitData(num2,12,0); Display10BitData(num4,8,1); Display10BitData(num6,12,1);
} */ 结束语:通过这次自平衡小车的设计,我们学到了许多知识,特别是与之相关的硬件,我们通过查找大量资料,熟悉并能正确地使用其中的那些模块。过程中还有其他备选模块,我们也了解了许多。并且能够用Altium Designer 熟悉地绘制原理图与相关的PCB布线图。其中的稳压模块、单片机控制模块及LCD1602显示模块便是应用此软件辅助完成的硬件制作。虽然其中我们付出了很多时间与精力,但是比起我们的所学,还是很值得的。自平衡小车的软件控制部分比较难,需要涉及IIC总线通信,1602的显示,MPU6050的通信协议等,在算法里面涉及卡耳曼滤波、PID算法控制等诸多比较难的编程。这些在我们组成员的共同努力,通过查阅大量参考程序,以及自已积累的单片机编程知识,都完成了相应的工作。遗憾的是,限于时间与精力,自平衡小车的平衡还欠佳,不能平衡太久。以后有空余时间,我们一定会慢慢改进。在此,特别感谢三位指导老师给我们提供的大量真诚与无私的指导与帮助,才让我们有信心坚持下去。同时也教会我们不少产品设计方面的知识,再次深表谢意!
任务分配
戴 磊:硬件的组装与PCB制作 瘳 崎:软件的编程以及后期的调试
李 旭:相关硬件资料的收集及设计报告的书写 王思然:卡耳曼滤波及PID算法的钻研