基于单片机MC9S12XS128的两轮自平衡小车设计
创始人
2024-01-15 10:01:59
0

目 录

1.绪论 1
1.1研究背景与意义 1
1.2两轮自平衡车的关键技术 2
1.2.1系统设计 2
1.2.2数学建模 2
1.2.3姿态检测系统 2
1.2.4控制算法 3
1.3本文主要研究目标与内容 3
1.4论文章节安排 3
2.系统原理分析 5
2.1控制系统要求分析 5
2.2平衡控制原理分析 5
2.3自平衡小车数学模型 6
2.3.1两轮自平衡小车受力分析 6
2.3.2自平衡小车运动微分方程 9
2.4 PID控制器设计 10
2.4.1 PID控制器原理 10
2.4.2 PID控制器设计 11
2.5姿态检测系统 12
2.5.1陀螺仪 12
2.5.2加速度计 13
2.5.3基于卡尔曼滤波的数据融合 14
2.6本章小结 16
3.系统硬件电路设计 17
3.1 MC9SXS128单片机介绍 17
3.2单片机最小系统设计 19
3.3 电源管理模块设计 21
3.4倾角传感器信号调理电路 22
3.4.1加速度计电路设计 22
3.4.2陀螺仪放大电路设计 22
3.5电机驱动电路设计 23
3.5.1驱动芯片介绍 24
3.5.2 驱动电路设计 24
3.6速度检测模块设计 25
3.6.1编码器介绍 25
3.6.2 编码器电路设计 26
3.7辅助调试电路 27
3.8本章小结 27
4.系统软件设计 28
4.1软件系统总体结构 28
4.2单片机初始化软件设计 28
4.2.1锁相环初始化 28
4.2.2模数转换模块(ATD)初始化 29
4.2.3串行通信模块(SCI)初始化设置 30
4.2.4测速模块初始化 31
4.2.5 PWM模块初始化 32
4.3姿态检测系统软件设计 32
4.3.1陀螺仪与加速度计输出值转换 32
4.3.2卡尔曼滤波器的软件实现 34
4.4平衡PID控制软件实现 35
4.5两轮自平衡车的运动控制 37
4.6本章小结 39
5. 系统调试 40
5.1系统调试工具 40
5.2系统硬件电路调试 40
5.3姿态检测系统调试 41
5.4控制系统PID参数整定 44
5.5两轮自平衡小车动态调试 44
5.6本章小结 45
6. 总结与展望 46
6.1 总结 46
6.2 展望 46
参考文献 47
附 录 48
附录一 系统电路原理图 48
附录二 系统核心源代码 49
致谢 52
2. 系统原理分析
2.1控制系统要求分析
根据系统要求,小车必须要能够在无外界干预下依靠一对平行的车轮保持平衡,并完成前进,后退,左右转弯等动作。分析系统要求可知,保持小车直立和运动的动力都来自于小车的两只车轮,车轮由两只直流电机驱动。因此,从控制角度来看,可以将小车作为一个控制对象,控制输入量是两个车轮的转动速度。整个控制系统可以分为三个子系统:
(1)小车平衡控制:以小车倾角为输入量,通过控制两个电机的正反转保持小车衡。
(2)小车速度控制:在保持平衡的基础上,通过调节小车倾角实现对速度的控制,实际上还是演变为对电机的控制实现小车的速度控制。
(3)小车方向控制:通过控制两个电机间的转速不同实现转向。
小车直立和方向控制任务都是直接通过控制车模两个后轮驱动电机完成的,而速度控制则是通过调节小车倾角完成的。小车不同的倾角会引起车模的加减速,从而达到对小车速度的控制。
三个子系统各自独立进行控制。由于最终都是对同一个控制对象(小车的电机)进行控制,所以各个子系统之间存在着耦合。为了方便分析,在分析其中之一时,假设其它控制对象都已经达到稳定。比如在速度控制时,需要小车已经能够保持直立控制;在方向控制时,需要小车能够保持平衡和速度恒定;同样,在小车平衡控制时,也需要速度和方向控制已经达到平稳。这三个任务中保持小车平衡是关键。由于小车同时受到三种控制的影响,从小车平衡控制的角度来看,其它两个控制就成为干扰。因此对小车速度、方向的控制应该尽量保持平滑,以减少对平衡控制的干扰。以速度调节为例,需要通过改变车模平衡控制中小车倾角设定值,从而改变车模实际倾斜角度,达到速度控制的要求。为了避免影响车模平衡控制,这个车模倾角的改变需要非常缓慢的进行。其中平衡控制是系统的最基本要求,也是整个控制系统的难点。
2.2平衡控制原理分析
控制小车平衡的直观经验来自人类日常生活经验。如人类身体拥有丰富的感知器官,通过大脑调节便可以控制腰部及腿部肌肉保持人体的直立。而一般人通过简单训练就可以让一根直木棍在手指尖保持直立不倒。这需要两个条件:一个是托着木棍的手指可以自由移动;另一个是人的眼睛可以观察木棍的倾斜角度与倾斜趋势(角速度)。这两个条件缺一不可,实际上这就是控制系统中的负反馈机制,如图2-1所示。
在这里插入图片描述

