电动车跷跷板论文_第1页
电动车跷跷板论文_第2页
电动车跷跷板论文_第3页
电动车跷跷板论文_第4页
电动车跷跷板论文_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

1、2015年全国大学生电子设计竞赛电动车跷跷板(F题)【本科组】2015年7月25日摘 要本方案以STM32F103RB单片机、直流电机驱动电路、MPU-6050、反射式红外传感器、稳压模块等电路构成。小车采用前方的左中右三个反射式红外传感器,能沿着黑线在跷跷板上往返行驶,并始终保持在跷跷板上;同时,利用MPU-6050对小车当前所在位置的倾斜角进行测量。小车控制程序主要对采集信号分析转换,结合PWM调速控制电机转速和转向,从而使小车快速在跷跷板上取得平衡;小车通过蜂鸣器来实现平衡指示以及实时显示,从而完成整个设计过程。实验结果验证了该系统的性能满足设计要求。关键词:STM32F103RB MP

2、U-6050 反射式红外传感器 PWM调速 AbstractThe programs to STM32F103RB microcontroller, DC motor drive circuit, MPU-6050, reflective infrared sensor, voltage regulator modules and other circuits. Car used left, right in front of three reflective infrared sensor that can travel back and forth along the black line

3、 on a seesaw, and keep the seesaw; Meanwhile, MPU-6050 tilt angle of the trolley current location is measured. Car control program focuses on the acquisition signal analysis conversion, combined with PWM speed control motor speed and direction, allowing the car to quickly strike a balance on a seesa

4、w; trolley buzzer to achieve balance through instructions and real-time display, thus completing the entire design process. Experimental results demonstrate the performance to meet the design requirements of the system.Key word: STM32F103RB MPU-6050 PWM Speed Reflective infrared sensor目 录1系统方案11.1 姿

5、态检测模块的论证与选择11.2 电机驱动模块的论证与选择11.3 稳压模块的论证与选择11.4 测量模块的论证与选择22系统理论分析与计算32.1 PID控制器设计32.2 基于卡尔曼滤波的数据融合33电路与程序设计43.1电路的设计43.1.1电路系统总体框图43.1.2 电源系统电路43.1.3 电机驱动模块电路原理图43.2程序的设计53.2.1程序流程图54测试方案与测试结果84.1测试方案84.2 测试条件与仪器84.3 测试结果及分析84.3.1测试结果(数据)84.3.2测试分析与结论95总结9附录101.电路原理图10 2.元器件清单12 3.主要源程序131系统方案本系统主要

6、由姿态检测模块、电机驱动模块、测量模块、稳压模块、电源模块组成。下面分别论证各个模块的选择。1.1 姿态检测模块的论证与选择方案一:ENC-03。这是一款利用科里奥利力原理输出一个与角速度成正比的模拟电压信号的角速度传感器。方案二:MPU-6050。MPU-60X0 是全球首例9轴运动处理传感器。它集成了3轴MEMS陀螺仪,3轴MEMS加速度计,以及一个可扩展的数字运动处理器DMP(Digital Motion Processor),可用I2C接口连接一个第三方的数字传感器,比如磁力计。扩展之后就可以通过其I2C或SPI接口输出一个9轴的信号(SPI 接口仅在MPU-6000可用)。MPU-6

7、0X0也可以通过其I2C接口连接非惯性的数字传感器,比如压力传感器。方案一所用模块功能较单一,只是单独的陀螺仪。方案二所用模块功能较多,不仅有陀螺仪功能,且有加速度计的功能。且方案一所用模块较为精密,容易损坏,故选用方案二。1.2 电机驱动模块的论证与选择方案一:TB6612FNG。TB6612FNG是一款新型直流电机驱动器,它具有集成度高、驱动能力强以及控制方式灵活等特点。方案二:L298N。具有信号指示,转数可调,抗干扰能力强,具有过电压和过电流保护,可单独控制两台直流电机,可单独控制一台步进电机。方案三:ULN2003,ULN2003 是高耐压、大电流复合晶体管阵列,由七个硅NPN 复合

