基于单片机的平衡小车的设计 电气工程及其自动化专业_第1页
基于单片机的平衡小车的设计 电气工程及其自动化专业_第2页
基于单片机的平衡小车的设计 电气工程及其自动化专业_第3页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、题目: 基于单片机的平衡小车的设计 摘要:两轮自平衡车在我们的生活中已经是越来越常见,他的一个极其突出的特性就是不稳定,与他很类似的一个模型就是倒立摆。我们必须知道倒立摆的状态,然后对他进行干扰才能使它保持稳定状态。本论文所研究的方案就是基于这种原理,用陀螺仪和加速度计来获取到平衡车的当前状态,然后控制电机来作出相应的干扰,来让小车保持平衡。整个系统设计完成后,小车可以实现自主平衡功能。并且,在人为加入适量干扰后小车也能够自主调整并迅速恢复至稳定状态。系统还保留了大部分接口,可以进行二次开发和升级,包括手机蓝牙控制、wifi控制、视觉导航、轨迹跟踪等。关键词: 加速度;PID算法;陀螺仪;两轮

2、自平衡小车Abstract: two rounds of self-balancing vehicle is already more and more common in our life, he's a very prominent feature is unstable, and he is very similar to a model of inverted pendulum. We need to know the status of the inverted pendulum, and then to his interference to keep it stable.

3、 Mentioned in the present paper research plan is based on the principle of using gyroscope and accelerometer to get to the current state of the balance of the car, and then control the motor to make corresponding interference, to let the car balance.After completion of the whole system design, the c

4、ar can achieve balance function independently. And, in human after adding suitable amount of interferenceThe car can also independent adjustment and quickly return to a stable state. System also has kept most of the interface, can undertake secondary development and upgrading, including mobile phone

5、 bluetooth, wifi, visual navigation, path tracking, etc.Keywords: Accelerometer;PID algorithm;Gyroscope;Balance of the car目录1 绪论11.1 自平衡小车的研究意义11.2 课题研究的主要任务12 原理分析与关键技术22.1 原理分析22.2关键技术22.2.1 系统建模22.2.2 姿态检测22.2.3 控制算法33 系统硬件设计63.1 物理架构73.2 元器件选型83.2.1 微处理器23.2.2 陀螺仪与加速度计23.2.3 电机驱动33.2.4 编码器33.2.5

6、 显示屏34 系统软件设计164.1 模块初始化174.2 PID算法设计184.3 总体软件架构274.4 调试技巧275 总结与展望375.1 总结375.2 展望37参考文献38附录38致谢38III1 绪论1.1研究意义近年来,科技发展,时代进步。其中各种科技产品也是如雨后春笋纷纷涌现,用科技改变世界的时代也是在加速到来。但是,日益拥堵的交通状况问题也是越来越严重。改变交通现状已经刻不容缓,其中两轮平衡车是极具代表性的一个产品,他适应时代,应运而生。以其新颖,时尚,方便的优势迅速走入大家的生活。这种平衡车与其他短途代步工具的最显著的特点是:他只有两个轮子,都是独立驱动工作,并且两个轮子

7、在一根轴上面,车的重量加上人的重量正好落在车轴上面,通过轮子前后运动来保持车生的平衡。由于是使用蓄电池供电,所以没有污染,并且可以重复适用,寿命很高。而且电动机能量转换运行效率较高并且只有很小的噪音。由于两个轮子都可以前进后退,所以他可以在很狭窄的空间范围当中也可以进退自如。对他的控制也是极其方便,只要通过身体的前后倾斜改变平衡车的倾斜角度,当陀螺仪检测到角度的变化后,将数据传送给单片机,单片机进行数据处理和融合,将输出型号传送给电机驱动芯片,进而来控制电机运转,防止人摔倒。这样完全可以避免在传统汽车上出现的刹车片老化刹车不灵的情况,极大地保证了驾驶人员的安全。基于以上各种优点可以看出两轮自平

8、衡车有着广泛的应用前景,目前市面上已经涌现除了大量的平衡车。因此本论文对于平衡车的研究意义非凡。1.2课题研究的主要内容本论文着重研究的两轮平衡车系统主要是由单片机进行控制。完成该设计后,小车能实现自我平衡,直立行走等基本功能。该系统采用了STM单片机作为核心的控制单元,并加上各种辅助传感器,完成相对应的电路设计并编写相对应程序完成平衡控制。加速度计可以获得小车的倾斜角度,陀螺仪可以捕获小车的角速度,两种数据捕获后传送给MCU,MCU对数据进行处理,滤波然后加以融合。而编码器可以捕获平衡小车两个轮子的即时速度。然后把即时速度和滤波后的数据进行闭环数据处理,得到最终的输出量把所有的数据量进行数据

