STM32输出PWM波控制电机转速,红外循迹避障智能车+L298N的详细使用手册、接线方法及工作原理,有代码

智能循迹红外避障小车

本设计的完整的系统主要包括STM32单片机最小系统、L298n电机驱动,超声波 ,舵机 ,红外模块等。寻迹小车相信大家都已经耳熟能祥了。
我们在这里主要讲一下L298N驱动电机和单片机输出PWM控制电机转速。

本设计软件系统采用模块设计思想,采用C语言作为程序设计语言,通过KEI MDK完成程序设计,使用仿真器下载软件完成程序的烧录和在线调试。

1.采用C8T6开发板,这个板子我只能说性价比无敌。
在这里插入图片描述
STM32F103C8T6是一个中密度性能线,配有ARM Cortex-M3 32位微控制器,48路LQFP封装.它结合了高性能的RISC内核,运行频率可达72MHz,以及高速内嵌存储器,增强范围的强化输入/输出和外部连接至两个APB总线.STM32F103C8T6具有12位模数转换器,4个计时器,3个串口等等。
2.电机驱动模块,当时看有人用这个 我也买了。后来很多人反映以及我在使用过程中,发现L298N不算是那么好用。
在这里插入图片描述
L298N我也只是在这个简单的小车上用一下这个模块,做别的一般不推荐这个,推荐TB6612等。对于L298N的讲解此网站上有很多 我只能说讲的好的每一个,我初次找L298N的资料时,真的被搞的迷迷糊糊,怎么说的都有,服了。我再次为大家讲解明白。
L298N双通道输出,输出A与输出B
供电方式 :12V供电,左下角三个接口,最左边为12V输入,中间为GND引脚,右边是5v输出(要将上面跳线帽连接)
如果输入大于12v要将上面跳线帽拔掉!!!
通道输出:
1.不考虑电机调速:使能ENA、ENB置于高电平,直接对N1、N2、N3、N4接入高低电平
(电机以最快速度转动)---------------------------------没办法调整左右轮速度
2.考虑电机调速:ENA和ENB接单片机的PWM波输出引脚!别被其他文章搞混了。
IN1,IN2,IN3,IN4按章上面的接法控制方向。就这么简单。别好多人讲的迷迷糊糊。
在这里插入图片描述
在这里插入图片描述
这里采用这种简单的减速小马达减速比好像是1:48,童年回忆哈哈哈哈。
bsp_pwm.c

#include "bsp_pwm.h"
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
//TIM1_PWM_Init(7199,0);//PWM频率=72000/(7199+1)=10Khz
void TIM1_PWM_Init(u16 arr,u16 psc)
{  
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure; //时基单元配置
	TIM_OCInitTypeDef  TIM_OCInitStructure;    //tim定时器输出模式结构体
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);// 
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  //使能GPIO外设时钟使能
   //设置该引脚为复用输出功能,输出TIM1 CH1 CH4的PWM脉冲波形
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_11; //TIM_CH1 //TIM_CH4
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	 
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM_OCInitStructure.TIM_Pulse = 0;                            //设置待装入捕获比较寄存器的脉冲值
	TIM_OCInitStructure.TIM_Pulse = arr >> 1;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;     //输出极性:TIM输出比较极性高
	TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
	TIM_OC4Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
	

  TIM_CtrlPWMOutputs(TIM1,ENABLE);	//MOE 主输出使能	 高级定时器输出PWM波特殊配置

	TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH1预装载使能	 

	TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH4预装载使能	
	
	TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器
	
	TIM_Cmd(TIM1, ENABLE);  //使能TIM1
}

bsp_pwm.h

#ifndef __PWM_H
#define __PWM_H


#include "sys.h"


void TIM1_PWM_Init(u16 arr,u16 psc);

#endif

main.c

#include "sys.h"   //这个文件有点基础的都懂吧  不懂私信我

/**
  * @brief  主函数
  * @param  无
  * @retval 无
  */ 
	
	#define SOFT_DELAY Delay(0x0FFFFF);

void Delay(__IO u32 nCount); 

int main(void)
{	
	delay_init();
	/* LED端口初始化 */
	LED_GPIO_Config();
	TIM1_PWM_Init(99,71);//72+100/72000
	Motor_Init();
 	LED2_ON;//我习惯在都初始化后亮个灯表示一下。


while(1)
	
{
	LED2_ON;
	delay_ms(500);
	LED2_OFF;;
	advance();
	delay_ms(3000);
	retreat();
	delay_ms(3000);
	left();
	delay_ms(3000);
	right();
	delay_ms(3000);
	
	stop();


}

bsp_motor.c

#include "bsp_motor.h"


void Motor_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口时钟
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;	//端口配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      //推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     //50MHZ
  GPIO_Init(GPIOB, &GPIO_InitStructure);					      //根据设定参数初始化GPIOB 
	AIN1=0,AIN2=0;
	BIN1=0,BIN2=0;
}
void stop(void)
{	
TIM_SetCompare1(TIM1,  0);
TIM_SetCompare4(TIM1, 0 );
		AIN1=0,AIN2=0;
	BIN1=0,BIN2=0;
}
void advance(void)
{
	
	PWM1=100;
	PWM4=100;
//TIM_SetCompare1(TIM1,  100);
//TIM_SetCompare4(TIM1, 100 );
		AIN1=1,AIN2=0;
	BIN1=1,BIN2=0;
}