8、晶体管组成。最高接5V电压。方案一所用电机体积小,重量小。本实验要求小车自重不能过轻。切方案一所用电机体内电子元件较为精密,易损坏,故不用方案一。方案三所用电机电压范围太小,本实验要求电压要稳定在较高值,故不选用方案三。所以选择方案二。1.3 稳压模块的论证与选择方案一:LM2596。LM2596系列是德州仪器(TI)生产的3A电流输出降压开关型集成稳压芯片,它内含固定频率振荡器(150KHZ)和基准稳压器(1.23v),并具有完善的保护电路、电流限制、热关断电路等。利用该器件只需极少的外围器件便可构成高效稳压电路。方案二:LM2576系列是美国国家半导体公司生产的3A电流输出降压开关型集成稳

9、压电路,它内含固定频率振荡器(52kHz)和基准稳压器(1.23V),并具 有完善的保护电路,包括电流限制及热关断电路等,利用该器件只需极少的外围器件便可构成高效稳压电路。方案一所用稳压模块开关频率高,效率更高。方案二所用稳压模块太过昂贵,性价比比方案一所用稳压模块低。所以选用方案一。1.4 测量模块的论证与选择方案一:用光敏电阻组成光敏探测器。光敏电阻的阻值可以跟随周围环境光线的变化而变化。当光线照射到跷跷板上面时,光线发射强烈,光线照射到黑线上面时,光线发射较弱。因此光敏电阻在跷跷板和黑线上方时,阻值会发生明显的变化。将阻值的变化值经过比较器就可以输出高低电平。但是这种方案受光照影响很大,

10、并且不能够稳定的工作。因此我们考虑其他更加稳定的方案。方案二:用红外光电对管寻迹传感器。现有的封装好的红外对管应用电路简单,工作稳定,再加上控制芯片的电压比器功能模块处理采集信号,容易实现题目要求。方案一受光照影响很大,并且不能够稳定的工作,本实验要求测量模块能稳定工作,故不选用方案一。方案二容易实现题目要求。因此本系统选择方案二。在平衡系统中,根据要求,只要跷跷板两端与地面的距离差小于40mm即可认为平衡,本设计通过倾角传感器检测跷跷板水平倾角,所以只要水平倾角保持在0°附近的某个角度范围之内即认为跷跷板达到平衡状态。其闭环结构框图如图所示。该系统的工作原理是:小车驶上跷跷板后,通

11、过倾角传感器不断测量跷跷板的倾角(即实际倾角),该实际倾角与给定倾角作比较,形成倾角偏差,通过直流电机控制小车前后微移,不断修正该倾角偏差,最终使倾角保持在给定范围之内,此时跷跷板便达到平衡状态。2系统理论分析与计算2.1 PID控制器设计PID控制器由比例单元(P)、积分单元(I)和微分单元(D)组成。其输入e (t)与输出u (t)的关系为: 其中为比例系数;为积分时间常数;为微分时间常数。PID控制器具有原理简单、使用方便、适应性强、鲁棒性强、对模型依赖少等特点,因此使用PID控制器实现两轮自平衡车的控制是完全可行的。2.2 基于卡尔曼滤波的数据融合 卡尔曼滤波器解决离散时间控制过程的一

12、般方法,首先定义模型线性随机微分方程。假设卡尔曼滤波模型k时刻真实状态是从(k-1)时刻推算出来,如下式 式中,是k时刻状态;A是k-1时刻状态变换模型;B是作用在控制器向量上的输入控制模型;是过程噪声,假设其均值为零,协方差矩阵符合多元正态分布: k时刻对应真实状态的测量满足下式: 式2-17中是观测模型,将真实控制映射为观测空间;为观测噪声,其均值为零,协方差矩阵符合正态分布:初始状态以及每一时刻的噪声都认为是互相独立的。卡尔曼滤波器的操作主要包括两个阶段:预估与更新。在预估阶段,滤波器根据上一时刻状态,估算出当前时刻状态;在更新阶段,滤波器利用当前时刻观测值优化在预估阶段获得的测量值,以