9、叠加然后传送给驱动芯片,进而来控制小车的行走状态。2 原理分析与关键技术2.1 原理分析举一个例子,在生活中我们可以尝试让一个根木杆立在手心当中而不倒下去,这一个看似简单的过程,其实就包括了反馈机制里面所有的条件。我们眼睛看到木杆往一边倒下去,我们就会尝试让手往相反的方向去移动,让木杆继续保持平衡。控制给定控制对象执行机构控制算法传感器大脑手掌眼睛木棒 图2-1 保持木棍直立的反馈控制系统 应用到平衡车上面也是一样的。由于小车是两轮共一个轴,所以小车只会向前或者向后倾斜,当小车倾斜后,陀螺仪加速度计等传感器就会感知到小车倾斜了,并且CPU会算出小车倾斜的角度和速度。电机在得知倾斜的角度和速度后

10、以相对应迅速向相同的方向移动,小车就可以保持平衡。这里的传感器就相当于木杆模型中的眼睛,用来捕获倾斜的角度和速度,而大脑控制手往那个方向动的过程就相当于CPU算出电机转动方向与速度的过程。最后手控制木杆就相当于电机的转动。2.2关键技术2.2.1 系统建模数学建模的主要理论依据是牛顿力学原理,建立模型后整个控制流程一目了然,而且一个良好的物理模型还有助于软件方面的设计与实现。如图1.2所示,倒立摆只有在直立时才算是处于平衡的,但是当倒立摆向右倾斜时,它就偏离了平衡位置。而此时小车的合力与位移方向相同,他就会加速向右倾斜,然后倒下去。我们为了让小车不倒下稳定在一个平衡位置。在下面轮子上施加一个向

11、右的外力,使轮子快速向右移动,来保持车身的平衡。以小车作为参考系,重心受到一个额外的惯性力,与车轮加速度大小相同,方向相反。因此倒立摆所受到的回复力为 F=mgsinmacos (3-1)根据控制系统的特性,角需要控制在很小的范围内,并且假设控制车轮加速度与角成正比,比例系数为k1,因此上式可近似处理为 F=mgmk1 (3-2)此时,只要k1g,回复力的方向便和位移方向相反,此时小车可以恢复到平衡位置。为使小车能在平衡位置尽快的稳定下来,还需要有阻尼力,阻尼力与角速度方向相反,大小成正比。式(3-2)可变为 F=mgmk1mk2' (3-3)式中,k1,k2均为比例系数,为小车倾角,

12、'为角速度。只要满足k1g,k20,便可以将小车维持在直立状态。k2是小车回到垂直位置的阻尼系数,选取合适的阻尼系数可以保证小车可以尽快稳定在垂直位置。因此为了控制小车稳定,需要精确的测量小车倾角的大小和角速度'的大小,并以此控制车轮的加速度。2.2.2 姿态检测两个轮子自的平衡小车的一个主要特征就是高度的不稳定,对小车进行控制好与坏的一个重要前提是传感器能否采集到精确地数据。目前,采用最多的解决方案是:倾斜角度由加速度计采集,角速度有陀螺仪采集,将两种数据融合处理后得到小车的即时运行状态。但是,由于这些传感器有一些自有的特征属性,他们采集的数据会因温度等外界环境的变化而变化。

13、这些变化随着时间的推移会产生很大的误差,因此我们会采用一些滤波算法对数据进行处理,使融合后的数据最接近真实的数据。2.2.3控制算法两个轮子的平衡车的最终目标是要在适当的外界干扰下还能实现自我平衡。这就需要我们选择合适的控制算法进行控制,进而让小车迅速恢复到平衡状态。传统的PID算法已经问世了很多年,他已经经历了几十年的实践检验,所以PID算法是本论文要着重研究的控制算法。3 系统硬件设计3.1 系统架构本设计采用stm32f103c8t6作为主要控制器。用mpu6050作为辅助姿态传感器,mpu6050获取平衡车的姿态将数据传送给主控制器。主控制器得到数据后通过互补滤波或者卡尔曼滤波进行数据

