两轮自平衡小车资料(L298N 模块原理图及使用说明+c源码)

news2024/11/27 3:58:20

     本文详细介绍了基于STM32微控制器的两轮自平衡小车的设计与实现过程。内容包括小车的硬件选型、电路设计、软件编程以及PID控制算法的应用。通过陀螺仪和加速度计获取小车的姿态信息,利用PID控制算法调整电机输出,实现小车的自主平衡。此外,还探讨了如何通过遥控实现小车的平稳前进和后退,以及利用灰度传感器实现循迹和避障功能。

驱动步进电机如下:

硬件接线图
系统原理图如下:
IN1-IN4
逻辑输入端,其中 IN1 IN2 控制电机 M1 IN3 IN4 控制电机 M2 。例如
IN1 输入
高电平 1,IN2 输入低电平 0 ,对应电机 M1 正转; IN1 输入低电平 0,IN2
输入高电平 1 , 对应电机 M1 反转,调速就是改变高电平的占空比。(如何改变
占空比请学会百度)
PWMA
PWMB
L298N 使能端(高电平有效,常态下用跳线帽接于 VCC ),可通过这两个端
口实现 PWM 调速(使用 PWM 调速时取下跳线帽),具体参考 L298N 芯片手册。
如何控制直流电机正反转 ?
如逻辑输入部分接单片机 P0 口的 P0.0-P0.3. 那么想让电机正转只要给 1010, 反转给 0101
可:
Void main()
{
While(1)
{
P0=0xaa;
Delay(1000);
P0=0x55;
Delay(1000);
}
}

主程序:


#define PI (3.14159265)
// 度数表示的角速度*1000
#define MDPS (70)
// 弧度表示的角速度
#define RADPS ((float)MDPS*PI/180000)
// 每个查询周期改变的角度
#define RADPT (RADPS/(-100))


// 平衡的角度范围;+-60度(由于角度计算采用一阶展开,实际值约为46度)
#define ANGLE_RANGE_MAX (60*PI/180)
#define ANGLE_RANGE_MIN (-60*PI/180)

// 全局变量
pid_s sPID;					// PID控制参数结构体
float radian_filted=0;		// 滤波后的弧度
accelerometer_s acc;		// 加速度结构体,包含3维变量
gyroscope_s gyr;			// 角速度结构体,包含3维变量
int speed=0, distance=0;	// 小车移动的速度,距离
int tick_flag = 0;			// 定时中断标志
int pwm_speed = 0;			// 电机pwm控制的偏置值,两个电机的大小、正负相同,使小车以一定的速度前进
int pwm_turn = 0;			// 电机pwm控制的差异值,两个电机的大小相同,正负相反,使小车左、右转向
float angle_balance = 0;	// 小车的平衡角度。由于小车重心的偏移,小车的平衡角度不一定是radian_filted为零的时候


// 定时器周期中断,10ms
void sys_tick_proc(void)
{
	static unsigned int i = 0;

	tick_flag++;

	i++;
	if(i>=100) i=0;

	if(i==0)	   	// 绿灯的闪烁周期为1秒
	{
		LED1_OFF();
	}
	else if(i==50)
	{
		LED1_ON();
	}
}

void control_proc(void)
{
	int i = ir_key_proc(); // 将红外接收到的按键值,转换为小车控制的相应按键值。

	switch(i)
	{
		case KEY_TURN_LEFT:
			if(pwm_turn<500) pwm_turn += 50;
			break;
		case KEY_TURN_RIGHT:
			if(pwm_turn>-500) pwm_turn -= 50;
			break;
		case KEY_TURN_STOP:
			pwm_turn = 0;
			distance = 0;
			pwm_speed = 0;
			break;
		case KEY_SPEED_UP:
			if(pwm_speed<500) pwm_speed+=100;
			break;
		case KEY_SPEED_DOWN:
			if(pwm_speed>-500) pwm_speed-=100;
			break;
		case KEY_SPEED_0:
			pwm_speed = 0;
			break;
		case KEY_SPEED_F1:
			pwm_speed = 150;
			break;
		case KEY_SPEED_F2:
			pwm_speed = 300;
			break;
		case KEY_SPEED_F3:
			pwm_speed = 450;
			break;
		case KEY_SPEED_F4:
			pwm_speed = 600;
			break;
		case KEY_SPEED_F5:
			pwm_speed = 750;
			break;
		case KEY_SPEED_F6:
			pwm_speed = 900;
			break;
		case KEY_SPEED_B1:
			pwm_speed = -150;
		case KEY_SPEED_B2:
			pwm_speed = -300;
		case KEY_SPEED_B3:
			pwm_speed = -450;
			break;
		default:
			break;
	}

	pwm_turn *= 0.9;	// pwm_turn的值以0.9的比例衰减,使小车在接收到一个转向信号后只转动一定的时间后停止转动。


	speed = speed*0.7 +0.3*(encoder_read());	// 定周期(10ms)读取编码器数值得到实时速度,再对速度进行平滑滤波
 	if(speed!=0)
	{
		printf("speed: %d, dst: %d, pwm: %d \r\n", speed,distance,(int)(speed*6+distance*0.1));
	}



	encoder_write(0);							// 编码器值重新设为0

	distance += speed;							// 对速度进行积分,得到移动距离

	if(distance>6000) distance = 6000;			// 减少小车悬空、空转对控制的影响
	else if(distance<-6000) distance = -6000;

}

