STM32 舵机+超声波避障

  • 一.直流电机
  • 二.L298N模块

寒假由于时间较长,自己就想做一个智能车玩玩,第一个做的是蓝牙小车,不过比较简单,我就不打算具体另开一个部分,到时候挑一些与避障小车不一样的部分说一下。我这个小车行走速度比较慢,还是存在一定瑕疵,线也比较凌乱,大体功能可以实现。
先贴小车的图片:

小车主要分为几个部分:
1.STM32F103RCT6,当然用来执行各种命令的,因为用的是学习板,占地比较大,以后有时间改成C8T6的核心板,这样占地小一些。
2.L298N电机驱动模块,主要用来驱动左右两个电机,这个模块下面介绍。
3.电池,这里我买的是一款航模电池 1800mah 20c 焊接好T插头的电池,输出的是12V电压
4.分电板,主要是把电池的12V分成一个12V和一个5V输出
5.舵机,用的是SG90模拟舵机,这个舵机是花费时间最多的,因为总和我想要的结果不太一样
6.超声波测距模块,用的是HC-SR04模块,具体使用我上一篇说过了
7.蓝牙模块,用的HC-05这个蓝牙模块主要是用在蓝牙小车,后来放在避障小车上用来输出前方障碍物数据
8.小车底盘+电机,这个在某宝上一搜就有,而且驱动方法都差不多。我这里用的是直流电机。还有步进电机,但是我没有采用

这一篇我主要来说一下怎样让小车跑起来,就是电机怎么动。
想让小车跑起来,最重要的就是电机,电机驱动主要是需要两个接口。

一.直流电机


这个是我用的小车电机的说明,其中我们想要驱动电机就是在“电机线-”和“电机线+”一个高电压一个低电压,就会实现电机的转动,这里高低电压的接法没有要求接法不同只是影响正反转而已。至于其他的与编码器相关的可以不用连线,这些是测量电机转速的。在电压一定的情况下,电流越大,相应的转速也应该越快。
正常用L298N模块可以驱动电机并达到很高的转速,我这里尝试了一下直接用单片机驱动,发现也可以使电机转起来但是速度相比较用模块来说要慢很多,我猜测应该和电流有很大关系。

二.L298N模块


这个就是L298N驱动模块的样子
其中前面三个端子 ,中间的接地,注意要与单片机共地,否则将无法正常驱动电机,左面的端子是+12V输入,用来给L298N模块供电,就是电源输出的+12V电压,右面的端子是+5V输出,注意不要把这5V当作输入,建议不要用这个5V做为单片机的供电端。
左右两边各有两个端子,分别是OUT1,OUT2和OUT3,OUT4,用来驱动两路电机,这里只需要把OUT与电机的的电机线连接到一起即可完成。
在前面三个端子旁边有四个排针,这四个排针是用来控制左右两边的OUT,这四个排针分别是IN1 IN2 IN3 IN4 ,排针左右两边有两个用跳帽盖上的排针,分别是ENA ENB目的是使能那四个IN。用跳帽连接默认是已经使能,拔下跳帽另外加信号就可以继续使用。

这是不同情况下的电机转动情况,后期可以用两种方法调节电机速度:
一.给EN使能,之后调节IN1 IN2 之间的电压差(通过调节PWM波占空比的方式实现)来控制速度。
二.是控制EN的电压也是通过条件PWM占空比来实现。我这里采用的就是这种方法。
这里我初始化四个IO口分别来控制四个IN端,来控制其正转反转。

void gpio_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);     //使能PA,PB端口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                 //PA.4 端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO口速度为50MHzGPIO_Init(GPIOA, &GPIO_InitStructure);                     //根据设定参数初始化GPIOA.4
// GPIO_SetBits(GPIOA,GPIO_Pin_4);                       //PA.4 输出高GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                //PA.5 端口配置, 推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure);                     //推挽输出 ,IO口速度为50MHz//GPIO_SetBits(GPIOA,GPIO_Pin_5);                         //PA.5 输出高GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;               //PB.10端口配置, 推挽输出GPIO_Init(GPIOB, &GPIO_InitStructure);                     //推挽输出 ,IO口速度为50MHzGPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;               //PB.11 端口配置, 推挽输出GPIO_Init(GPIOB, &GPIO_InitStructure);                    //推挽输出 ,IO口速度为50MHz}