14、处理。然后经过PID算法处理,将处理后的数据反馈给电机驱动芯片TB6612,驱动芯片得到数据后,然后控制电机,电机转动时小车保持平衡。3.2 元器件选型3.2.1 微处理器STM32 是由意法半导体推出的一款基于 ARM Cortex - M 系列内核的高性能32 位单片机。目前有 STM32L0,STM32L1,STM32L4 等九个产品线。其中“STM32”表示基于 ARM核心的 32 位微控制器。时钟、复位和电源管理2.03.6 伏供电和 I/O 引脚上电/断电复位(POR/PDR)、可编程电压监测器(PVD) 416MHz 晶体振荡器。内嵌带校准的 40kHz的RC振荡器他有两个12

15、位的ADC通道数也可以达到16个,而且他的模数转换的范围也可以达到0-3.6V。7 通道 DMA 控制器。支持的外设有定时器、ADC、SPI、I2C和USART。该控制器有多达48个快速I/O 端口,所有 I/O 口可以映像到16个外部中断。3.2.2 陀螺仪与加速度计为了保证准确的控制小车稳定,我们就有必要准确的测量平衡小车倾斜角度和电机转速,其中电机转速在下面一章节会介绍,主要是通过编码器测量。本章节主要利用MPU6050来测量校车的倾斜角度。本控制测量系统采用了集成度相当高的6轴运动处理器,这样就避免了用多个传感器组合测量的方案,极大地减少了车身上的空间问题。而且避免了陀螺仪和加速度计在

16、方向上安装不能统一的问题。MPU6050中的陀螺仪和加速度计都是采用了3个ADC,其中ADC的精度可以达到16位。分辨率也是可以达到很高。在MPU6050采集到数据后,数据量是模拟量,模拟量被ADC转化为数字量,然后传送给内部DMP进行姿态解算。得到平衡小车的倾斜角度。MPU6050的也是有很多种张配置,配置接口采用了I2C接口,速率可以达到4000kHZ。因为角度侧量是有好很多种的周期,为了准确跟踪小车运动的快慢速。所以,陀螺仪的配置范围为有±250,±500,±1000,±2000°/秒(dps),加速度计的配置范围有±2,

17、77;4,±8,±16g。当然MPU6050测量精度越低,他的配置范围也就越大。MPU6050的加速度计的测量原理如下图。图3-3 加速度检测的基本原理在纵向方向上加两个点极,形成一个电容。当外部产生加速度后两个电极之间的距离会发生改变,电容也会相应的改变。电容的改变会导致电压变化。电压通过放大电路后再进行处理,然后被ADC转化为数字量。一套参数的传递就形成了加速度与电压数值的关系。 而陀螺仪则是克里利奥力的原理,在器件里面安装了一个能感知震动的单元。,当物体高速旋时,原件里面的震动单元的震动频率也会相应地改变,我们只要测出了物体的振动频率就可以很轻松的得知物体的旋转角速度

18、。将MPU6050安装在小车上时,可以测量出小车倾斜的角速度,将角速度信号进行积分便可得到角度,如下图所示。上面得到了小车的旋转角速度,但是需要的是小车的倾斜角度,所以必须会对角速度进行积分,得到角度。由于小车测量的是角速度。外界对他的干扰可以忽略不计。但是将角速度积分后,那些很小的干扰也会累加。从而使测量值与真实值存在较大的误差。如下图所示。图3-5 角度积分漂移所以这个过程会进行一些数据滤波处理。但是还是无法消除误差。拟采用加速度数据与陀螺仪数据融合的方式来处理这个问题。但是由于加速度计测量很灵敏,容易掺杂一下外部的高频率信号。但是他没有积分,也就没有积分误差。但是陀螺仪就不一样他受外部高

19、频噪声的影响很小。但是他有积分误差。因此可以使用互补滤波,将这两种传感器的优势互补。换句话说,互补滤波就是以陀螺仪测量的角度为准。然后定时用加速度及测量的角度为辅进行修正。3.2.3 电机驱动芯片本控制系统准备用东芝生产的一款驱动芯TB6612FNG,他正好可以同时驱动两个电机,非常满足本论文设计的需求。而且它的驱动电流也是相当的大。可以达到1.2A,峰值可达2A、2.3A。芯片原理结构如下图,AO1/AO2/BO1/BO2是两个电机的电源的供电口,AIN1/AIN2/BIN1/BIN2是控制两个电机正反转的管脚。而PWM1/PWM2就是接受的控制信号。单片机通过PID计算后得到PWM输出信号