图2-1 保持木棍直立的反馈控制系统
自平衡车的控制也是通过负反馈来实现的,与在指尖保持木棍直立比较则相对简单。由于小车只依靠两个车轮着地,车轮与地面会发生相对滚动使得小车倾斜。而小车上装载的姿态检测系统能够对小车的倾斜状况进行实时检测,通过控制器控制车轮转动,抵消在这个维度上的倾斜力矩便可以保持小车平衡,本文转载自http://www.biyezuopin.vip/onews.asp?id=12737如图2-2所示。
在这里插入图片描述

图2-2 通过车轮转动保持小车平衡


/*****************************************************普通IO模拟I2C通信STC12C5A60S2  IT单片机   AXTL;11.0592MHz*****************************************************/#ifndef  __I2C_H__
#define  __I2C_H__#include 	
#include     //Keil library  
#include    //Keil library	
#include //********端口定义**********************************
sbit    SCL=P2^1;			//IIC时钟引脚定义
sbit    SDA=P2^0;			//IIC数据引脚定义#define	SlaveAddress 0xD0   //IIC写入时的地址字节数据,+1为读取//********函数初始定义******************************
void  Delay5us();
void  I2C_Start();
void  I2C_Stop();
void  I2C_SendACK(bit ack);
bit   I2C_RecvACK();
void  I2C_SendByte(uchar dat);
uchar I2C_RecvByte();
void  I2C_ReadPage();
void  I2C_WritePage();
void  display_ACCEL_x();
void  display_ACCEL_y();
void  display_ACCEL_z();
uchar Single_ReadI2C(uchar REG_Address);						//读取I2C数据
void  Single_WriteI2C(uchar REG_Address,uchar REG_data);	    //向I2C写入数据//**************************************
//延时5微秒(STC12C5A60S2@12M)
//不同的工作环境,需要调整此函数
//此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同
//**************************************/
void Delay5us()
{uchar n = 4;while (n--){_nop_();_nop_();}
}//**************************************
//I2C起始信号
//**************************************
void I2C_Start()
{SDA = 1;                    //拉高数据线SCL = 1;                    //拉高时钟线Delay5us();                 //延时SDA = 0;                    //产生下降沿Delay5us();                 //延时SCL = 0;                    //拉低时钟线
}//**************************************
//I2C停止信号
//**************************************
void I2C_Stop()
{SDA = 0;                    //拉低数据线SCL = 1;                    //拉高时钟线Delay5us();                 //延时SDA = 1;                    //产生上升沿Delay5us();                 //延时
}//**************************************
//I2C发送应答信号
//入口参数:ack (0:ACK 1:NAK)
//**************************************
void I2C_SendACK(bit ack)
{SDA = ack;                  //写应答信号SCL = 1;                    //拉高时钟线Delay5us();                 //延时SCL = 0;                    //拉低时钟线Delay5us();                 //延时
}//**************************************
//I2C接收应答信号
//**************************************
bit I2C_RecvACK()
{SCL = 1;                    //拉高时钟线Delay5us();                 //延时CY = SDA;                   //读应答信号SCL = 0;                    //拉低时钟线Delay5us();                 //延时return CY;
}//**************************************
//向I2C总线发送一个字节数据
//**************************************
void I2C_SendByte(uchar dat)
{uchar i;for (i=0; i<8; i++)         //8位计数器{dat <<= 1;              //移出数据的最高位SDA = CY;               //送数据口SCL = 1;                //拉高时钟线Delay5us();             //延时SCL = 0;                //拉低时钟线Delay5us();             //延时}I2C_RecvACK();
}//**************************************
//从I2C总线接收一个字节数据
//**************************************
uchar I2C_RecvByte()
{uchar i;uchar dat = 0;SDA = 1;                    //使能内部上拉,准备读取数据,for (i=0; i<8; i++)         //8位计数器{dat <<= 1;SCL = 1;                //拉高时钟线Delay5us();             //延时dat |= SDA;             //读数据               SCL = 0;                //拉低时钟线Delay5us();             //延时}return dat;
}//**************************************
//向I2C设备写入一个字节数据
//**************************************
void Single_WriteI2C(uchar REG_Address,uchar REG_data)
{I2C_Start();                  //起始信号I2C_SendByte(SlaveAddress);   //发送设备地址+写信号I2C_SendByte(REG_Address);    //内部寄存器地址I2C_SendByte(REG_data);       //内部寄存器数据I2C_Stop();                   //发送停止信号
}//**************************************
//从I2C设备读取一个字节数据
//**************************************
uchar Single_ReadI2C(uchar REG_Address)
{uchar REG_data;I2C_Start();                   //起始信号I2C_SendByte(SlaveAddress);    //发送设备地址+写信号I2C_SendByte(REG_Address);     //发送存储单元地址,从0开始	I2C_Start();                   //起始信号I2C_SendByte(SlaveAddress+1);  //发送设备地址+读信号REG_data=I2C_RecvByte();       //读出寄存器数据I2C_SendACK(1);                //接收应答信号I2C_Stop();                    //停止信号return REG_data;
}#endif

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关内容