13、获得一个更准确的新估计值111213。3电路与程序设计3.1电路的设计3.1.1电路系统总体框图3.1.2 电源系统电路3.1.3 电机驱动模块电路原理图3.2程序的设计3.2.1程序流程图1、主程序流程图 当小车复位时,开始运行主程序流程。开始 - 调用平衡子程序 - 进入判断 - 是(否) -调用平衡指示子程序(回到上一步) - 延时 - 电机运行向前 - 调用测量子程序 - 进入判断 - 是(否) - 延时(回到上两步) - 电机运行向后 - 结束2、平衡子程序流程图开始 - 平衡测量模块检测 - 进入判断 - 是(否) - 调用电机驱动 - 电机正转(电机反转) - 进入判断 - 是(

14、否) - 结束(回到第一步)3、平衡指示子程序流程图开始 - 平衡测量模块检测 - 进入判断 - 是(否) - 调用计数器(回到上一步) - 进入判断 - 是(否) - 调用蜂鸣器(回到第一步) - 结束4、测量子程序流程图开始 - 三组光线测量模块检测 - 进入判断 - 是(否) - 调用电机驱动(回到上一步) - 电机运行通过控制转速调整方向 - 进入判断 - 是(否) - 结束(回到第一步)4测试方案与测试结果4.1测试方案1.硬件测试 检测跷跷板的尺寸; 检测跷跷板的可用性; 检测小车线路连接状态;2. 运行测试 检测小车在跷跷板上面的运行情况; 检测小车对题目各项要求的完成度。4.2

15、 测试条件与仪器测试条件:检查多次,硬件电路必须与系统原理图完全相同,并且检查无误,硬件电路保证无虚接。 小车要能完成题目要求。测试仪器: 测试跷跷板:卷尺。 测试小车:跷跷板(需检测合格),秒表。4.3 测试结果及分析4.3.1测试结果(数据)硬件:检查多次,硬件电路与系统原理图完全相同,硬件电路无虚接以下为硬件检测数据:跷跷板总体长度:1600mm;跷跷板总体宽度:300mm;跷跷板中心轴部分高度:83mm;小车整体宽度:200mm;小车整体长度:300mm;运行:不加配重情况下表1:从A点到C点的时间测试测试项目第1次第2次第3次第4次AC所用时间/s1512129表2:平衡点测试测试项

16、目第1次第2次第3次第4次寻找平衡点时间/s30402420d=dA-dB/mm30.520.522.814.7表3:平衡点到B的时间测试测试项目第1次第2次第3次第4次平衡点B所用时间/s4323车头到B点的距离/mm35203431表4:平衡点倒退回A点的时间测试测试项目第1次第2次第3次第4次B点停止时间/s5555BA所用时间/s2326257根据测量,完成全过程的总时间均小于180秒。4.3.2测试分析与结论根据上述测试数据,小车及跷跷板尺寸合格,小车达成目标时间均小于题目要求时间,由此可以得出以下结论:1、小车及跷跷板硬件条件符合题目要求。2、小车内部程序无问题,小车能够正常运行。

17、3、小车能完成题目各项要求,且有自主发挥空间。综上所述,本设计达到设计要求。五、总结在本次课题训练中,我们基本完成了题目各项要求。从本次设计中我们体会到,对小车实施控制不仅是电子控制问题,其中也涉及到了力学和光学等方面的知识。在有限的时间里未能完美的解决小车寻找平衡点的的问题。在对直流电机的调速和精确控制上还不是很灵活,在以后的训练中应该多加学习和锻炼。22附录1.电路原理图单片机最小系统及时钟电路原理图MPU6050电路图复位及按键接口电路2.元器件清单 电 动 小 车序号名称、型号、规格数量1STM32F103RB单片机12直流电机43MPU-605014电机驱动L298N25红外传感器3

18、6稳压模块LM259627电源(航模电池)18小车框架(高160mm,长300mm,宽200mm)110辅助连接板1 跷 跷 板序号名称、型号、规格数量11600mm * 300mm * 14mm木板12135mm * 25mm * 45mm木支架23转轴(50mm螺钉)2465mm * 25mm * 45mm 转轴固定架25310mm * 25mm * 45mm木轴承16黑胶布若干7引导装置(硬纸板,硬木板)18连接用螺钉若干9配重若干3.源程序/* Includes -*/#include "stm32f10x.h"#include "delay.h"