void  retreat(void)
{
	PWM1=100;
	PWM4=100;
		AIN1=0,AIN2=1;
	BIN1=0,BIN2=1;
}

void right(void)
{
	
	PWM1=100;
	PWM4=100;
		AIN1=0,AIN2=1;
	BIN1=1,BIN2=0;
}
void left(void)
{
	
	PWM1=100;
	PWM4=100;
		AIN1=1,AIN2=0;
	BIN1=0,BIN2=1;
}

bsp_motor.h

#ifndef __BSP_MOTOR_H
#define __BSP_MOTOR_H

#include "sys.h"






#define PWM1   TIM1->CCR1  //PA8



#define PWM4   TIM1->CCR4  //PA11


#define AIN2   PBout(13)
#define AIN1   PBout(12)
#define BIN1   PBout(14)
#define BIN2   PBout(15)



void Motor_Init(void);

void stop(void);
void advance(void);
void  retreat(void);
void left(void);
void right(void);


#endif  /*__BSP_MOTOR_H*/


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

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

相关文章

这个时候了,你还不会不知道JavaMail API吧

一、概述 1.1 简述 JavaMail API 顾名思义,提供给开发者处理电子邮件相关的编程接口,它是Sun发布的用来处理email的API,其提供独立于平台且与协议无关的框架来构建邮件和消息传递应用。JavaMail API 提供了一组抽象类,用于定义组…

第十四届蓝桥杯三月真题刷题训练——第 24 天

目录 第 1 题:旋转 题目描述 输入描述 输出描述 输入输出样例 运行限制 代码: 思路: 第 2 题:附近最小_单调队列模板 代码: 第 3 题:扫地机器人_二分 题目描述 输入描述 输出描述 输入输出样…

【蓝桥杯】​蓝桥杯——每日四道编程题(两道真题+两道模拟)​| 第 二 天

专栏: 蓝桥杯——每日四道编程题(两道真题两道模拟) “蓝桥杯就要开始了,这些题刷到就是赚到” ₍ᐢ..ᐢ₎♡ 另一个专栏: 蓝桥杯——每日四道填空题(两道真题两道模拟题) 目录 第一道真题&…

Kafka 基础整理、 Springboot 简单整合

定义: Kafka 是一个分布式的基于发布/订阅默认的消息队列是一个开源的分布式事件流平台,被常用用于数据管道、流分析、数据集成、关键任务应用 消费模式: 点对点模式 (少用) 消费者主动拉取数据,消息收到后清除消息 发布/订阅模式…

【蓝桥杯嵌入式】第十四届蓝桥杯嵌入式[模拟赛2]客观题及详细题解

题1 解析 USART_CR1:控制寄存器1,其中的M位定义了数据字的长度,由软件对其设置和清零。USART_CR2:控制寄存器2。USART_BRR:波特率寄存器。USART_DR:数据寄存器。 (如果现场不记得,可以查阅芯片手册) 答案: A 题2 解析 在STM32微控制器中&a…

每日学术速递3.29

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.CC3D: Layout-Conditioned Generation of Compositional 3D Scenes 标题:CC3D:合成 3D 场景的布局条件生成 作者:Sherwin Bahmani, Jeong Joon …

五、MyBatis各种查询功能

MyBatis的各种查询功能 如果查询出的数据只有一条,可以通过 实体类对象接收List集合接收Map集合接收 如果查询出的数据有多条,一定不能用实体对象接收,会抛TooManyResultsException,可以通过 实体类类型的List集合接收Map类型的L…

学习系统编程No.11【重定向的本质】

引言: 北京时间:2023/3/27/7:05,哈哈哈,首先是开心,因为上篇博客热榜目前第15,让我初步掌握了上热榜的小妙招,不单单只是要日更,还有非常多的上榜小技巧,但是首先连续更…

【备战蓝桥杯】----01背包问题(动态规划)

🌹作者:云小逸 📝个人主页:云小逸的主页 📝Github:云小逸的Github 🤟motto:要敢于一个人默默的面对自己,强大自己才是核心。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前…