热门资讯

最新单位感谢信 2016最新单位感谢信导数是近代数学的重要基础,是联系初、高等数学的纽带,它的引入为解决中学数学问题...
爱心超市倡议书 爱心超市倡议书  在快速变化和不断变革的新时代,我们都跟倡议书有着直接或间接的联系,在写作上,倡议书...
给哥哥的一封信 给哥哥的一封信(精选16篇)  在生活、工作和学习中,大家都不可避免地会接触到书信吧,书信是一种应用...
窗外作文800字初二 窗外作文800字初二  什么是作文?  作文是从内部言语向外部言语的过渡,即从经过压缩的简要的、自己...
最新安全生产责任书模板 最新安全生产责任书模板  随着社会一步步向前发展,我们每个人都可能会接触到责任书,签订责任书有助于落...
安全检讨书 安全检讨书(通用16篇)  在学习、工作、生活中出现了失误后,为了避免再犯,往往要写检讨书来自我反思...
治安调解协议书样本 治安调解协议书样本  调解必须坚持自愿原则,在双方自愿的情况下达成协议,那么,以下是CN人才公文网小...
英文感谢信件 英文感谢信件(通用8篇)  随着个人的'素质不断提高,感谢信在我们的生活中并不鲜见,感谢信是我们用来...
鱼塘租赁协议书 鱼塘租赁协议书(精选3篇)  在当今社会生活中,我们都跟协议有着直接或间接的联系,签订协议可以使双方...
图书馆最值得推荐作文共77篇 图书馆最值得推荐作文 第一篇我想象中的这座图书馆在一座大都市的中心。它是一棵巨大的树,被一个隔音玻璃...
信息平台设备采购公告范文5篇 信息平台设备采购公告范文 第一篇1、海南东线高速公路府城至琼海段左幅大修工程项目已批准立项,并列入基...
打印参保证明 打印参保证明打印参保证明1、社会保险缴纳证明是指由社保局出具的缴费清单,详细载明你的电脑号、身份号、...
违反校纪校规检讨书 篇一:触犯校规校纪的Array尊敬的学校领导:我是戏剧影视文学系XX级二班的李xx。说真的,我从小写...
律师代理协议书 律师代理协议书5篇  随着社会不断地进步,协议使用的情况越来越多,签订协议是提高经济效益的手段。到底...
美容讲师开场白怎么写 美容讲师开场白怎么写  开场白是一个很重要的东西,这可以提高听众的兴趣,那么如何拥有一个精彩的开场白...
周末问候语 周末问候语大全  在学习、工作或生活中,大家或多或少都会用到过问候语吧,问候语是问候他人时使用的话语...
绅士以及淑女的言谈举止的礼仪 绅士以及淑女的言谈举止的礼仪  1、会使用“请”、“谢谢”、“对不起”等文明用语。  2、有人问话时...
中秋放假通知 中秋放假通知(精选15篇)  在日常生活和工作中,很多情况下我们需要用到通知,通知的种类比较多,根据...
公司行政部门通知 公司行政部门通知范文通用  随着社会一步步向前发展,需要使用通知的场合越来越多,通知的种类比较多,根...
专利使用授权委托书样本 专利使用授权委托书样本  被委托人如果没有做出违背国家法律的任何权益,被委托人在行使权力时委托人不得...