一、小车1.0——基本蓝牙小车(仅蓝牙遥控小车运动方向,本篇)
二、小车2.0——蓝牙小车PLUS(可以蓝牙控制方向+蓝牙直接调节车速)
三、小车3.0——避障小车(超声波+舵机云台)
四、小车4.0——无线手柄方向感知操控小车(mpu6050+双蓝牙透传)
五、双轮自平衡小车(HAL库版)——点此学习吧
这篇文章将升级我以前制作的蓝牙遥控小车,将其升级至可以用蓝牙进行调速。
这篇博客是基于上一篇《蓝牙小车(基于STM32/HAL库)》改写的,增加了一部分串口接收函数, 蓝牙变速程序的编写思路跟蓝牙遥控的原理如出一辙。
这篇文章主要讲解怎么用蓝牙改变小车的车速,我就不再赘述小车驱动方面的代码以及原理了,不是很了解的xd可以看看我写的系列文章,里面有详细讲解小车的接线、PWM调速、蓝牙模块的使用。
这里放上系列文章:
——>《蓝牙小车(基于STM32/HAL库)》
单片机接收并读取蓝牙发送来的数据包从而进行下一步动作,那么就可以给不同动作(例如:前进、转弯、加速、减速)设置不同的数据包,这样单片机如果接收到某个数据包,接下来就会执行该数据包对应的动作,从而完成用蓝牙对单片机进行调速。
提示:这里仅给出了更改的TIM2的设置,其余的与系列文章《蓝牙小车(基于STM32/HAL库)》中的配置一致
其实也就改动了预分频系数PSC以及计数周期ARR,预分频系数PSC越小,PWM调速越精准。
(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库)》一致
#ifndef CONTROL_CONTROL_H_
#define CONTROL_CONTROL_H_
#include "stm32f1xx_hal.h" //HAL库文件声明
#include
#include "../motor/motor.h"
void CAR_GO(); //小车前进
void CAR_BACK(); //小车后退
void CAR_LGO(); //小车原地左拐
void CAR_RGO(); //小车原地右拐
void CAR_STOP(); //小车停止
#endif /* CONTROL_CONTROL_H_ */
#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();
}
/* 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 */
上面程序里面有很详细的注释,下面我来阐述核心思路。
先用串口助手查看按下手机上蓝牙APP中的按键时,蓝牙向单片机发出的数据包成分
还是用switch–case语句,switch分别判断是数据包的第二个字节还是第三个字节数据,第二个字节数据可以改变小车的运动状态,第三个字节数据可以调节小车的车速,不同的值在case里会有其对应的意义。
那么调速蓝牙遥控的功能基本就实现了,这样就不用每次想改速度时还去重新烧录。
欢迎大家积极交流,本文未经允许谢绝转载!!!