一. 系统概述
本系统基于STM32单片机作为核心控制单元,利用两个L298N模块驱动四个电机。通过配备的显示屏,系统能够实时展示小车的速度、控制指令及其运动状态。用户可以通过不同的蓝牙指令来实现小车的前进、后退、左转、右转、加速和减速等功能。
二. 仿真概述
- 启动系统时,小车处于停止状态。此时,通过虚拟串口模拟蓝牙APP发送指令。连接成功后,虚拟串口助手会显示“ready”字样,表明已建立连接。以下是虚拟串口助手的界面:
- 当在虚拟串口助手中发送大写字符“A”时,小车将开始前进。
- 再次发送“A”后,小车将加速,每次发送指令速度增加1。
- 发送字符“B”将使小车减速,每次指令减速1。当速度减至负值时,小车将开始倒退,再继续减速则会加速倒退。
- 通过发送字符“C”可以使小车左转,而发送字符“D”则使小车右转。
- 发送字符“E”将使小车停车。
三.程序设计
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"
#include "Key.h"
#include "Motor.h"
#include "PWM.h"
int16_t Speed;
uint8_t RxData;
int main(void)
{
OLED_Init();
Serial_Init();
Motor_Init();
Key_Init();
PWM_Init();
OLED_ShowString(1, 1, "Speed:"); //1行1列显示字符串Speed:
OLED_ShowString(2, 1, "Cmd:0x");
OLED_ShowString(3, 1, "State:");
Serial_SendString("ready!");
while (1)
{
if (Serial_GetRxFlag() == 1) //检查串口接收数据的标志位
{
RxData = Serial_GetRxData(); //获取串口接收的数据
Serial_SendByte(RxData); //串口将收到的数据回传回去,用于测试
if (RxData =='A')
{
if (Speed < 20000)
{
Speed += 4000;
Motor_SetSpeed(Speed);
}
}
if (RxData == 'B')
{
if (Speed > -20000)
{
Speed -= 4000;
Motor_SetSpeed(Speed);
}
}
if (RxData =='C')
{
GPIO_SetBits(GPIOA, GPIO_Pin_5); //PA4置高电平
GPIO_ResetBits(GPIOA, GPIO_Pin_4); //PA5置低电平,设置方向为正转
GPIO_SetBits(GPIOA, GPIO_Pin_6); //PA4置高电平
GPIO_ResetBits(GPIOA, GPIO_Pin_7); //PA5置低电平,设置方向为正转
GPIO_SetBits(GPIOA, GPIO_Pin_12); //PA4置高电平
GPIO_ResetBits(GPIOA, GPIO_Pin_11); //PA5置低电平,设置方向为正转
GPIO_SetBits(GPIOA, GPIO_Pin_13); //PA4置高电平
GPIO_ResetBits(GPIOA, GPIO_Pin_14); //PA5置低电平,设置方向为正转
PWM_SetCompare3(Speed); //PWM设置为速度值
OLED_ShowString(3, 7, "left ");
}
if (RxData =='D')
{
GPIO_SetBits(GPIOA, GPIO_Pin_4); //PA4置高电平
GPIO_ResetBits(GPIOA, GPIO_Pin_5); //PA5置低电平,设置方向为正转
GPIO_SetBits(GPIOA, GPIO_Pin_7); //PA4置高电平
GPIO_ResetBits(GPIOA, GPIO_Pin_6); //PA5置低电平,设置方向为正转
GPIO_SetBits(GPIOA, GPIO_Pin_11); //PA4置高电平
GPIO_ResetBits(GPIOA, GPIO_Pin_12); //PA5置低电平,设置方向为正转
GPIO_SetBits(GPIOA, GPIO_Pin_14); //PA4置高电平
GPIO_ResetBits(GPIOA, GPIO_Pin_13); //PA5置低电平,设置方向为正转
PWM_SetCompare3(Speed); //PWM设置为速度值
OLED_ShowString(3, 7, "right");
}
if (RxData =='E')
{
Speed=0;
Motor_SetSpeed(Speed);
}
}
//Motor_SetSpeed(Speed); //设置直流电机的速度为速度变量
OLED_ShowHexNum(2, 7, RxData, 2);
OLED_ShowSignedNum(1, 7, Speed/4000, 1); //OLED显示速度变量
if(RxData !='D'&&RxData !='C'&&Speed>0)
{
OLED_ShowString(3, 7, "forw ");
}
if(RxData !='D'&&RxData !='C'&&Speed<0)
{
OLED_ShowString(3, 7, "back ");
}
if(RxData !='D'&&RxData !='C'&&Speed==0)
{
OLED_ShowString(3, 7, "stop ");
}
}
}
24-32f-62