两轮自平衡小车资料(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);							// 编码器值重新设为0distance += 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.mzph.cn/web/24912.shtml

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

相关文章

[图解]企业应用架构模式2024新译本讲解12-领域模型5

1 00:00:00,560 --> 00:00:04,690 刚才是往那个表里面添加数据了 2 00:00:04,700 --> 00:00:07,960 相当于&#xff0c;或者往这个合同里面添加数据了 3 00:00:08,430 --> 00:00:09,530 现在要查询怎么办 4 00:00:09,900 --> 00:00:10,930 跟前面一样 5 00:00:…

简单的基于threejs和BVH第一人称视角和第三人称视角控制器

渲染框架是基于THREE,碰撞检测是基于BVH。本来用的是three自带的octree结构做碰撞发现性能不太好 核心代码&#xff1a; import * as THREE from three import { RoundedBoxGeometry } from three/examples/jsm/geometries/RoundedBoxGeometry.js; import { MeshBVH, MeshBVHHe…

计算机系统基础笔记(12)——控制

前言 在持续输出ing 一、条件码 1.处理器状态&#xff08;x86-64&#xff0c;部分的&#xff09; 当前程序的执行信息 ◼ 临时数据 ◼ 运行时栈的位置&#xff08;栈顶&#xff09; ◼ 当前代码控制点的位置&#xff08;即将要执行的指令地址&#xff09; ◼ 最近一次指令执…

【C++关键字】auto的使用(C++11)

auto的使用&#xff08;C11&#xff09; auto关键字auto的使用细则auto使用场景 随着程序的复杂化&#xff0c;程序中用到的类型也越来越复杂化&#xff0c;经常体现在&#xff1a; 1.类型难以拼写 2.含义不明确导致容易出错 在C语言阶段处理这类问题的方法&#xff0c;可以使…

拉格朗日乘子将不等式约束转化为等式约束例子

拉格朗日乘子将不等式约束转化为等式约束例子 在优化问题中,常常需要将不等式约束转化为等式约束。使用拉格朗日乘子法,可以通过引入松弛变量将不等式约束转换为等式约束,然后构造拉格朗日函数进行求解。 拉格朗日乘子法简介 拉格朗日乘子法是求解带约束优化问题的一种方…

【吊打面试官系列-Mysql面试题】BLOB 和 TEXT 有什么区别 ?

大家好&#xff0c;我是锋哥。今天分享关于 【BLOB 和 TEXT 有什么区别&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; BLOB 和 TEXT 有什么区别 &#xff1f; BLOB 是一个二进制对象&#xff0c;可以容纳可变数量的数据。TEXT 是一个不区分大小写的 BLOB。 1…

【调整堆】(C++ 代码实现 注释详解)

自定义结构体&#xff1a; #define sz 105 typedef struct node{int length;int l[sz]; }SqList; 调整堆的函数&#xff1a; HeapAdjust函数思路说明&#xff1a; //目标&#xff1a;将以s为根的子树调整为大根堆 //具体操作&#xff1a;将路径上比s大的都往上移动,s往下移…

gRPC(狂神说)

gRPC&#xff08;狂神说&#xff09; 视频地址&#xff1a;【狂神说】gRPC最新超详细版教程通俗易懂 | Go语言全栈教程_哔哩哔哩_bilibili 1、gRPC介绍 单体架构 一旦某个服务宕机&#xff0c;会引起整个应用不可用&#xff0c;隔离性差只能整体应用进行伸缩&#xff0c;浪…

【C++ STL】模拟实现 string

标题&#xff1a;【C :: STL】手撕 STL _string 水墨不写bug &#xff08;图片来源于网络&#xff09; C标准模板库&#xff08;STL&#xff09;中的string是一个可变长的字符序列&#xff0c;它提供了一系列操作字符串的方法和功能。 本篇文章&#xff0c;我们将模拟实现STL的…

ipables防火墙

一、Linux防火墙基础 Linux 的防火墙体系主要工作在网络层&#xff0c;针对 TCP/IP 数据包实施过滤和限制&#xff0c;属于典 型的包过滤防火墙&#xff08;或称为网络层防火墙&#xff09;。Linux 系统的防火墙体系基于内核编码实现&#xff0c; 具有非常稳定的性能和高效率&…