【数据结构】堆(堆的实现 堆向下调整算法 堆的创建 堆的插入 堆的删除 堆的代码实现 堆的应用)

文章目录堆的实现堆向下调整算法堆的创建堆的插入堆的删除堆的代码实现堆的应用堆的实现 堆是属于操作系统进程地址空间内存区域的划分。 我们下面实现数据结构中的堆。 堆是一个完全二叉树&#xff1a;分为小根堆和大根堆。 小根堆&#xff1a;任何一个节点的值都<孩子的…

YOLOv8原理解析:重新定义实时目标检测的速度和精度

文章目录0.前言1.YOLOv51.1 YOLOv5网络回顾1.2 YOLOv5网络结构图2.YOLOv82.1 YOLOv8概述2.2 YOLOv8整体结构图2.3 YOLOv8yaml 文件与 YOLOv5yaml 文件对比2.3.1 参数部分2.3.2 主干部分2.3.3 Neck部分2.3.4 Head部分2.4 正负样本分配策略2.4.1 静态分配策略和动态分配策略有什么…

【嵌入式烧录/刷写文件】-1.1-详解Motorola S-record(S19/SREC/mot/SX)格式文件

目录 1 什么是Motorola S-record 2 Motorola S-record的格式 2.1 Motorola S-record的结构 2.1.1 “Record type记录类型”的说明 2.1.2 “Record length记录长度”的说明 2.1.3 如何计算“Checksum校验和” 2.2 Record order记录顺序 2.3 Text line terminator文本行终…

【C语言】柔性数组

柔性数组1. 柔性数组介绍2. 柔性数组特点3. 用例3.1 代码一&#xff1a;3.2 代码二&#xff1a;4. 柔性数组优势&#xff1a;1. 柔性数组介绍 也许你从来没有听说过柔性数组&#xff08;flexible array&#xff09;这个概念&#xff0c;但是它确实是存在的。 C99 中&#xff0c…

#详细介绍!!! 线程池的拒绝策略(经典面试题)

本篇单独讲解线程池的拒绝策略&#xff0c;介绍了当线程池任务满了之后&#xff0c;线程池会以什么样的方式来响应添加进来的任务 目录 一&#xff1a;理解线程池拒绝策略的触发情况代码理解 二&#xff1a;线程池的四种常见的拒绝策略 1.ThreadPoolExecutor.AbortPolicy 2…

【Spring6】| GoF之代理模式(静态代理和动态代理)

目录 一&#xff1a;GoF之代理模式 1. 对代理模式的理解 2. 静态代理 3. 动态代理 3.1 JDK动态代理 3.2 CGLIB动态代理 一&#xff1a;GoF之代理模式 1. 对代理模式的理解 生活场景1&#xff1a;牛村的牛二看上了隔壁村小花&#xff0c;牛二不好意思直接找小花&#xff…

内网渗透之某后渗透利用【网络安全】

0x01 工具介绍 工具原理 Mimikatz 的主要原理是在 Windows 系统中用户登录后系统会将身份凭证存储于lsass.exe进程的内存当中&#xff0c;Mimikatz 通过注入lsass.exe进程读取进程内存&#xff0c;从中获取对应的明文密码。 常见问题 在 Windows Vista 系统之后不再存储 LM…

0203优先级下的调度问题_环_拓扑排序-有向图-数据结构和算法(Java)

1 概述 在和有向图相关的实际应用中&#xff0c;有向环特别的重要。在实际应用中&#xff0c;一般只会重点关注其中的一小部分&#xff0c;或者只想知道它们是否存在。 2 调度问题 一种应用广泛的模型是给定一组任务并安排它们的执行顺序&#xff0c;限制条件是这些任务的执…

机器学习:逻辑回归模型算法原理(附案例实战)

机器学习&#xff1a;逻辑回归模型算法原理 作者&#xff1a;i阿极 作者简介&#xff1a;Python领域新星作者、多项比赛获奖者&#xff1a;博主个人首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x1f44d;收藏&#…

Github学生包申请秒过经验并使用Copilot

写在前面 前提是在校学生&#xff0c;且有学校邮箱&#xff0c;当然你也得有Github账户前往学信网下载 教育部学籍在线验证报告将报告转换成英文版本&#xff0c;我用的是手机夸克自带的拍照翻译功能 具体流程 设置Github个人信息 来到 https://github.com/settings/profil…

如何用Postman做接口自动化测试?没有比这个更详细的了

目录 前言 什么是自动化测试 自动化测试有哪些分类 为什么需要自动化测试 Postman自动化测试演示 1.新建集合 2.新建接口 3.填写自动化测试脚本 4.录入所有接口 5.执行自动化测试 前言 什么是自动化测试 把人对软件的测试行为转化为由机器执行测试行为的一种实践。 …