void balance_proc(void)
{
	static unsigned int err_cnt=0;

//	float tFloat;
	int pwm_balance;
//	static float angle;
//	float angle_t;
	float radian, radian_pt;  	// 当前弧度及弧度的微分(角速度,角度值用弧度表示)

	adxl345_read(&acc);			// 读取当前加速度。由于传感器按照的位置原因,传感器的值在函数内部经过处理,变为小车的虚拟坐标系。
	l3g4200d_read(&gyr);		// 读取当前角速度。同样经过坐标系变换。


// 此段程序用于传感器出错时停止小车
	err_cnt = err_cnt*115>>7;	// err_cnt以0.9的比例系数衰减(115>>7的值约为0.9,避免浮点数,提高速度)
	if(acc.flag != 0x0F || gyr.flag != 0x0F)   // 读取的角度、角速度值有误。可能是电磁干扰、iic线太长等导致出错。
	{

资源下载:

两轮自平衡小车资料(L298N 模块原理图及使用说明+c源码)

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

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

相关文章

mac Network: use --host to expose

本地启动无法访问&#xff0c;这个不是权限问题是mac 主机端口安全策略&#xff0c;现在我们只需要开启端口自动检测就可以 npm run dev --host 网络&#xff1a;未暴露 方案一 1、执行 npm run dev -- --host 方案二 1、请在 vite.config.js server: {host: true } 1…

c++之旅第十弹——IO流

大家好啊&#xff0c;这里是c之旅第十弹&#xff0c;跟随我的步伐来开始这一篇的学习吧&#xff01; 如果有知识性错误&#xff0c;欢迎各位指正&#xff01;&#xff01;一起加油&#xff01;&#xff01; 创作不易&#xff0c;希望大家多多支持哦&#xff01; 一.流的概念&…

知乎网站只让知乎用户看文章,普通人看不了

知乎默认不显示全部文章&#xff0c;需要点击展开阅读全文 然而点击后却要登录&#xff0c;这意味着普通人看不了博主写的文章&#xff0c;只有成为知乎用户才有权力查看文章。我想这不是知乎创作者希望的情况&#xff0c;他们写文章肯定是希望所有人都能看到。 这个网站篡改…

力扣每日一题129:从根节点到叶子节点的和

题目 中等 相关标签 相关企业 给你一个二叉树的根节点 root &#xff0c;树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表一个数字&#xff1a; 例如&#xff0c;从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。 计算从根节…

Linux基础 (十三):计算机网络基础概论

一、网络基本概念 1.1 网络 把独立自主的计算机通过传输介质和网络设备链接起来&#xff0c;就构成一个网络 &#xff0c;网络是由若干结点和连接这些结点的链路组成&#xff0c;网络中的结点可以是计算机&#xff0c;交换机、 路由器等设备。 网络设备有&#xff1a;交换机、…

跨域、JSONP、CORS、Spring、Spring Security解决方案

概述 JavaScript出于安全方面的考虑&#xff0c;不允许跨域调用其他页面的对象。跨域是浏览器&#xff08;如Chrome浏览器基于JS V8引擎&#xff0c;可以简单理解为JS解释器&#xff09;的一种同源安全策略&#xff0c;是浏览器单方面限制脚本的跨域访问。因此&#xff0c;仅有…

Chrome浏览器书签同步不及时怎么办?两种方法帮你解决!

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…

Elasticsearch 认证模拟题 - 17

这两道题目非常具有代表性&#xff0c;分别是跨集群复制和跨集群检索&#xff0c;需要相应的 许可 这里在虚拟机上搭建集群完成这两道题目&#xff0c;这里补充一下 elasticsearch 和 kibana 的配置文件 # elasticsearch.yml cluster.name: cluster2 node.name: cluster2-node…

一定要了解的 WordPress 数据库中默认 12 个表

WordPressan 安装的时候会有 12 张默认的数据表,每张表的数据都包含了 WordPress 不同的功能。看看这些表的结构,你能很容易的了解网站不同的部分都是存在哪里的。目前,默认的 WordPress 安装会创建如下的数据表。 注意:每张表名前面的 wp_ 是你在安装过程中选择的数据库前…

新书推荐:2.2.4 第11练:消息循环

/*------------------------------------------------------------------------ 011 编程达人win32 API每日一练 第11个例子GetMessage.c&#xff1a;消息循环 MSG结构 GetMessage函数 TranslateMessage函数&#xff1a;将虚拟键消息转换为字符消息 DispatchMessage函数…

【微信小程序】事件分类以及阻止事件冒泡

在微信小程序中&#xff0c;事件分为冒泡事件和非冒泡事件两大类&#xff0c;它们的区别在于事件是否能从原始触发组件开始&#xff0c;向父级组件传播&#xff08;即“冒泡”&#xff09;。 冒泡事件&#xff1a;当一个组件上的事件被触发后&#xff0c;不仅当前组件会接收到这…

cisco packet tracer 8.2.2 (思科模拟器) ospf路由协议

1 实验拓扑图 2 配置路由器和交换机 #sw1 en config t hostname sw1 ip routing int vlan 2 ip address 192.168.2.1 255.255.255.0 exit int vlan 3 ip address 192.168.3.1 255.255.255.0 exit int gigabitEthernet 1/0/1 switchport access vlan 2 exit int gigabitEthe…

012-Linux逻辑卷管理(LVM)

前言 安装 Linux 操作系统时遇到的⼀个常见的难以决定的问题就是如何正确地评估各分区大小&#xff0c;以分配合适的硬盘空间; 基本的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小。随着 Linux的逻辑卷管理功能的出现&#xff0c;这些问题都迎刃而解&#xff0c;用户…

[C++初阶]string类的详解

一、string类的模拟实现 上面已经对string类进行了简单的介绍&#xff0c;大家只要能够正常使用即可。在面试中&#xff0c;面试官总喜欢让我们来模拟实现string类&#xff0c;最主要是实现string类的构造、拷贝构造、赋值运算符重载以及析构函数。大家看下以下string类的实现是…

深度学习-CPGNet部署

1、导出onnx提示以下警告 问题&#xff1a; 原因&#xff1a; 模型是torch1.8导出的&#xff0c;对应的onnx版本是11&#xff0c;但是onnx是torch1.12生成的&#xff0c;对应的onnx版本是16。 解决方法&#xff1a; 将onnx.export函数的属性从opset_version16改成opset_version…

【数据结构】查找(顺序查找、二分查找、索引顺序查找、二叉排序树、平衡排序树、B树、B+树、哈希表)

目录 数据结构——查找何为查找1. 查找表2. 关键字3. 查找方法效果评价指标——平均查找长度ASL(Average Search Length) 静态查找表1.顺序查找2.二分查找二分查找判定树 3.静态查找表—索引顺序表的查找索引顺序查找表的算法原理&#xff1a; 动态查找树表1. 二叉排序树2. 二叉…

7种方法教你如何解决msvcp140_1.dll丢失问题,一键修复dll丢失问题

msvcp140_1.dll 是 Microsoft Visual C 2015 Redistributable 的一部分&#xff0c;它提供了运行时所需的 C 标准库的实现。这个 DLL 文件对于依赖 Visual C 2015 编译的应用程序至关重要&#xff0c;因为它包含了程序运行时所必需的函数和资源。 作用 运行时支持&#xff1a…

点击一张图片,到最后渲染到屏幕,都经历了哪些流程?

文章目录 图像的表示在iOS设备上 图像的表示 位图&#xff08;bitmap&#xff09;是一种常见的图像表示方式&#xff0c;它通过记录图像中每个像素的颜色信息来表示整张图片。以下是位图表示图片的基本原理&#xff1a; 像素网格&#xff1a; 位图将图像分解成一个网格&…

【数据结构】十一、图的应用:Prime算法、Dijkstra算法和拓扑排序

目录 一、最小生成树&#xff08;Prime算法&#xff09; 1&#xff09;概念 2&#xff09;最小生成树的应用 3&#xff09;最小生成树的创建 4&#xff09;代码实现 五、最短路径 1&#xff09;Dijkstra算法 Question&#xff1a; 六、拓扑排序 1&#xff09;概念 2&…