20、。 芯片就是通过这两个管脚来接受单片机发过来的pwm信号,然后来控制电机的速度与正反转。图3-6 TB6612FNG芯片功能示意图3.2.4 编码器编码器是一种常用的用来检测步进电机的元器件,他的检测原理是当电机马达转动的时候会扫描到光电管器件,然后就会触发光电管器件发送出数字脉冲信号。数字脉冲信号输出到单片机的捕获接口就可捕获到脉冲信号的频率进而得知步进电机的速度。关于电机正转还是反转的问题,可以通过脉冲信号的相位来判断。如果脉冲信号相位超前半个周期就说明电机正转,相反,如果脉冲信号相位落后半个周期就说明电机反转。图3-7 光电编码器3.2.5 显示屏OLED是一种有机发光二极管,我们就是采

21、用这种显示屏来作为显示的。OLED也有很多的特点,比如说,制作简单,响应速度快,可以做到很薄,他可以自己发光,不需要背光源,对比度很高,色彩显示鲜艳,适应的温度范围广等等。总之OLED屏是下一代显示材料的趋势。 图3-8 OLED显示器本论文采用的OLED显示器为0.96寸,他的长宽比例为27mm*26mm。但是他的分辨率却可以达到128*64。模块的去东街口主要有两种,串行SPI接口和IIC接口。串行接口的速率要比IIC的借口要稍微快一点,但是这种接口需要4根管脚来驱动,相比IIC两根接口的驱动方式要脸肥一些资源。在两种接口都可以满足需求的情况下我们选择IIC接口。只要用2根线就可以驱动。4

22、 系统软件设计 4.1 模块初始化IIC初始化:IIC初始化用于配置MPU6050,由于MPU6050的配置采用的是IIC接口,所以这个初始化是必要的,另外IIC还用于驱动OLED显示屏。 下面列出重要的函数名(具体函数体见附录)初始化IIC对应的引脚void IIC_Init(void)产生IIC起始信号int IIC_Start(void)产生IIC停止信号void IIC_Stop(void)等待应答信号int IIC_Wait_Ack(void)产生ACK应答void IIC_Ack(void)产生NACK应答void IIC_NAck(void)IIC写一个字节void IIC_Se

23、nd_Byte(u8 txd)IIC读取一个字节u8 IIC_Read_Byte(unsigned char ack)IIC写字符串int i2cWrite(uint8_t addr, uint8_t reg, uint8_t len, uint8_t *data)IIC读字符串int i2cRead(uint8_t addr, uint8_t reg, uint8_t len, uint8_t *buf)串口初始化:串口初始化用于打印调试信息,方便我们调试程序。初始化串口引脚,串口时钟和波特率void uart_init(u32 pclk2,u32 bound)配置串口中断函数void US

24、ART2_IRQHandler(void)中断定时器初始化:用于产生50ms的中断周期,来进行一次PID算法运算。初始化中断定时器void EXTI_Init()PWM初始化:用于输出PWM值,电机驱动通过改值的大小来直接控制电机的速度与方向。初始化PWM分频器和自动重装值void MiniBalance_PWM_Init(u16 arr,u16 psc)配置电机输出引脚void MiniBalance_Motor_Init(void)设置PWM值,改变电机速度void Set_Pwm(int moto1,int moto2)设置电机方向int myabs(int a)编码器初始化:用于测量电

25、机的实时转速初始化左右编码器void Encoder_Init_TIM2(void)void Encoder_Init_TIM3(void)获取电机的速度int Read_Encoder(u8 TIMX)MPU6050初始化:初始化MPU6050,测量小车的实时状态和倾斜角度读取MPU6050内置温度传感器数据int Read_Temperature(void)读取MPU6050内置DMP姿态信息void Read_DMP(void)初始化MPU6050内置DMPvoid DMP_Init(void)初始化MPU6050以进入可用状态void MPU6050_initialize(void)设

26、置MPU6050是否为AUX IIC线的主机void MPU6050_setI2CBypassEnabled(void)检测MPU6050是否已连接uint8_t MPU6050_testConnection(void)读取MPU6050 WHO_AM_I 标识uint8_t MPU6050_getDeviceID(void)设置MPU6050是否进入睡眠状态void MPU6050_setSleepEnabled(uint8_t enabled)设置MPU6050加速度计的最大量程void MPU6050_setFullScaleAccelRange(uint8_t range)设置MPU6

