基于单片机MC9S12XS128的两轮自平衡小车设计

news2025/4/9 6:40:14

目 录

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 <REG52.H>	
#include <math.h>    //Keil library  
#include <stdio.h>   //Keil library	
#include <INTRINS.H>



//********端口定义**********************************
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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/249.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

总结一下flex布局

flex布局 传统布局方案是基于盒状模型&#xff0c;依赖 display position float 方式来实现&#xff0c;灵活性较差&#xff1b;Flex是Flexible Box的缩写&#xff0c;意为”弹性布局”。Flex可以简便、完整、响应式地实现多种页面布局 CSS3 弹性盒子是一种一维的布局&…

[Spring MVC3]MyBatis详解

本章重点讲述了MyBatis映射器&#xff0c;对数据层进行的操作&#xff0c;建议本篇文章和Spring Boot的持久层相互比较来看会更加收获颇多Spring Boot持久层技术 本文需要使用到MVC第一讲的模板格式与配置情况&#xff0c;全部代码已经放在此博客中&#xff0c;Spring MVC1 目…

修改设备管理器的COM端口名称

Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class{4d36e978-e325-11ce-bfc1-08002be10318}\0001] “InfPath”“oem53.inf” “InfSection”“CH341SER_Inst.NTamd64” “ProviderName”“wch.cn” “DriverDateData”hex:00,00…

计算机算法(二)——进入计算机世界

作者介绍&#xff1a; &#x1f4de;作者&#xff1a;小刘在C站 &#x1f4c0;每天分享课堂笔记 &#x1f339;夕阳下&#xff0c;是最美的绽放 瑞士著名的科学家Niklaus Wirth教授曾提出&#xff1a;数据结构算法程序。 数据结构是程序的骨 算法是程序的灵魂。 在生活…

【 C++11 】lambda表达式

目录 1、lambda表达式的引入 2、lambda表达式 lambda表达式的语法 lambda表达式捕捉列表说明 使用lambda表达式排序自定义类型 lambda表达式的底层原理 1、lambda表达式的引入 在C98中&#xff0c;如果想要对一个数据集合中的元素进行排序&#xff0c;可以使用std::sort方法&…

asp.net图书馆借阅归还系统

图书管理系统既是完整的知识定位系统&#xff0c;又是面向未来互联网发展的信息管理模式。图书管理系统&#xff0c;是一套利用计算机信息网络技术&#xff0c;实现对引用、注释和参考图书的自动化处理和规范化管理&#xff0c;服务于教师&#xff0c;学生及各类科研人员的集成…

【C语言进阶考试】你是否真正学懂了C语言

目录 前言 &#x1f392;选择题【全面深度剖析】 &#x1f4d7;考点一&#xff1a;无符号数unsigned的理解与应用 &#x1f4d5;考点二&#xff1a;字符ASCII计算与转换的理解和应用 &#x1f4d9;考点三&#xff1a;对位操作符的理解与应用 &#x1f4d8;考点四&#xf…

docker mysql 主从配置

准备&#xff1a;一台装有docker的虚拟机或者服务器 拉取mysql镜像&#xff1a; docker pull mysql:5.6 启动两个mysql容器 master docker run -p 1006:3306 --name mysql_master -v F:/mysql/mysql_master/conf:/etc/mysql -v F:/mysql/mysql_master/logs:/logs -v F:/mys…

【1024 | 程序员节】浅谈前端开发中常用的设计模式——适配器模式、工厂模式、单例模式等

前言 博主主页&#x1f449;&#x1f3fb;蜡笔雏田学代码 专栏链接&#x1f449;&#x1f3fb;【前端面试专栏】 今天学习前端面试题相关的知识&#xff01; 感兴趣的小伙伴一起来看看吧~&#x1f91e; 文章目录设计模式设计模式分类工厂模式什么是工厂模式工厂模式好处单例模式…

I2C知识大全系列三 —— I2C驱动之单片机中的I2C

两种方式 单片机中的I2C驱动有两种方式。一种方式是用专用硬件I2C控制器实现&#xff0c;这种方式简单易行&#xff0c;品质也容易控制&#xff0c;只是会增加硬件成本方面的压力。另一种方式是用纯软件方式实现&#xff0c;这种方式几乎无硬件成本方面的考虑。 主要对比&…

