蓝牙小车(可调速版)

系列文章目录

一、小车1.0——基本蓝牙小车(仅蓝牙遥控小车运动方向,本篇)
二、小车2.0——蓝牙小车PLUS(可以蓝牙控制方向+蓝牙直接调节车速)
三、小车3.0——避障小车(超声波+舵机云台)
四、小车4.0——无线手柄方向感知操控小车(mpu6050+双蓝牙透传)
五、双轮自平衡小车(HAL库版)——点此学习吧


这篇文章将升级我以前制作的蓝牙遥控小车,将其升级至可以用蓝牙进行调速。


前言

这篇博客是基于上一篇《蓝牙小车(基于STM32/HAL库)》改写的,增加了一部分串口接收函数, 蓝牙变速程序的编写思路跟蓝牙遥控的原理如出一辙。

这篇文章主要讲解怎么用蓝牙改变小车的车速,我就不再赘述小车驱动方面的代码以及原理了,不是很了解的xd可以看看我写的系列文章,里面有详细讲解小车的接线、PWM调速、蓝牙模块的使用。

这里放上系列文章:
——>《蓝牙小车(基于STM32/HAL库)》


一、主要的程序思路

单片机接收并读取蓝牙发送来的数据包从而进行下一步动作,那么就可以给不同动作(例如:前进、转弯、加速、减速)设置不同的数据包,这样单片机如果接收到某个数据包,接下来就会执行该数据包对应的动作,从而完成用蓝牙对单片机进行调速。

二、在蓝牙APP中进行通信设置

2.1. 蓝牙发送数据包结构的设置

在这里插入图片描述


2.2. 编辑器件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


三、CubeMX中的设置

提示:这里仅给出了更改的TIM2的设置,其余的与系列文章《蓝牙小车(基于STM32/HAL库)》中的配置一致其实也就改动了预分频系数PSC以及计数周期ARR,预分频系数PSC越小,PWM调速越精准。

TIM2的设置(改动)

(1)点击TIM2,在Mode选项中设置Clock Source为Internal Clock。设置Channel1为PWM Generation CH1,其余默认即可。
在这里插入图片描述

(2)在Mode下面的Configuration选项中Parameter Settings的参数设置
在这里插入图片描述

(3)TIM2_CH1 的GPIO参数设置
在这里插入图片描述
在这里插入图片描述

四、 程序编写

提示:这里仅给出更改了的control.c、control.h以及main.c程序,其余的与系列文章《蓝牙小车(基于STM32/HAL库)》一致

control.h

#ifndef CONTROL_CONTROL_H_
#define CONTROL_CONTROL_H_

#include "stm32f1xx_hal.h" //HAL库文件声明
#include <main.h>
#include "../motor/motor.h"

void CAR_GO();                 //小车前进
void CAR_BACK();               //小车后退
void CAR_LGO();                //小车原地左拐
void CAR_RGO();                //小车原地右拐
void CAR_STOP();               //小车停止

#endif /* CONTROL_CONTROL_H_ */

control.c

#include"control.h"

   void CAR_GO()
	{
		L_MOTOR_GO();
		R_MOTOR_GO();
	}
	void CAR_BACK()
	{
		L_MOTOR_BACK();
		R_MOTOR_BACK();
	}
	void CAR_LGO()
	{
		L_MOTOR_BACK();
		R_MOTOR_GO();
	}
	void CAR_RGO()
	{
		L_MOTOR_GO();
		R_MOTOR_BACK();
	}
	void CAR_STOP()
	{
		L_MOTOR_STOP();
		R_MOTOR_STOP();
	}


main.c

/* USER CODE BEGIN Includes */
#include "../../icode/control/control.h"
#include "../../icode/usart/usart.h"
/* USER CODE END Includes */

  /* USER CODE BEGIN 2 */
  HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);   //直流电机PWM
  HAL_UART_Receive_IT(&huart2,(uint8_t *)&USART2_NewData,1); //开启启接收中断
  /* USER CODE END 2 */


  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
      if(USART2_RX_STA&0x8000)              //判断中断接收标志位(蓝牙模块使用USART2)
      {
    	 if((USART2_RX_STA&0x7FFF) ==4 	//判断接收数量是不是为四个
    			&& USART2_RX_BUF[0]==0xA5 	//判断接收第一个数据是不是包头0xA5
    			&& USART2_RX_BUF[3]==(USART2_RX_BUF[1]+USART2_RX_BUF[2])%0x100)	//判断接收校验码是不是原数据之和的低八位

    	{
    		 switch(USART2_RX_BUF[2])      //接收并读取蓝牙发送过来的第三个数,改变车速
    		 {   //TIM2计数周期ARR的值在CubeMX中设置为20000
    		     case(0x00):__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1,0);break;    //0%的速度

				 case(0x14):__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1,4000) ;break;//20%的速度

				 case(0x28):__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1,8000) ;break;//40%的速度

				 case(0x3C):__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1,12000);break;//60%的速度

				 case(0x50):__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1,16000);break;//80%的速度

				 case(0x64):__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1,20000);break;//100%的速度

				 default:break;

    		 }


    		 switch(USART2_RX_BUF[1])      //接收并读取蓝牙发送过来的第二个数,改变车的行驶状态
    		 {
				 case(0x00):CAR_STOP();break;
				 case(0x01):CAR_GO();break;
				 case(0x02):CAR_LGO();break;
				 case(0x03):CAR_RGO();break;
				 case(0x04):CAR_BACK();break;

				 default:break;

    		 }
    	 }
         USART2_RX_STA=0;//标志位清0,准备下次接收
      }

  }
  /* USER CODE END 3 */

五、main.c程序讲解

上面程序里面有很详细的注释,下面我来阐述核心思路。

查看单片机接收到的数据包成分

先用串口助手查看按下手机上蓝牙APP中的按键时,蓝牙向单片机发出的数据包成分
在这里插入图片描述
在这里插入图片描述
还是用switch–case语句,switch分别判断是数据包的第二个字节还是第三个字节数据,第二个字节数据可以改变小车的运动状态,第三个字节数据可以调节小车的车速,不同的值在case里会有其对应的意义。

总结

那么调速蓝牙遥控的功能基本就实现了,这样就不用每次想改速度时还去重新烧录。

欢迎大家积极交流,本文未经允许谢绝转载!!!

  • 20
    点赞
  • 110
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值