27、050的时钟源void MPU6050_setClockSource(uint8_t source)将新的ADC数据更新到FIFO数组,进行滤波处理void MPU6050_newValues(int16_t ax,int16_t ay,int16_t az,int16_t gx,int16_t gy,int16_t gz)Flash初始化:用于保存PID数据解锁Flashvoid STMFLASH_Unlock(void)上锁Flashvoid STMFLASH_Lock(void)得到Flash状态u8 STMFLASH_GetStatus(void)等待Flash操作完成u8 STMFL

28、ASH_WaitDone(u16 time)擦除Flash页u8 STMFLASH_ErasePage(u32 paddr)从Flash指定的地址写入半字u8 STMFLASH_WriteHalfWord(u32 faddr, u16 dat)从Flash指定的地址读出半字u16 STMFLASH_ReadHalfWord(u32 faddr)不检查Flash写入数据void STMFLASH_Write_NoCheck(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite) 从Flash指定的地址写入指定长度的数据void STMFLASH_Write(u32

29、WriteAddr,u16 *pBuffer,u16 NumToWrite)从Flash指定的地址读出指定长度的数据void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead) Flash测试void Test_Write(u32 WriteAddr,u16 WriteData) Flash读void Flash_Read(void)Flash写void Flash_Write(void)4.2 PID算法设计PID控制公式如下。(4-2) ut=Kpet+1T10tetdt+TDdetdt实际使用中,PID算法不必使用所有控制(比例控

30、制、积分控制、微分控制),只要能满足使用要求即可。常见的有PD控制和PI控制。在本控制系统中,速度控制使用了PI控制,角度控制使用了PD控制。相应控制控制如下:速度控制输出=车速*Kp+路程*Ki角度控制输出=倾角*Kp+角速度*Kd其中,Kp为比例系数,Kd为微分系数,Ki为阻尼系数。在完成速度控制与角度控制之后,需要将获得的数据进行叠加,并且加入蓝牙方向控制,以完成小车的左右转。最后对所得数据进行判断与转换,以数据的正负控制电机的转向,以数据的数值控制占空比,调节PWM输出来控制转速,完成左右电机的差分控制。由于小车轮胎与地面存在静摩擦力,因此当占空比很小时,电机驱动电流很小,电机可以认为

31、没有发生转动。所有需要根据实际情况加上死区常量用来克服这种情况下的静摩擦力。输出控制算法程序框图如下所示。(b)(a)int EXTI3_IRQHandler(void) if(PBin(3)=0) EXTI->PR=1<<3; /判断是否由外部中断 Encoder_Left=Read_Encoder(2); /获取电机转速 Encoder_Right=Read_Encoder(3);/获取电机转速 Get_Angle(Way_Angle); /获得当前角度 Balance_Pwm =balance(Angle_Balance,Gyro_Balance); /PID控制计算

32、Velocity_Pwm=velocity(Encoder_Left,Encoder_Right);/ Moto1=Balance_Pwm+Velocity_Pwm; /输出pwm值 Moto2=Balance_Pwm+Velocity_Pwm; /输出pwm值 Xianfu_Pwm(); /限制幅度 Set_Pwm(Moto1,Moto2);/控制电机 return 0; 4.3总体软件架构int main(void) Stm32_Clock_Init(9); JTAG_Set(JTAG_SWD_DISABLE); JTAG_Set(SWD_ENABLE); delay_init(72);

33、KEY_Init(); OLED_Init(); Flash_Init();uart_init(72,115200); IIC_Init(); MPU6050_Init(); Flash_Read();EXTI_Init(); Display_All();While(1);由于整个平衡车的处理复杂度不算特别高,所以整个软件系统的设计没有采用才做系统的架构模式,而是采用了相对简单且容易实现的前后台架构。从上到下,首先完成的是对系统的时钟初始化。这一点是非常必要的,应为单片机可以工作在多种频率下,应为我们有大量的数据处理计算,所以要配置到单片机的最高频率。也就是72兆赫兹。这里我没当然也不会考虑到