网页图片采集-网页图片采集软件免费

一款免费的网页图片采集软件可以采集网页上的各种图片&#xff0c;每个人都可以采集到各种高清图源。支持任意格式的图片采集&#xff0c;只需要导入链接即可批量采集图片。 还有更多的采集方式&#xff1a;输入关键词全网图片采集/任意网站所有图片采集&#xff01;不仅可以采…

【C++】STL——vector(万字详解)

&#x1f387;C学习历程&#xff1a;入门 博客主页&#xff1a;一起去看日落吗持续分享博主的C学习历程博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 也许你现在做的事情&#xff0c;暂时看不到成果&#xff0c;但不要忘记&…

记首次参加网络安全比赛(初赛-知识竞赛,决赛-CTF夺旗赛-解题模式)

网络安全相关的方向很多&#xff0c;几乎IT相关的安全内容都可以涵盖在内。笔者本身的知识体系更偏向于编程语言和Web应用&#xff0c;本次参赛可谓极具挑战&#xff0c;但是就是喜欢这种感觉&#xff1a;&#xff09; 赛程安排 9月16日接到通知 9月26日初赛 10月15日决赛 …

计算机网络习题答案

1、校园网属于&#xff08;局域网LAN &#xff09; 2、在下列传输介质中&#xff0c;(光缆 )传输介质的抗电磁干扰性最好。 3、光纤上采用的多路复用技术为&#xff08;WDM&#xff09; 4、计算机网络的交换方式不包括 无线交换 5、网络体系结构模型OSI模型和TCP/IP模型…

区块链实训教程(6)--开发、编译、部署、调用HelloWorld合约

文章目录1. 任务背景2. 任务目标3. 相关知识点4. 任务实操4.1 新建合约文件4.2 编写合约代码4.3 保存、编译、部署合约4.4 调用合约5. 任务总结1. 任务背景 FISCO BCOS运用智能合约进行归纳资产管理、规则定义和价值交换等操作&#xff0c;所以我们需要学习如何使用智能合约。…

aws ec2 配置jenkins和gitlab

环境搭建 下载jenkins的war包&#xff0c;启动jenkisn nohup java -jar jenkins.war --httpPort8091 > jenkins.log 2>&1 &docker安装gitlab 默认情况下&#xff0c;Omnibus GitLab 会自动为初始管理员用户账号 (root) 生成密码&#xff0c;并将其存储到 /etc…

HarmonyOS系统中内核实现温湿度采集方法

大家好&#xff0c;今天主要来聊一聊&#xff0c;如何使用鸿蒙系统中的温湿度传感器方法。 第一&#xff1a;温湿度传感器基本原理 大部分的传感器是在环境温度变化后会产生一个相应的延伸&#xff0c;因此传感器可以以不同的方式对这种反应进行信号转换。常见的大部分是电阻…

gitlab cicd 5分钟快速入门搭建私人代码仓库

gitlab 是企业级私有服务器 本文章采用docker搭建gitlab 如有不懂可微信我号yizheng369 环境准备 购买阿里云服务器&#xff0c;或者其他服务器 注意&#xff1a;本文章是用阿里云的centos 7.6作为服务器 搭建步骤 1.设置环境变量 export GITLAB_HOME/srv/gitlab2.编写dock…

今天面了个阿里拿27k出来的小哥,让我见识到了什么是天花板

2022年堪称大学生就业最难的一年&#xff0c;应届毕业生人数是1076万。失业率超50%&#xff01; 但是我观察到一个数据&#xff0c;那就是已经就业的毕业生中&#xff0c;计算机通信等行业最受毕业生欢迎&#xff01; 计算机IT行业薪资高&#xff0c;平均薪资是文科其他岗位的3…

PLC NAND 虽来但远

前言 图片来源&#xff1a; 存储随笔 2022年8月份在美国FMS峰会上&#xff0c;Solidigm公司(前身为 Intel NAND 部门) 展示了全球第一款基于PLC NAND研发的SSD。这也标志着&#xff0c;PLC时代已正式拉开序幕。出于对 PLC 的好奇&#xff0c;本文分享PLC NAND 知识&#xff0…