两轮自平衡小车资料(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;可以使…

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

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

Ansible——fetch模块

目录 参数 示例1&#xff1a;最基本的用法 示例2&#xff1a;指定目标目录和主机名子目录 示例3&#xff1a;flat 参数设置为 yes 示例4&#xff1a;处理源文件不存在的情况 示例5&#xff1a;验证文件校验和 示例 Playbook 1. 拉取远程主机上的 syslog 文件 2. 直接…

Redis集群和高可用性:保障Redis服务的稳定性

I. 引言 A. 对Redis的简单介绍和其在现代Web应用中的角色 Redis(REmote DIctionary Server)是一个开源的、基于内存的键值数据库,它支持多种数据结构,如字符串、哈希、列表、集合、有序集合等。由于Redis的高性能和丰富的数据类型,使其在现代Web应用中广泛使用。例如,它…

【吊打面试官系列-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;还可以穿插笑声、说话间的停顿、以及语…

Web前端转行简历:打造一份引人注目的职业转型之作

Web前端转行简历&#xff1a;打造一份引人注目的职业转型之作 在当今日新月异的科技时代&#xff0c;许多专业人士都面临着职业转型的挑战。对于Web前端开发者而言&#xff0c;转行简历的制作尤为关键&#xff0c;它不仅是展示自身技能和经验的重要载体&#xff0c;更是打开新…

力扣189. 轮转数组

给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1:输入: nums [1,2,3,4,5,6,7], k 3 输出:[5,6,7,1,2,3,4] 解释: 向右轮转 1 步:[7,1,2,3,4,5,6] 向右轮转 2 步:[6,7,1,2,3,4,5] 向右轮转 3 步:[5,6,7,1,2,…

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

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

4句话明白虚拟机和容器的区别

一、虚拟机VM的组成 服务器-HostOS-虚拟化层-GustOS-libs-App 1、此时存在几个问题&#xff1a; 1、资源消耗大 2、扩展APP副本时到重复资源浪费&#xff08;GustOS-libs&#xff09; 3、当你开发在本地但要移植到云端&#xff0c;就会出现各种兼容性问题。 4、很难集成到DevOp…

【Spring Cloud】Eureka详细介绍及底层原理解析

目录 底层原理详解 1. 服务注册与发现 2. 心跳机制 3. 服务剔除与自我保护机制 Eureka Server 核心组件 Eureka Client 核心组件 使用场景 结语 Eureka 是 Netflix 开源的一款服务发现框架&#xff0c;用于构建分布式系统中的服务注册与发现。 它包含两个核心组件&…