两轮自平衡小车研究毕业设计论文(编辑修改稿)内容摘要:

128 单片机最小系统如图 32 所示。 图 32 XS128单片机最小系统 该单片机是飞思卡尔公司的 16 位 HCS12 系列单片机,是 HCS12 系列的增强型产品,基于 S12 的 CPU 内核,可达到 25MHz 的 HCS12 的 2— 5 倍性能, S12X 系列增加了 172 条额外指令,可以执行 32 位计算,总线频率最高可以达到 40MHz,改进了中断处理能力, S12X 系列的 CPU 采用复杂指令 CISC 架构,集成了中断控制器,有丰富的寻址 方式,中断有 7 个优先级并且内核支持优先级的调度,最多可有 117 个中断源, S12X可访问最多 8M 的全部存储空间。 陀螺仪和加速度计传感器电路 ( 1)陀螺仪电路 本设计采用的是单轴 ENC03MB 日本村陀螺仪传感器模块,它是一种运用科氏原理的角速度传感器,它输出一个和角速度成正比的模拟电压信号。 它有着特别小的体积和重量,能快速的响应,低的驱动电压和功耗等特点。 陀螺仪接口电路如图 33 所示 成都学院学士学位论文(设计) 12 图 33 陀螺仪接口电路 ( 2)加速度计传感器电路 本设计采用的是 MMA7361LC 三轴加速度倾角传感器模块 ,这个加速度计传感器有着很低的功率,具有信号调节,极低通滤波器,温度补偿,自我测试, 0g 检测,检测到直线下落和 g 选择 选择 2 敏感性之间,零重力下抵消和灵敏度是工厂设置,不需要外部设备,其还包括睡眠模式,使它非常适合手机电池动力电子。 MMA7361LC 三轴加速度倾角传感器接口电路如图 34 所示。 图 34 MMA7361LC三轴加速度倾角传感器接口电路图 电机驱动电路 电机采用 BTS7960 芯片,其应用非常简单,只需要向芯片第 2 引脚输入 PWM 波就能控制。 当系统中只需要单向控制时,只需要让电机一 端接地,另一端接 BTS7960第 4 引脚。 如果需要电机双向旋转控制,则需要另一片 BTS7960 共同组成全桥。 由于小车使用双电机,所以我们要使用 4 片 BTS7960 芯片构成两个全桥分别控制两个电机。 电机驱动电路图如图 35 所示,电机驱动电路实物图如图 36 所示。 图 35 电机驱动电路图 成都学院学士学位论文(设计) 13 图 36 电机驱动电路实物图 电源模块电路 本设计采用的是结构简单的 LM2940 进行供电,并且使用的两片,可以有效地防止各个器件之间发生干扰以及电流不足的问题,使得系统能够稳定地工作。 电源模块从电池获得电能, 然后经过串联型线性稳压电源芯片 LM2940 的转换,为整个系统提供稳定地 5V 电压。 电源芯片 LM2940 具有波纹小、电路结构简单的优点,但是效率较低、功耗大。 电源模块的电路原理图如图 37 所示。 图 37 电源模块的电路原理图 出为电池电压的输入端, OUT 5V 为电压的输出端。 这样的电路共有两个。 为了和电机驱动不产生干扰,电源模块位于主控板的最下面。 两轮自平衡小车程序设计 程序的功能和流程框架 程序的功能主要包括: ( 1)各个传感器信号的采集和处理; ( 2)小车运行控制:直立控 制、速度控制、方向控制; ( 3)电机 PWM 输出; 成都学院学士学位论文(设计) 14 ( 4)小车运行流程控制:程序初始化、小车启动和结束、小车状态的监控; ( 5)小车信息显示和参数设定:状态显示、上位机监控、参数设定等。 上面的几个功能可以分为两大类:第一类包括前三项功能,它们都是要在精确时间的周期下执行,因此可以在一个周期定时中断里完成。 第二类包括最后两项功能,它的执行不需要在精确的时间周期,可以放在程序的主程序里完成。 这两类任务可以通过全局变量实现相互的通讯。 主程序的框图如 38 图所示 图 38 主程序框架 从上面的主程序框图可以看 出,程序在上电运行以后,就会进行单片机的初始化,初始化的主要任务包括两件,第一件任务是对单片机所有运用到的模块都进行初始化,这些代码由 Code Warrior 集成环境的 ProcessorExpert 工具生成,第二件任务是应用程序的初始化,是对小车控制程序应用到的变量值进行初始化。 在初始化以后,最先进入的是小车直立检测程序,这个程序是经过读取加速度计的成都学院学士学位论文(设计) 15 值来判断小车是否处在直立状态,如果一旦处于直立状态就启动小车的直立控制、方向控制和速度控制。 在小车直立的情况下,小车的程序在主循环中不断地发送监控数据,再通 过串口发送到上位机进行监控,同时检查小车是否跌倒。 跌倒判断可以通过小车倾角是否超过了一定范围进行确定,或者通过安装在小车前后防撞支架上的微动开关来判定。 一旦小车跌倒了小车便停止运行,小车的直立控制、速度控制和方向控制都停止运行,再重新进去小车直立判断过程。 各个模块的程序 主程序: include define SPEED_INC 1 define SPEED_DEC 1 void ArgumentInit(void) { = GRAVITY_OFFSET_DEFAULT。 = GYROSCOPE_OFFSET_DEFAULT。 = GRAVITY_MAX_DEFAULT。 = GRAVITY_MIN_DEFAULT。 = ANGLE_CONTROL_P_DEFAULT。 = ANGLE_CONTROL_D_DEFAULT。 = SPEED_CONTROL_P_DEFAULT。 = SPEED_CONTROL_I_DEFAULT。 = SPEED_CONTROL_D_DEFAULT。 = DIRECTION_CONTROL_D_DEFAULT。 = DIRECTION_CONTROL_P_DEFAULT。 = DIR_LEFT_OFFSET_DEFAULT。 = DIR_RIGHT_OFFSET_DEFAULT。 = DEAD_VOLTAGE_DEFAULT。 = GYROSCOPE_ANGLE_RATIO_DEFAULT。 成都学院学士学位论文(设计) 16 = GRAVITY_TIME_CONSTANT_DEFAULT。 = CAR_SPEED_SET_DEFAULT。 = INIT_FLAG_DEFAULT。 } //**************************** 设置总路 线频率*********************************/ void SetBusCLK_64M(void) { CLKSEL=0X00。 //disengage PLL to system PLLCTL_PLLON=1。 //turn on PLL SYNR =0xc0 | 0x07。 REFDV=0x80 | 0x01。 POSTDIV=0x00。 //pllclock=2*osc*(1+SYNR)/(1+REFDV)=128MHz。 _asm(nop)。 //BUS CLOCK=64M _asm(nop)。 while(!(CRGFLG_LOCK==1))。 //when pll is steady ,then use it。 CLKSEL_PLLSEL =1。 //engage PLL to system。 } /********************脉冲采集 PT0 口 **********************************/ void ECT0_Init(void) { TSCR2=0x00。 //禁止溢出中断 ,分频系数 64( 24/64MHz) TIOS_IOS0=0。 //通道 0 为输入捕捉 TCTL4=0x02。 //捕捉下降沿 TIE_C0I=1。 //通道 0 输入 捕捉中断允许 TSCR1=0x80。 //使能定时器 } /********************脉冲采集 PT7 口 **********************************/ //速度计数 void Ect7_Init(void) 成都学院学士学位论文(设计) 17 { TSCR1=0x80。 //使能定时器 PACTL = (16)。 } /**************************** 初 始 化 设 备**************************************/ void DeviceInit() { SetBusCLK_64M()。 //配置 64M 时钟 ADC_Init()。 //ATD 配置即零偏值采集 PIT_init()。 //周期中断配置 Ect7_Init()。 //脉冲累加器配置 PT7 ECT0_Init()。 //脉冲捕捉 PT0 UART_Init()。 //串口配置 Interrupt_Priority_Set()。 //中断的优先级设置 PWM_Init()。 //PWM 初始化 ArgumentInit()。 //结构体定义变量 CarControlStop()。 //停车控制 CCD_IO_Init()。 LED_Init()。 LCD_Init()。 ReadEeprom(debug,0x0800,0x0c)。 data_deal()。 } //////////////////////////////////////////////////////////////////////////////// void Dly_ms(unsigned int ms) { unsigned int i,j。 for(i=0。 ims。 i++) 成都学院学士学位论文(设计) 18 for(j=0。 j20200。 j++)。 } void main(void) { int zhongxian。 unsigned char Sw_Value。 unsigned char i。 unsigned char send_data_t = 0。 unsigned char *pixel_pt。 int m, value。 DDRB=0x00。 DDRA=0XFF。 DDRE=0XFF。 PUCR=0xD3。 //普通 IO 口设置 DeviceInit()。 EnableInterrupts。 uart_putstr(Usart Is Working!)。 for(。 ) { jieshou=uart_getchar()。 LCD_Print(0,0,角 P)。 Dis_Num(22,0, ANGLE_CONTROL_P_DEFAULT ,5)。 //加速度 LCD_Print(46,0,角 D)。 Dis_Num(70,0, ANGLE_CONTROL_D_DEFAULT,5)。 // Dis_Num(96,0,CAR_SPEED_SET_DEFAULT ,5)。 // LCD_Print(0,2,速 I)。 Dis_Num(22,2,SPEED_CONTROL_I_DEFAULT,5)。 //加速度 LCD_Print(46,2,速 P)。 Dis_Num(70,2,SPEED_CONTROL_P_DEFAULT,5)。 // Dis_Num(96,2, blake,5)。 // LCD_Print(0,4,向 D)。 成都学院学士学位论文(设计) 19 Dis_Num(22,4,DIRECTION_CONTROL_D_DEFAULT,5)。 LCD_Print(46,4,向 P)。 Dis_Num(70,4, DIRECTION_CONTROL_P_DEFAULT,5)。 Dis_Num(96,4, xiangshijian,5)。 // LCD_Print(0,6,左线 )。 Dis_Num(28,6, jieshou,5)。 //加速度 LCD_Print(52,6,中 )。 Dis_Num(66,6,nMidPositio。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。