VB7/64位VB6开发工具office插件开发-twinbasic

全新的VB7&#xff0c;twinbasic&#xff0c;支持64位开发&#xff0c;支持EXCEL插件开发&#xff0c;老外连续3年闭关修练终成正果 官方最新版下载&#xff1a;https://github.com/twinbasic/twinbasic/releases 汉化工具用法&#xff1a;把工具和Lang_Tool目录复制到Twinbasi…

SAP PP学习笔记18 - MTO(Make-to-Order):按订单生产(受注生産) 的策略 20,50,74

前面几章讲了 MTS&#xff08;Make-to-Stock&#xff09;按库存生产的策略&#xff08;10&#xff0c;11&#xff0c;30&#xff0c;40&#xff0c;70&#xff09;。 SAP PP学习笔记14 - MTS&#xff08;Make-to-Stock) 按库存生产&#xff08;策略10&#xff09;&#xff0c;…

ChatTTS 开源文本转语音模型本地部署、API使用和搭建WebUI界面(建议收藏)

ChatTTS&#xff08;Chat Text To Speech&#xff09;是专为对话场景设计的文本生成语音(TTS)模型&#xff0c;特别适用于大型语言模型(LLM)助手的对话任务&#xff0c;以及诸如对话式音频和视频介绍等应用。它支持中文和英文&#xff0c;还可以穿插笑声、说话间的停顿、以及语…

计算机网络ppt和课后题总结(下)

常用端口总结 计算机网络中&#xff0c;端口是TCP/IP协议的一部分&#xff0c;用于标识运行在同一台计算机上的不同服务。端口号是一个16位的数字&#xff0c;范围从0到65535。通常&#xff0c;0到1023的端口被称为“熟知端口”或“系统端口”&#xff0c;它们被保留给一些标准…

基于百度接口的实时流式语音识别系统

目录 基于百度接口的实时流式语音识别系统 1. 简介 2. 需求分析 3. 系统架构 4. 模块设计 4.1 音频输入模块 4.2 WebSocket通信模块 4.3 音频处理模块 4.4 结果处理模块 5. 接口设计 5.1 WebSocket接口 5.2 音频输入接口 6. 流程图 程序说明文档 1. 安装依赖 2.…

RHEL8/Centos8 install for PXE

PXE介绍 PXE&#xff08;Preboot Execution Environment&#xff09;是预引导执行环境的缩写。它是由Intel设计的&#xff0c;允许客户端计算机通过网络从服务器上加载操作系统镜像。PXE通常用于大规模部署操作系统&#xff0c;例如在企业或学校环境中。 PXE工作流程如下&…

【复现】含能量路由器的交直流混合配电网潮流计算

目录 1 主要内容 2 理论及模型 3 程序结果 4 下载链接 1 主要内容 程序复现《含能量路由器的交直流混合配电网潮流计算》&#xff0c;主要是对算例4.1进行建模分析&#xff0c;理论和方法按照文献所述。能量路由器&#xff08;ER&#xff09;作为新兴的电力元器件&#xff…

Spring Boot通过自定义注解和Redis+Lua脚本实现接口限流

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

FuTalk设计周刊-Vol.040

&#x1f525;AI漫谈 热点捕手 1、零代码定制游戏NPC&#xff0c;百川智能发布角色大模型 百川智能此次推出了“角色创建平台搜索增强知识库”的定制化解决方案。通过这一方案&#xff0c;游戏厂商无需编写任何代码&#xff0c;只需通过简单的文字描述&#xff0c;便可以快速…

IT人的拖延——都是“分心”惹的祸?

典型表现 我们说到拖延的原因有很多&#xff0c;还有一个原因是因为“分心太多“造成的&#xff0c;分心太多的拖延大致上有以下表现&#xff1a; 无法集中注意力&#xff1a; 分心太多会导致我们无法集中注意力在当前的工作任务上&#xff0c;我们可能会经常性地走神或者在工…