这里我把几种电机转动情况来分类用函数来调用

void stop()
{PAout(4)=0;PAout(5)=0;PBout(10)=0;PBout(11)=0;//停止}void front(){PBout(10)=0;PBout(11)=1;//前进PAout(4)=0;PAout(5)=1;}void left(){PAout(4)=0;PAout(5)=1;PBout(10)=1;PBout(11)=0;//左转}void right()
{PAout(4)=1;PAout(5)=0;PBout(10)=0;PBout(11)=1;//右转}    void turnleft(){PAout(4)=0;PAout(5)=1;PBout(10)=0;PBout(11)=0;//一电机停止 左转}void turnright(){PAout(4)=0;PAout(5)=0;PBout(10)=0;PBout(11)=1;//一电机停止 右转}void back(){PAout(4)=1;PAout(5)=0;PBout(10)=1;PBout(11)=0;//后退}

这样就可以驱动轮胎转动,也就可以驱动小车任意方向运动。
下面是我设置了两路PWM波给两个EN信号,来控制电机速度,进而控制小车速度,我只用了普通的定时器来输出PWM波,没有用到高级定时器的刹车功能。
PWM1:

#include "pwm.h"//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM3_PWM4_Init(u16 arr,u16 psc)
{  GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;TIM_OCInitTypeDef  TIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);  //使能GPIO外设时钟使能//设置该引脚为复用输出功能,输出TIM3 CH4的PWM脉冲波形GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //TIM_CH4GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值  80KTIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高TIM_OC4Init(TIM3, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMxTIM_CtrlPWMOutputs(TIM3,ENABLE); //MOE 主输出使能 TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);  //CH4预装载使能    TIM_ARRPreloadConfig(TIM3, ENABLE); //使能TIMx在ARR上的预装载寄存器TIM_Cmd(TIM3, ENABLE);  //使能TIM3}

PWM2:

#include "pwm2.h"//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM3_PWM3_Init(u16 arr,u16 psc)
{  GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;TIM_OCInitTypeDef  TIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);  //使能GPIO外设时钟使能//设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //TIM_CH1GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值  80KTIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高TIM_OC3Init(TIM3, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMxTIM_CtrlPWMOutputs(TIM3,ENABLE); //MOE 主输出使能 TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);  //CH3预装载使能    TIM_ARRPreloadConfig(TIM3, ENABLE); //使能TIMx在ARR上的预装载寄存器TIM_Cmd(TIM3, ENABLE);  //使能TIM3

两路PWM控制占空比

     TIM_SetCompare3(TIM3,2400);//左轮电机转速TIM_SetCompare4(TIM3,2530);//右轮电机转速

控制占空比函数数值越大转速越慢,在实际中,会遇到小车两个轮转速不一样,这里我没有用算法来调整,我采用手动调整到大概可以走直线,硬件的缺陷用软件来弥补。

到现在就可以用单片机+L298N模块来驱动电机,可以实现小车的任意方向行驶啦
具体代码之后上传

STM32F103RCT6 实验代码之舵机+超声波避障小车(一)杂谈+电机+L298N相关推荐

  1. STM32F103RCT6 实验代码之舵机+超声波避障小车(三)蓝牙遥控

    STM32 蓝牙遥控 一.蓝牙简述 二.蓝牙遥控 一.蓝牙简述 我这次把小车的坑补上,这是小车的最后一个部分,蓝牙遥控.这个部分重点在于蓝牙,其实蓝牙可以相当于一个串口,用串口通信就可以进行手机与单片 ...

  2. stm32捕获占空比_基于STM32超声波避障小车

    不管是对于初学者还是对于一个玩过单片机的电子爱好者来说,或多或少都接触到过小车项目,今天给大家介绍的的一个项目基于STM32超声波避障小车.这也是我曾经的一个课设,在此开源分享给大家,全文5000多字 ...

  3. 利用52单片机制作的超声波避障小车(包含所有源码)

    做这个超声波避障小车的原因是因为单片机课程设计 一.硬件部分 1.电机驱动 电机驱动四个输入端IN1.IN2.IN3和IN4,四个输出端OUT1.OUT2.OUT3和OUT4,一个接地端GND,单片机 ...

  4. 基于51单片机的超声波避障小车设计(含Proteus仿真)

    超声波避障程序随处可见,基于51单片机的超声波避障小车也很成熟,但是完整的Proteus仿真并不容易找到开源资料. 这次主要给大家分享其Proteus仿真部分. 涉及到的模块有:超声波模块(hc-sr ...

  5. c语言超声波壁障源码,超声波避障小车源程序【精】

    电子制作空间收集的这套入门级小车(只是入门级的,仅供参考)希望诸位入门智能车的吧友有所帮助.可以实现避障.寻迹.测距.寻找静态物体.做这个项目的经验,可分为四步. 第1步:根据实际情况确定智能小车所需 ...

  6. 基于STM32三路超声波避障小车

    基于STM32的避障小车 最近几天的学习了STM32输入捕获输入捕获的相关知识,为了巩固自己学习的知识特意制作一辆有三个超声波组成的4轮避障小车来加深对输入捕获的理解. 1.输入捕获简介 输入捕获模式 ...

  7. 基于51单片机的超声波避障小车(HC-SR04,SG90舵机)

    + 一.HC-SR04超声波模块 二.SG90舵机 三.总程序编写 一.HC-SR04超声波模块 HC-SR04时序图 触发信号输入端(Trig)输入一个10微秒以上的高电平信号,超声发送口收到信号自 ...

  8. c语言超声波壁障源码,超声波避障小车源程序

    #include int motorL1=6; //左边轮子 int motorL2=5; int motorR1=9; //右边轮子 int motorR2=11; int ledL=7; //转弯 ...

  9. 51单片机小项目--超声波避障小车

    超声波模块 电路连接 超声波HCSR04模块有四个引脚,VCC,GND,TRIG和ECHO. VCC接5V即可. TRIG引脚负责发射超声波信号的信号引脚.这个引脚需要用超过10us的高电平来启动,所 ...

最新文章

  1. 一文带你了解Spring核心接口Ordered的实现及应用
  2. vue token 过期处理
  3. DDOS学习笔记(《破坏之王-DDOS攻击与防范深度剖析》)
  4. 基于javaweb(springboot+mybatis)网上酒类商城项目设计和实现以及文档报告
  5. Vue中$nextTick的理解
  6. 2015-01-11 在SQL2008创建一个数据库
  7. 福利 | 限时免费体验 Google 官方 Android 课程
  8. 视频教程-R语言基础实战-大数据
  9. java ic卡读写_使用Java驱动ACR122U对IC卡进行读写,总结
  10. gem5源码解读se.py以及simulate.py(一)
  11. Emacs中学习gdb调试
  12. 币圈投资必败的5种“韭菜”人格
  13. 坚定推动DDD落地的企业,70%代码效率翻倍了!
  14. 编程题——扑克牌大小
  15. DDos攻击之DNS Query Flood
  16. 2022Java后端开发面试题总结(社招+春招+秋招)
  17. R的一些常用函数【基于尚学堂的部分总结】
  18. [洛谷P2161] [SHOI2009]会场预约
  19. sketch android 切图,Sketch如何快速切图?三分钟教你掌握切图方案
  20. Android RIL

热门文章

  1. oracle ob12创建用户,Oracle 11g用户创建、授权和导入dmp文件
  2. oracle服务启动自动关闭,oracle启动服务时,启动之后又立即自动停止
  3. 基于51单片机的红外自动避障小车(lunwen+任务书+开题+文献综述+翻译及原文+避障程序)
  4. TraceView使用
  5. 标准bootstrap3 form表单美化
  6. 王兴:格局上输了,不管你多努力都不可能赢!
  7. 常见的数据库的配置文件
  8. 在Linux中查找文件系统类型的7种方法(ext2,ext3或ext4)
  9. 对于Dropship的认知
  10. 多无人机辅助移动边缘计算中的任务卸载和轨迹优化