34、功率问题。这种频率完全有能力处理起来整个平衡车的任务。其次是关闭单片机的JTAG调试口,应为JTAG调试口占用的管脚较多,而且好需要专门的JTAG调试器来辅助工作,而这种调试器非常的昂贵,有的达到几千元。因此我们将调试接口配置为SWD模式,而SWD模式下的调试器只要几十元就可以买的到,并且它所占用的管脚资源也是比JTAG要少得多。接下来我们是初始化delay函数,在很多场合延时对我们来说用的很频繁。我们事先就写了一个精准的延时函数,包括纳秒级,微妙级和秒级三种。这就可以满足我们大部分的需求了。后面是对按键的初始化,它的作用是在调试阶段调参数时,不只有一个参数要调。我们可以用按键的形式来选择去改

35、变哪一个参数,这样一来我们就不必每次都改写整个函数去调整参数了。后面是OLED的初始化,在调试阶段,OLED是用来作为辅助调试手段的。他可以记录电机转速,PWM输出,PID参数和平衡小车的倾斜角度。在调试完成后还可以作为辅助显示手段。Flash_Init()是初始化单片机的内部存储芯片,用于保存PID的参数值。后面是串口初始化,用来打印调试信息。IIC的初始化用来配置MPU6050,以及驱动显示屏。后面是MPU6050的初始化,用来初始化陀螺仪。 然后是读取flash中保存的参数,主要是上次保存的PID参数,模式参数以及一些其他的参数。下面是中断的初始化,这个初始化非常重要,我么把他设置到50

36、ms,当50毫秒时间到达后,进入中断函数,获取电机转速,小车倾斜角度和小车方向。然后进行PID计算输出到电机,让电机以特定的速度运转,保持小车平衡。最后是显示所有信息到OLED屏幕,和一个死循环。我们在设计时死循环中什么任务也没有做,其实中里面可以添加一些其他的功能函数,比如要坐上位机通讯时的功能可以放到这里面。这是就形成了所谓的前后台系统了。 图4-3控制流程 4.4调试技巧平衡车的调试还是有很多技巧的,首先我们能想到的就是最常用的串口调试,这种调试只能应用在硬件初始化的过程。比如,陀螺仪的初始化,显示屏的初始化等等,一旦到了PID参数整定的调试工作,这种调试方法就不奏效了。应为我问要在实物

37、上调试,并且小车还会在调试过程中运动。用串口调试就显得有些力不从心了。因此我们采取了另外一种调试方法。OLED显示屏加上编码器和单片机内部flash结合起来调试。下面我们来具体介绍。首先我们知道平衡车上有一个编码器,我们在频繁该PID参数时可以转动编码器,然后设置对应的PID参数显示到显示屏上面,顺时针转就加参数值,逆时针转就减参数值。然后保存芯片内部flash存储芯片。这样我们下次重启平衡车时就可以直接读取上次我们设置的PID参数,而不用每次到改完参数后要重新烧写程序到单片机了。这样就让我们调参数的过程变得轻松许多。5 总结与展望5.1 总结本设计系统的硬件系统以ARM公司的STM32为控制

38、核心,使用MPU6050检测小车的车身姿态,通过编码器获取小车当前转速,实现对车速的闭环控制。通过TB6612FNG驱动电路对两个电机实现差分控制,进而单独的控制两个电机。通过蓝牙扩展获得上位机发送的控制信号,也可以实现人机交互的功能。软件系统设计中,根据单片机使用手册设置各个寄存器;根据IIC总线协议编写通信程序,并且根据芯片说明配置MPU6050芯片。使用互补滤波融合加速度计与陀螺仪数据并实现角度控制。使用PID算法计算角度控制与速度控制的最终输出量。使得小车在保持平衡的同时通过蓝牙可实现人机交互。5.2 展望 由于时间仓促,能力又有限,该设计还有许多需要改进的地方。1. 采用更先进、速度

39、更快的控制器,如ARM,X86等。2. 使用更先进的数据融合算法,如卡尔曼滤波算法。3. 使用更先进的控制算法,如模糊控制,神经网络等。4. 调试手段有待进一步优化。5. 可以对平衡车添加一些人机互动功能。比如,添加一个语音助手,能够通过语音对平衡车进行控制,让小车完成像左转弯右转弯自旋转等指定的动作。还可以连接蓝牙或者wifi用手机对小车进行控制。参考文献1肖洪兵. 跟我学用单片机. 北京:北京航空航天大学出版社,2002.8 。2何立民. 单片机高级教程 第1版北京:北京航空航天大学出版社,2001。 3赵晓安. MCS-51单片机原理及应用. 天津:天津大学出版社,2001.3。 4李广

