目录

前言

一、所需材料

二、连接电路

三、具体代码

总结


前言

我相信看到这篇文章的人,一定对单片机有所了解。我猜测许多人都是看视频学习的吧,但是学习效率不高,总是处在一种似懂非懂的状态。我当初也是这种状态,后面意识到学单片机要多做项目,这样印象更加深刻,做项目也能检验自己的学习状态。下面介绍蓝牙遥控小车的制作,这个也是当初的第一个小项目。这个小项目主要用到了单片机定时器和串口。

一、所需材料

1、一块stm32f103c8t6最小系统开发板

2、一块HC05蓝牙模块

3、一块L298电机驱动模块

也可使用其他电机驱动,例如TB6612

4、一个带电机的车模

5、两节3.7v 18650电池和电池盒

可以用别的电池,电池最好是7.2V的。

6、AMS117 3.3V稳压芯片 (单片机是3.3v供电的,而电池电压是7.2V,因此不能直接将电池接单片机,需要稳压芯片将电压稳到3.3V)

6、杜邦线若干,焊接的一些设备

7、用手机做遥控器——蓝牙调试器

蓝牙调试器具体使用:https://blog.csdn.net/qq_53022278/article/details/120579388

二、连接电路

1、AMS1117稳压电路

2、下面是用到的单片机引脚

引脚 功能
PB6 PWM1
PB7 PWM2
PB8 PWM3
PB9 PWM4
PB10 UART3_TX
PB11 UATR3_RX

3、L298电机驱动真值表:

直流电机 旋转方式

IN1

(这里对应PB6)

IN2

(这里对应PB7)

IN3

(这里对应PB8)

IN4

(这里对应PB9)

电机A 正转(调速) 1/PWM 0    
 

反转(调速)

0 1/PWN    
  待机 0 0    
  刹车 1 1    
电机B 正转(调速)     1/PWN 0
  反转(调速)     0 1/PWM
  停止     0 0
  刹车     1 1

注:“1”代表高电平;“0”代表低电平;“PWM”代表脉宽调制,调节占空比改变转速。IN1,INT2控制直流电机A;IN3,IN4控制直流电机B;两路完全独立的。输入端INx有防共态导通功能,悬空时等效于低电平输入。

4、具体连接:

单片机引脚PB6、PB7、PB8、PB9分别连接L298N的IN1、IN2、IN3、IN4。这里使用的车模有四个电机,但是我们一个L298n只能控制两个电机,因此我们采用左侧两个电机并联用一个电机控制口来控制,右侧同理。所以左侧电机连接电机A控制口,右侧电机连接电机B控制口。HC05的引脚VCC、GND、TXD、RXD分别连接单片机5V、G、PB11、PB10引脚。稳压芯片稳出的电压直接连接单片机随便一个3.3v引脚给单片机供电。L298n供电直接连接电池

三、具体代码

1、串口初始化函数:

void uart_init(u32 bound){//GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;//RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);  //使 能USART1,GPIOA时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//USART3_TX   GPIOB.10GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB.10GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.10//USART3_RX    GPIOB.11初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PB11GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.11  //Usart3 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;       //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //IRQ通道使能NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器//USART 初始化设置USART_InitStructure.USART_BaudRate = bound;//串口波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬 件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;  //收发模式USART_Init(USART3, &USART_InitStructure); //初始化串口3USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启串口接受中断USART_Cmd(USART3, ENABLE);                    //使能串口3}

2、PWM初始化和电机控制函数

void motor_init(int arr,int psr)
{GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;TIM_OCInitTypeDef  TIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);    //定时器使能RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);  //GPIO 口使能GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9; //TIM4 CH1,CH2,CH3,CH4GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO//初始化  TIM4TIM_TimeBaseStructure.TIM_Period = arr; //设置下一个更新事件活动重装载值寄存器周期TIM_TimeBaseStructure.TIM_Prescaler =psr; //预分频值TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); ////初始化TIM3 Channel2 PWM模式TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉宽调制模式2TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出极性高TIM_OCInitStructure.TIM_Pulse=0;TIM_OC1Init(TIM4, &TIM_OCInitStructure);  //初始化外设TIM4 OC1TIM_OC2Init(TIM4, &TIM_OCInitStructure);  //初始化外设TIM4 OC2TIM_OC3Init(TIM4, &TIM_OCInitStructure);  //初始化外设TIM4 OC3TIM_OC4Init(TIM4, &TIM_OCInitStructure);  //初始化外设TIM4 OC4TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);  //使能TIM4 CCR2上的预装载值TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);  //使能TIM4 CCR2上的预装载值TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);  //使能TIM4 CCR2上的预装载值TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);  //使能TIM4 CCR2上的预装载值TIM_Cmd(TIM4, ENABLE);  //使能TIM4}void motor_use(int motor1,int motor2)
{//左边电机if(motor1>0){TIM_SetCompare1(TIM4,motor1);TIM_SetCompare2(TIM4,0);}else{TIM_SetCompare1(TIM4,0);TIM_SetCompare2(TIM4,-motor1);}//右边电机if(motor2>0){TIM_SetCompare3(TIM4,motor2);TIM_SetCompare4(TIM4,0);}else{TIM_SetCompare3(TIM4,0);TIM_SetCompare4(TIM4,-motor2);}}

3、串口中断和数据接收函数

具体的串口接收发送请我的以前的文章:

https://blog.csdn.net/qq_53022278/article/details/120579388

总结

以上就是蓝牙小车的内容,上面只是介绍了主要的电路连接方式和主要代码,若有不懂的可以向我私信。

实战小项目——基于STM32的蓝牙小车相关推荐

  1. 基于STM32的蓝牙小车(来自LLC团队)

    基于STM32的蓝牙小车(来自LLC团队) 引言 1.系统概述 1.1.设计任务 2 .方案设计与论证 2.1.芯片选择方案 2.2.系统概述: 2.3设计要求: 2.4系统总体设计思路 2.5.各功 ...

  2. 基于STM32的智能小车(一)

    ## 基于STM32的智能小车 在假期自学了STM32,一直想做一个智能小车,刚好这次有时间就在家自己制作了这个基于STM32的智能小车,小车基本功能包括循迹.壁障及手机蓝牙控制,本人是第一次制作小车 ...

  3. 【敬初学者】Python基础学完了,该怎么知道自己学的怎么样呢?十个经典实战小项目附源码

    前言 1.街霸游戏 1.1 KO街霸 程序完整源码 程序的输出界面 1.2 春丽VS巴洛克 参考源码 2.猜谜游戏 2.1简单的猜数字游戏 项目要求 参考源码 2.2 进阶的猜姓名游戏 项目要求 参考 ...

  4. 我用Python把抖音上的美女图片转字符画,期望的AI目标更进一步【机器学习算法实战小项目,k聚类算法图片转化字符画】

    大家好,我是辣条. 最近在学习算法,今天给大家带来一个机器学习实战小项目 项目效果展示 学习目标 1.cv2转换图片数据  2.numpy提取图片矩阵数据  3.k均值算法获取图片的分类 工具使用 开 ...

  5. 基于STM32的智能小车方案设计

    基于STM32的智能小车设计 前言 一.什么是STM32智能小车? 二.模块汇总 1.主控板(STM32F103ZE) 2.底板 3.电机 4.避障模块(超声波传感器,红外传感器) 5.寻迹模块(3路 ...

  6. 毕业设计 基于Stm32的蓝牙便携手环 - 物联网 单片机

    基于STM32的蓝牙手环 本次时基于STM32单片机的简易蓝牙手环 手指放在心率检测处,心率传感器就能实时的检测使用者的心率的变化,并在显示屏上进行显示: 通过DS18B20检测体温,体温数值也会在显 ...

  7. 基于STM32的智能小车--舵机云台设计

    基于STM32的智能小车 第一章 基于STM32的智能小车方案设计 第二章 基于STM32的智能小车–电机驱动设计 第三章 基于STM32的智能小车–循迹设计 第四章 基于STM32的智能小车–避障设 ...

  8. 基于STM32的智能小车--电机驱动设计

    基于STM32的智能小车 第一章 基于STM32的智能小车方案设计 基于STM32的智能小车--电机驱动设计 基于STM32的智能小车 前言 一.电机是什么? 二.常见电机分类 1.有刷电机 2.无刷 ...

  9. libhv tcp实战小项目

    libhv Tcp小项目实战 一.概述 1.包头 2.心跳 3.任务队列 二.包头 2字节 2字节 4字节 4字节 2字节 1字节 1字节 起始标志 版本号(N) Command(命令ID) 消息体长 ...

  10. SparkSQL实战小项目之热门商品top3

    SparkSQL实战小项目之热门商品top3 一.说明及需求分析 二.准备测试数据 三.思路分析 四.编码实现 五.验证结果 一.说明及需求分析 软件及环境: centos7 + hive-2.3.3 ...

最新文章

  1. Oracle定时执行存储过程
  2. 知识图谱基本概念工程落地常见问题
  3. evga x58服务器芯片组,为六核980X而生 EVGA发布X58 FTW3主板
  4. nginx+php-fpm动静分离
  5. 垃圾回收GC Roots
  6. MySQL查看数据库相关信息
  7. centos6.5 rpm安装mysql_CentOS6.5系统下RPM包安装MySQL5.6(转)
  8. Java框架体系架构的知识,轻松拿下offer
  9. Spark基础学习笔记02:Spark运行时架构
  10. ip变更 mysql无法启动_MySQL 重装MySQL后, mysql服务无法启动
  11. supervivi的一点秘密
  12. 《深度学习工程师》听课笔记,编程作业和课后练习
  13. python是什么类型的编程语言-Python是个什么语言?
  14. android电商组件化分配,android电商组件化设计(含源码):MVP+dagger+组件化
  15. 过程生产excel_通用Excel做销售订单动态展示板
  16. 基于STM32CUBE MX 的TM1640的使用例程
  17. WMS仓库管理系统与ERP仓储系统的区别与联系
  18. altium 网口差分走线长度_Altium Design 中差分走线的设置
  19. 【超融合】超融合“火不火”?
  20. 在线查看相机快门次数_我是亲民_新浪博客

热门文章

  1. linux常用操作命令总结
  2. octet和byte的差异
  3. C#获取电脑MAC地址(物理地址)的几种方法
  4. 从零开始之uboot、移植uboot2017.01(三、lowlevel_init)
  5. 微软输入法怎么打开软键盘?
  6. win7系统获得管理员取得所有权的方法【系统天地】
  7. c语言gets和puts的区别,C 语言 gets()和puts()
  8. 转载--自动化测试 (一) 12306火车票网站自动登录工具
  9. CityBuilder+DataV制作次世代3D城市大屏,一秒俘获甲方的心!
  10. VMware 配置局域网内访问