19、;#include "sys.h"#include "inv_mpu_dmp_motion_driver.h"#include "inv_mpu.h"#include "math.h"#include "usart.h"#include "STM32_I2C.h"#include <stdio.h>#include <pwm.h>#include <pid.h>#include <tim.h> #define PRINT_ACC

20、EL (0x01)#define PRINT_GYRO (0x02)#define PRINT_QUAT (0x04)#define ACCEL_ON (0x01)#define GYRO_ON (0x02)#define MOTION (0)#define NO_MOTION (1)/* Starting sampling rate. */#define DEFAULT_MPU_HZ (100)#define FLASH_SIZE (512)#define FLASH_MEM_START (void*)0x1800)uint32_t TimingDelay = 0;extern int k;

21、extern volatile u32 time; uint16_t a1,a2,b1,b2;extern float Kp;extern float Ki;extern float Kd;int s1=0;int s2=0;int s3=0;int s4=0;int num=0;int qq=0;int xj=0;extern float output;extern float SetSpeed;uint8_t USART_RXBUF10;extern uint8_t RXOVER;void Delay(_IO uint32_t nCount);void Clock_Enable(void)

22、;void GPIO_Configuration(void);void check(void);void turn(void);void bee(void);void Delay_Ms(uint32_t nTime) TimingDelay = nTime; while(TimingDelay != 0);struct rx_s unsigned char header3; unsigned char cmd;struct hal_s unsigned char sensors; unsigned char dmp_on; unsigned char wait_for_tap; volatil

23、e unsigned char new_gyro; unsigned short report; unsigned short dmp_features; unsigned char motion_int_mode; struct rx_s rx;static struct hal_s hal = 0;volatile unsigned char rx_new;float Roll,Yaw;float Pitch;static signed char gyro_orientation9 = -1, 0, 0, 0,-1, 0, 0, 0, 1;enum packet_type_e PACKET

24、_TYPE_ACCEL,PACKET_TYPE_GYRO,PACKET_TYPE_QUAT,PACKET_TYPE_TAP,PACKET_TYPE_ANDROID_ORIENT,PACKET_TYPE_PEDO,PACKET_TYPE_MISC ;static unsigned short inv_row_2_scale(const signed char *row) unsigned short b; if (row0 > 0) b = 0; else if (row0 < 0) b = 4; else if (row1 > 0) b = 1; else if (row1

25、< 0) b = 5; else if (row2 > 0) b = 2; else if (row2 < 0) b = 6; else b = 7; / error return b;static unsigned short inv_orientation_matrix_to_scalar( const signed char *mtx) unsigned short scalar; scalar = inv_row_2_scale(mtx); scalar |= inv_row_2_scale(mtx + 3) << 3; scalar |= inv_row

26、_2_scale(mtx + 6) << 6; return scalar;static void run_self_test(void) int result;/ char test_packet4 = 0; long gyro3, accel3; result = mpu_run_self_test(gyro, accel); if (result = 0x7) /* Test passed. We can trust the gyro data here, so let's push it down * to the DMP. */ float sens; unsig

27、ned short accel_sens; mpu_get_gyro_sens(&sens); gyro0 = (long)(gyro0 * sens); gyro1 = (long)(gyro1 * sens); gyro2 = (long)(gyro2 * sens); dmp_set_gyro_bias(gyro); mpu_get_accel_sens(&accel_sens); accel0 *= accel_sens; accel1 *= accel_sens; accel2 *= accel_sens; dmp_set_accel_bias(accel);prin

28、tf("setting bias succesfully .n"); elseprintf("bias has not been modified .n");#define q30 1073741824.0ffloat q0=1.0f,q1=0.0f,q2=0.0f,q3=0.0f;void Read_MPU_Data(void)unsigned long sensor_timestamp; short gyro3, accel3, sensors; unsigned char more; long quat4; /float Yaw,Roll,Pitc

29、h; dmp_read_fifo(gyro, accel, quat, &sensor_timestamp, &sensors, &more); if (sensors & INV_WXYZ_QUAT ) q0=quat0 / q30; q1=quat1 / q30; q2=quat2 / q30; q3=quat3 / q30; Pitch = asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3; Roll = atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)