40、第 单片机基础 第1版北京:北京航空航天大学出版社,1999。 5徐惠民.安德宁 单片微型计算机原理接口与应用 第1版 北京:北京邮电大学出版社,1996。 6何立民从Cygnal 80C51F看8位单片机发展之路 单片机与嵌入式系统应用,2002年,第5期。 7夏继强. 单片机实验与实践教程. 北京:北京航空航天大学出版社, 2001。 8陈志强 胡辉. 单片机应用系统设计实践指南. 自编教材。 9肖洪兵. 单片机应用技术. 自编教材。10肖洪兵 高茂科. CAI课件 自主开发。11V.Yu.Teplov,A.V.Anisimov.ThermostattingSystem Using a S

41、ingle-Chip Microcomputer and 12Thermoelectric Modules Based on the Peltier EffectJ ,2002 。13Yeager Brent.How to troubleshoot your electronic scaleJ.Powder and Bulk Engineering.1995。 14Meehan Joanne,Muir Lindsey.SCM in Merseyside SMEs:Benefits and barriersJ.TQM Journal.2008。 附录1.系统设计的电

42、路框图2.部分源代码#include "sys.h"u8 Way_Angle=1; /获取角度的算法,1:四元数 u8 Flag_Show=1; /停止标志位和 显示标志位 默认停止 显示打开int Encoder_Left,Encoder_Right; /左右编码器的脉冲计数int Moto1,Moto2; /电机PWM变量 应是Motor的 float Angle_Balance,Gyro_Balance,Gyro_Turn; /平衡倾角 平衡陀螺仪 转向陀螺仪u32 Distance; /超声波测距u8 delay_50,delay_flag,Bi_zhang=0,P

43、ID_Send,Flash_Send; /默认情况下float Acceleration_Z; /Z轴加速度计 float PA=100,PB=500,PC=888,PD=6813; /PID参数u16 PID_Parameter10,Flash_Parameter10; /Flash相关数组 int Balance_Pwm,Velocity_Pwm,Turn_Pwm;float kp=0,kd=0;float Kp_v=0,Ki_v=0,Kd_v=0;float my_Encoder_Integral;float my_v_kp1;float my_v_kp2;int balance_pwm

44、;u8 key1=0;char Encoder_num;float offset;int my_pwm;void ofset(void);int main(void) Stm32_Clock_Init(9); delay_init(72); JTAG_Set(JTAG_SWD_DISABLE); JTAG_Set(SWD_ENABLE); KEY_Init(); OLED_Init(); OLED_ShowString(0,0,"Key :");OLED_ShowString(66,0,"Angle:"); OLED_ShowString(0,1,&qu

45、ot;KP_b: 1");OLED_ShowString(0,2,"KD_b: 2");OLED_ShowString(0,3,"KP_v: 3");OLED_ShowString(0,4,"KI_v: 4");OLED_ShowString(0,5,"KD_v: 5");OLED_ShowString(0,7,"Pwm : ");OLED_ShowString(0,6,"Moto:"); uart_init(72,115200); uart2_init(36,96

46、00); MiniBalance_PWM_Init(7199,0); /TIM4 通道3 4 PB8 9 Encoder_Init_TIM2(); /PA0 1 Encoder_Init_TIM3(); /PA6 7 IIC_Init(); /=模拟IIC初始化 MPU6050_initialize(); /=MPU6050初始化 DMP_Init(); /=初始化DMP Flash_Read();OLED_Num_String(35,1,kp);OLED_Num_String(35,2,kd*10);OLED_Num_String(35,3,Kp_v);OLED_Num_String(35,

47、4,Ki_v*10);OLED_Num_String(35,5,Kd_v*10);#if 1 ofset();OLED_Num_String(35,1,kp);OLED_Num_String(35,2,kd*10);OLED_Num_String(35,3,Kp_v);OLED_Num_String(35,4,Ki_v*10);OLED_Num_String(35,5,Kd_v*10); #endif EXTI_Init(); /=MPU6050 5ms定时中断初始化 while(1) #if 1 OLED_Num_String(35,6,Encoder_Left); OLED_Num_String(70,6,Encoder_Right); OLED_Num_String1(35,7,my_pwm); OLED_Num_String1(90,7,(int)my_Encoder_Integral);/积分 OLED_Num_String1(70,1,(int)my_v_kp1);/比例 OLED_Num_String1(70,2,(int)my_v_kp2);/微分 OLED_Num_String(96,0,Angle_Balance); #endifvoi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论