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

     本文详细介绍了基于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源码)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch之写入原理以及调优

1、ES 的写入过程 1.1 ES支持四种对文档的数据写操作 create&#xff1a;如果在PUT数据的时候当前数据已经存在&#xff0c;则数据会被覆盖&#xff0c;如果在PUT的时候加上操作类型create&#xff0c;此时如果数据已存在则会返回失败&#xff0c;因为已经强制指定了操作类型…

调查显示各公司在 IT 安全培训方面存在差距

网络安全提供商 Hornetsecurity 最近进行的一项调查显示&#xff0c;许多组织的 IT 安全培训存在严重缺陷。 这项调查是在伦敦举行的 Infosecurity Europe 2024 期间发布的&#xff0c;调查发现 26% 的组织没有为其最终用户提供任何 IT 安全培训。 这些调查结果来自世界各地的…

Nginx的https功能和防盗链

目录 一.HTTPS功能简介 二.https自签名证书 三.防盗链 一.HTTPS功能简介 Web网站的登录页面都是使用https加密传输的&#xff0c;加密数据以保障数据的安全&#xff0c;HTTPS能够加密信息&#xff0c;以免敏感信息被第三方获取&#xff0c;所以很多银行网站或电子邮箱等等安…

力扣hot100:739. 每日温度/54. 螺旋矩阵

文章目录 一、 739. 每日温度二、54. 螺旋矩阵1、模拟螺旋矩阵的路径2、按层模拟 一、 739. 每日温度 LeetCode&#xff1a;739. 每日温度 经典单调栈问题&#xff0c;求下一个更大的数。 使用单调递减栈&#xff0c;一个元素A出栈&#xff0c;当且仅当它第一次出现比它更大…

Linux常见故障处理之df命令卡住不输出

一、背景说明 朋友咨询Linux系统下输入df -h命令后没有任何输出结果&#xff0c;博主的第一反应是/根分区磁盘空间满了&#xff0c;朋友说cd等其他命令可以执行。博主又猜测可能是有人误定义了命令别名&#xff0c;进一步确认命令卡住在等待输出页面。事后博主想起来可能是共享…

【Docker系列】跨平台 Docker 镜像构建:深入理解`--platform`参数

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【计网复习】应用层总结(不含HTTP和错题重点解析)

应用层总结&#xff08;不含HTTP和错题重点解析&#xff09; 应用层简介 应用层的主要功能常见的应用层协议小林对于应用层通常的解释 网络应用模型 客户端-服务器模型&#xff08;Client-Server Model, C/S&#xff09; 特点优点缺点应用场景 对等网络模型&#xff08;Peer-to…

中文文案写作有哪些合适的AIGC工具?

这是计育韬老师第 8 次开展面向全国高校的新媒体技术公益巡讲活动了。而在每场讲座尾声&#xff0c;互动答疑环节往往反映了高校师生当前最普遍的运营困境&#xff0c;特此计老师在现场即兴答疑之外&#xff0c;会尽量选择有较高价值的提问进行文字答疑梳理。 *本轮巡讲主题除了…

8.数砖数

上海市计算机学会竞赛平台 | YACSYACS 是由上海市计算机学会于2019年发起的活动,旨在激发青少年对学习人工智能与算法设计的热情与兴趣,提升青少年科学素养,引导青少年投身创新发现和科研实践活动。https://www.iai.sh.cn/problem/879 题目描述 给定一种 2222 规格的瓷砖,…

标准发布实施 | 《村镇污水处理一体化集成装备技术规范》

根据《中华人民共和国标准化法》以及国家标准化管理委员会、民政部联合制定的《团体标准管理规定》&#xff0c;依据全国团体标准信息平台和《中华环保联合会团体标准管理办法&#xff08;试行&#xff09;》&#xff0c;全国团体标准《村镇污水处理一体化集成装备技术指南》&a…

Scanpy(3)单细胞数据分析常规流程

单细胞数据分析常规流程 面对高效快速的要求上,使用R分析数据越来越困难,转战Python分析,我们通过scanpy官网去学习如何分析单细胞下游常规分析。 数据3k PBMC来自健康的志愿者,可从10x Genomics免费获得。在linux系统上,可以取消注释并运行以下操作来下载和解压缩数据。…

【下篇】从 YOLOv1 到 YOLOv8 的 YOLO 物体检测模型历史

YOLO 型号之所以闻名遐迩,主要有两个原因:其速度和准确性令人印象深刻,而且能够快速、可靠地检测图像中的物体。上回我解释了YoloX, 今天从Yolov6开始。 YOLOv6:面向工业应用的单级物体检测框架 美团视觉人工智能事业部(Meituan Vision AI Department)于 2022 年 9 月在…

公众号首图次图封面设计工具

制作图 介绍 《制作图》是一款用来设计封面的工具&#xff0c;比如你可以为你的博客、视频、公众号等设计你自己喜欢的封面。 预览 网址 https://wuxianqiang.github.io/fabritor/ 公众号首图、次图&#xff0c;按尺寸标准一键生成 该工具为公众号等自媒体创作者的提效神…

Photoshop版本选择及系统要求

1、ps2018cc/2020cc版本 适合新手&#xff0c;增加了很多智能化操作&#xff0c;非常方便好上手。 2020&#xff1a; 2、ps2015版本 cc2015版本不论是功能还是硬件上&#xff0c;都是不二选择&#xff0c;适合于配置较低的电脑&#xff0c;该有的基本功能它都有。 3、2021/2…

【Centos】深度解析:CentOS下安装pip的完整指南

【Centos】深度解析&#xff1a;CentOS下安装pip的完整指南 大家好 我是寸铁&#x1f44a; 总结了一篇【Centos】深度解析&#xff1a;CentOS下安装pip的完整指南✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 方式1(推荐) 下载get-pip.py到本地 sudo wget https://bootstrap.p…

代码随想录——修建二叉搜素树(Leetcode669)

题目链接 递归 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

HTTP 协议详解(史上最全)

目录 1. HTTP 协议介绍 2. HTTP 协议的工作过程 3. Fiddler 抓包工具介绍 3.1 抓包工具的使用 3.2 抓包结果 3.3 抓包工具原理 4. HTTP 协议格式总览 5. HTTP 请求&#xff08;Request&#xff09; 5.1 认识 URL URL 基本介绍 URL 基本格式 URL 参数介绍 URLencod…

【Java 百“练”成钢】Java 基础:带参数的方法

Java 基础&#xff1a;带参数的方法 01.求和02.字符串输出03.寻找最大值04.寻找最小值05.字符串拼接06.求平均值07.数组排序08.累乘09.存在的字符串10.长整型求和11.寻找字符串索引12.字符串拼接&#xff08;StringBuilder&#xff09; 01.求和 public class SumCalculator {s…

C#操作MySQL从入门到精通(15)——分组数据

前言 我们有时候需要对数据库中查询的数据进行分组,所谓分组就是将相同的数据分为一组,本次测试使用的数据库数据如下: 1、分组 分组使用group by关键词,下面的代码的意思是对查询的结果按照student_age进行分组,student_age相同的划分为同一组 string sql = string.E…

《软件定义安全》之四:什么是软件定义安全

第4章 什么是软件定义安全 1.软件定义安全的含义 1.1 软件定义安全的提出 虚拟化、云计算、软件定义架构的出现&#xff0c;对安全体系提出了新的挑战。如果要跟上网络演进的步伐和业务快速创新的速度&#xff0c;安全体系应该朝以下方向演变。 &#x1d7ed; 安全机制软件…