30、* 57.3; / roll Yaw = atan2(2*(q1*q2 + q0*q3),q0*q0+q1*q1-q2*q2-q3*q3) * 57.3; if(sensors & INV_XYZ_GYRO) if(sensors & INV_XYZ_ACCEL) void gpio_config(void) GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_P

31、in_1|GPIO_Pin_2;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOC, &GPIO_InitStructure);void BEE(void)GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);GPIO_PinRemapConfig(GPIO_Remap_SWJ_

32、NoJTRST,ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStruc

33、ture);void be(void)int i;GPIO_ResetBits(GPIOB,GPIO_Pin_4); for(i=0x010000; i>0; i-);GPIO_SetBits(GPIOB,GPIO_Pin_4); void turn(void)if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0)=1) TIM_Config1(0,0);/左转 TIM_Config2(0,800);else if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1)=1) TIM_Config1(0,800);/右转 TIM_Co

34、nfig2(0,0);void check(void)if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2)=1) while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2)=1); Delay(4000000);num=num+1; if(num=1)/踩黑线平衡 SetSpeed=1.8; else if(num=2)SetSpeed=8;else if(num=3)/踩黑线后退SetSpeed=-8;else if(num=5)while(1) TIM_Config1(0,0);TIM_Config2(0,0); int ma

35、in(void)int result,i; Clock_Enable(); GPIO_Configuration(); USART_Config(); i2cInit();PWM_IO_Config();TIM4_NVIC_Configuration(); TIM4_Configuration();BEE();gpio_config(); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4 , ENABLE); result = mpu_init(); if(!result) /mpu_init(); printf("mpu initializati

36、on complete.n "); /mpu_set_sensor if(!mpu_set_sensors(INV_XYZ_GYRO | INV_XYZ_ACCEL) printf("mpu_set_sensor complete .n"); else printf("mpu_set_sensor come across error .n"); /mpu_configure_fifo if(!mpu_configure_fifo(INV_XYZ_GYRO | INV_XYZ_ACCEL) printf("mpu_configure_f

37、ifo complete .n"); else printf("mpu_configure_fifo come across error .n"); /mpu_set_sample_rate if(!mpu_set_sample_rate(DEFAULT_MPU_HZ) printf("mpu_set_sample_rate complete .n"); else printf("mpu_set_sample_rate error .n"); /dmp_load_motion_driver_firmvare if(!dmp_

38、load_motion_driver_firmware() printf("dmp_load_motion_driver_firmware complete .n"); else printf("dmp_load_motion_driver_firmware come across error .n"); /dmp_set_orientation if(!dmp_set_orientation(inv_orientation_matrix_to_scalar(gyro_orientation) printf("dmp_set_orientati

39、on complete .n"); else printf("dmp_set_orientation come across error .n"); /dmp_enable_feature if(!dmp_enable_feature(DMP_FEATURE_6X_LP_QUAT | DMP_FEATURE_TAP | DMP_FEATURE_ANDROID_ORIENT | DMP_FEATURE_SEND_RAW_ACCEL | DMP_FEATURE_SEND_CAL_GYRO | DMP_FEATURE_GYRO_CAL) printf("dmp

40、_enable_feature complete .n"); else printf("dmp_enable_feature come across error .n"); /dmp_set_fifo_rate if(!dmp_set_fifo_rate(DEFAULT_MPU_HZ) printf("dmp_set_fifo_rate complete .n"); else printf("dmp_set_fifo_rate come across error .n"); run_self_test(); if(!mpu_

41、set_dmp_state(1) printf("mpu_set_dmp_state complete .n"); else printf("mpu_set_dmp_state come across error .n"); GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1| GPIO_Pin_6| GPIO_Pin_7);GPIO_ResetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2); while(1) if(RXOVER = 1)for(i=0;i<20;i+)USART_RXBUFi = 0; /清空接收区RXOVER = 0;USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);turn();check();if(k=1)k=0;if(time=1)Read_MPU_Data();if(time>=5)time=0;PID_realize(); if(ou

温馨提示

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

评论

0/150

提交评论