STM32蓝牙遥控四驱小车

硬件:L298N电机驱动模块,蓝牙模块HC-05/06,4个减速电机,STM32F03C8T6最小系统板

相关代码

一、电机程序

Mortor.h

#ifndef __MOTOR_H
#define __MOTOR_H

void Motor_RF_Init(void);
void Motor_LF_Init(void);
void Motor_RB_Init(void);
void Motor_LB_Init(void);

void MotorRF_SetSpeed(int8_t Speed);
void MotorLF_SetSpeed(int8_t Speed);
void MotorRB_SetSpeed(int8_t Speed);
void MotorLB_SetSpeed(int8_t Speed);

#endif

Mortor.c
 

#include "stm32f10x.h"                  // Device header
#include "PWM.h"

void Motor_RF_Init(void)//右前A8,A9
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    
    PWM_Tim20_Init();
}
 
void Motor_LF_Init(void)//左前A10,11
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    
    PWM_Tim21_Init();
}

void Motor_RB_Init(void)//右后A2,3
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    
    PWM_Tim22_Init();
}

void Motor_LB_Init(void)//左后A4,5
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    
    PWM_Tim23_Init();
}

/***************************************************************************/

void MotorRF_SetSpeed(int8_t Speed)
{
    if(Speed>=0)
    {
        GPIO_SetBits(GPIOA,GPIO_Pin_8);       
        GPIO_ResetBits(GPIOA,GPIO_Pin_9);     
        PWM_SetCompare1(Speed);
    }
    else
    {
        GPIO_ResetBits(GPIOA,GPIO_Pin_8); 
        GPIO_SetBits(GPIOA,GPIO_Pin_9);       
        PWM_SetCompare1(-Speed);
    }
}

void MotorLF_SetSpeed(int8_t Speed)
{
    if(Speed>=0)
    {
        GPIO_SetBits(GPIOA,GPIO_Pin_10);       
        GPIO_ResetBits(GPIOA,GPIO_Pin_11);     
        PWM_SetCompare2(Speed);
    }
    else
    {
        GPIO_ResetBits(GPIOA,GPIO_Pin_10); 
        GPIO_SetBits(GPIOA,GPIO_Pin_11);       
        PWM_SetCompare2(-Speed);
    }
}

void MotorRB_SetSpeed(int8_t Speed)
{
    if(Speed>=0)
    {
        GPIO_SetBits(GPIOA,GPIO_Pin_2);       
        GPIO_ResetBits(GPIOA,GPIO_Pin_3);     
        PWM_SetCompare3(Speed);
    }
    else
    {
        GPIO_ResetBits(GPIOA,GPIO_Pin_2); 
        GPIO_SetBits(GPIOA,GPIO_Pin_3);       
        PWM_SetCompare3(-Speed);
    }
}

void MotorLB_SetSpeed(int8_t Speed)
{
    if(Speed>=0)
    {
        GPIO_SetBits(GPIOA,GPIO_Pin_4);       
        GPIO_ResetBits(GPIOA,GPIO_Pin_5);     
        PWM_SetCompare4(Speed);
    }
    else
    {
        GPIO_ResetBits(GPIOA,GPIO_Pin_4); 
        GPIO_SetBits(GPIOA,GPIO_Pin_5);       
        PWM_SetCompare4(-Speed);
    }
}

二、PWM输出

PWM.h

#ifndef __PWM_H
#define __PWM_H

void PWM_Tim20_Init(void);    //PWM初始化
void PWM_Tim21_Init(void);
void PWM_Tim22_Init(void);
void PWM_Tim23_Init(void);

void PWM_SetCompare1(uint16_t Compare);    //PWM设置占空比
void PWM_SetCompare2(uint16_t Compare);    
void PWM_SetCompare3(uint16_t Compare);    
void PWM_SetCompare4(uint16_t Compare);    

#endif

PWM.c

 #include "stm32f10x.h"                  // Device header

void PWM_Tim20_Init(void)
{

//配置外部时钟    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);     //打开APB1外设的定时器2的外部时钟
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);    //打开APB2外设的GPIOA的外部时钟
    
  
    //PWM_Tim20  A0
    GPIO_InitTypeDef GPIO_InitStructure;        //GPIO初始化的结构体类型 GPIO初始化的结构体的名称
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;       //模式设置为复用推挽输出  AF是复用的意思
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;     //电机用GPIOA的Pin0口       
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;     //GPIO速度为50MHz
    GPIO_Init(GPIOA,&GPIO_InitStructure);       //GPIO结构体初始化
    
    TIM_InternalClockConfig(TIM2);      //定时器2的内部时钟配置
    
//配置时间基准
    TIM_TimeBaseInitTypeDef TIM_TimeInitStructure;      //时基的初始化结构体类型 时基的初始化结构体名称
    TIM_TimeInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;       //时钟分割器
    TIM_TimeInitStructure.TIM_CounterMode=TIM_CounterMode_Up;         //计时器模式
    TIM_TimeInitStructure.TIM_Period=100-1;          //定时器周期 ARR
    TIM_TimeInitStructure.TIM_Prescaler=720-1;       //PSC 定时器的预分频系数 范围是0-65535
    TIM_TimeInitStructure.TIM_RepetitionCounter=0;       //高级定时器(TIM1,TIM8)才用
    TIM_TimeBaseInit(TIM2,&TIM_TimeInitStructure);      //时基的初始化


//配置输出比较(OC)
    TIM_OCInitTypeDef TIM_OCInitStructure;      //输出比较的初始化结构体类型 输出比较的初始化结构体名称
    TIM_OCStructInit(&TIM_OCInitStructure);
    TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;     //PWM模式1
    TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;     //输出的极性为高 说明他的极性不会翻转 不会对输出的极性进行改变
    TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;     //输出的状态为开
    TIM_OCInitStructure.TIM_Pulse= 0;     //Capture Compare Register CCR寄存器的值
    TIM_OC1Init(TIM2,&TIM_OCInitStructure);     
    
    TIM_Cmd(TIM2,ENABLE);       //TIM2使能,启动定时器 开启后可以输出PWM(脉冲宽度调制)输出在PA0口 
}

void PWM_Tim21_Init(void)
{
//配置外部时钟    A1
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);     //打开APB1外设的定时器2的外部时钟
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);    //打开APB2外设的GPIOA的外部时钟
    
	//PWM_Tim21  A1
    GPIO_InitTypeDef GPIO_InitStructure;        //GPIO初始化的结构体类型 GPIO初始化的结构体的名称
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;       //模式设置为复用推挽输出  AF是复用的意思
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;     //电机用GPIOA的Pin1口  
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;     //GPIO速度为50MHz
    GPIO_Init(GPIOA,&GPIO_InitStructure);       //GPIO结构体初始化
    
    TIM_InternalClockConfig(TIM2);      //定时器2的内部时钟配置
    
//配置时间基准
    TIM_TimeBaseInitTypeDef TIM_TimeInitStructure;      //时基的初始化结构体类型 时基的初始化结构体名称
    TIM_TimeInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;       //时钟分割器
    TIM_TimeInitStructure.TIM_CounterMode=TIM_CounterMode_Up;         //计时器模式
    TIM_TimeInitStructure.TIM_Period=100-1;          //定时器周期 ARR
    TIM_TimeInitStructure.TIM_Prescaler=720-1;       //PSC 定时器的预分频系数 范围是0-65535
    TIM_TimeInitStructure.TIM_RepetitionCounter=0;       //高级定时器(TIM1,TIM8)才用
    TIM_TimeBaseInit(TIM2,&TIM_TimeInitStructure);      //时基的初始化

//配置输出比较(OC)
    TIM_OCInitTypeDef TIM_OCInitStructure;      //输出比较的初始化结构体类型 输出比较的初始化结构体名称
    TIM_OCStructInit(&TIM_OCInitStructure);
    TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;     //PWM模式1
    TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;     //输出的极性为高 说明他的极性不会翻转 不会对输出的极性进行改变
    TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;     //输出的状态为开
    TIM_OCInitStructure.TIM_Pulse= 0;     //Capture Compare Register CCR寄存器的值
    TIM_OC2Init(TIM2,&TIM_OCInitStructure);     
    
    TIM_Cmd(TIM2,ENABLE);       //TIM2使能,启动定时器 开启后可以输出PWM(脉冲宽度调制)输出在PA0口 
}

void PWM_Tim22_Init(void)
{
//配置外部时钟    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);     //打开APB1外设的定时器2的外部时钟
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);    //打开APB2外设的GPIOA的外部时钟
    
	//PWM_Tim22 A6
    GPIO_InitTypeDef GPIO_InitStructure;        //GPIO初始化的结构体类型 GPIO初始化的结构体的名称
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;       //模式设置为复用推挽输出  AF是复用的意思
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;     //电机用GPIOA的Pin6口  
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;     //GPIO速度为50MHz
    GPIO_Init(GPIOA,&GPIO_InitStructure);       //GPIO结构体初始化
    
    TIM_InternalClockConfig(TIM3);      //定时器2的内部时钟配置
    
//配置时间基准
    TIM_TimeBaseInitTypeDef TIM_TimeInitStructure;      //时基的初始化结构体类型 时基的初始化结构体名称
    TIM_TimeInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;       //时钟分割器
    TIM_TimeInitStructure.TIM_CounterMode=TIM_CounterMode_Up;         //计时器模式
    TIM_TimeInitStructure.TIM_Period=100-1;          //定时器周期 ARR
    TIM_TimeInitStructure.TIM_Prescaler=720-1;       //PSC 定时器的预分频系数 范围是0-65535
    TIM_TimeInitStructure.TIM_RepetitionCounter=0;       //高级定时器(TIM1,TIM8)才用
    TIM_TimeBaseInit(TIM3,&TIM_TimeInitStructure);      //时基的初始化

//配置输出比较(OC)
    TIM_OCInitTypeDef TIM_OCInitStructure;      //输出比较的初始化结构体类型 输出比较的初始化结构体名称
    TIM_OCStructInit(&TIM_OCInitStructure);
    TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;     //PWM模式1
    TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;     //输出的极性为高 说明他的极性不会翻转 不会对输出的极性进行改变
    TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;     //输出的状态为开
    TIM_OCInitStructure.TIM_Pulse= 0;     //Capture Compare Register CCR寄存器的值
    TIM_OC1Init(TIM3,&TIM_OCInitStructure);     
    
    TIM_Cmd(TIM3,ENABLE);       //TIM2使能,启动定时器 开启后可以输出PWM(脉冲宽度调制)输出在PA0口 
}

void PWM_Tim23_Init(void)
{
//配置外部时钟    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);     //打开APB1外设的定时器2的外部时钟
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);    //打开APB2外设的GPIOA的外部时钟
    
	//PWM_Tim23 A7
    GPIO_InitTypeDef GPIO_InitStructure;        //GPIO初始化的结构体类型 GPIO初始化的结构体的名称
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;       //模式设置为复用推挽输出  AF是复用的意思
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;     //电机用GPIOA的Pin0口  
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;     //GPIO速度为50MHz
    GPIO_Init(GPIOA,&GPIO_InitStructure);       //GPIO结构体初始化
    
    TIM_InternalClockConfig(TIM3);      //定时器2的内部时钟配置
    
//配置时间基准
    TIM_TimeBaseInitTypeDef TIM_TimeInitStructure;      //时基的初始化结构体类型 时基的初始化结构体名称
    TIM_TimeInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;       //时钟分割器
    TIM_TimeInitStructure.TIM_CounterMode=TIM_CounterMode_Up;         //计时器模式
    TIM_TimeInitStructure.TIM_Period=100-1;          //定时器周期 ARR
    TIM_TimeInitStructure.TIM_Prescaler=720-1;       //PSC 定时器的预分频系数 范围是0-65535
    TIM_TimeInitStructure.TIM_RepetitionCounter=0;       //高级定时器(TIM1,TIM8)才用
    TIM_TimeBaseInit(TIM3,&TIM_TimeInitStructure);      //时基的初始化

//配置输出比较(OC)
    TIM_OCInitTypeDef TIM_OCInitStructure;      //输出比较的初始化结构体类型 输出比较的初始化结构体名称
    TIM_OCStructInit(&TIM_OCInitStructure);
    TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;     //PWM模式1
    TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;     //输出的极性为高 说明他的极性不会翻转 不会对输出的极性进行改变
    TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;     //输出的状态为开
    TIM_OCInitStructure.TIM_Pulse= 0;     //Capture Compare Register CCR寄存器的值
    TIM_OC2Init(TIM3,&TIM_OCInitStructure);     
    
    TIM_Cmd(TIM3,ENABLE);       //TIM2使能,启动定时器 开启后可以输出PWM(脉冲宽度调制)输出在PA0口 
}

/*
电机占空比计算
PWM的频率:Freq=CK_PSC/(PSC+1)/(ARR+1)
PWM的占空比:Duty=CCR/(ARR+1)
PWM的分辨率:Reso=1/(ARR+1)

eg:
Question 1 如果频率为1KHz 占空比为50% 分辨率为1%的波形 已知CK_PSC=72M
Answer   1 ARR=99=100-1
           CCR=50
           1K=72M/PSC+1/100 PSC+=720 PSC=720-1
最终ARR=100-1  CCR=50  PSC=720-1

*********************************************************************************

舵机占空比计算
PWM的频率:Freq=CK_PSC/(PSC+1)/(ARR+1)
PWM的占空比:Duty=CCR/(ARR+1)
PWM的分辨率:Reso=1/(ARR+1)

eg:
舵机的周期为20ms  频率就是1/20ms=50Hz  (PSC+1)=72  (ARR+1)=20K

分辨率为1/20K=1/20000  占空比为 CCR/20k=CCR/20000  频率为72M/72/20K=50

CCR=500 ——> 0.5ms ——> 0°
CCR=1500 ——> 1.5ms ——> 90°
CCR=2500 ——> 2.5ms ——> 180°
*/

void PWM_SetCompare1(uint16_t Compare)
{
    TIM_SetCompare1(TIM2,Compare);
}

void PWM_SetCompare2(uint16_t Compare)      
{
    TIM_SetCompare2(TIM2,Compare);
}

void PWM_SetCompare3(uint16_t Compare)      
{
    TIM_SetCompare1(TIM3,Compare);    
}

void PWM_SetCompare4(uint16_t Compare)
{
    TIM_SetCompare2(TIM3,Compare);
}






三、小车运动代码

Car.h

#ifndef __CAR_H
#define __CAR_H



void Go(int8_t Speed);
void Back(int8_t Speed);
void Stop(void);
void Left(int8_t Speed);
void Right(int8_t Speed);

#endif

Car.c

#include "stm32f10x.h"                  // Device header
#include "Motor.h"
#include "PWM.h"

void Go(int8_t Speed)//前进
{
    MotorRF_SetSpeed(Speed);
    MotorLF_SetSpeed(Speed);
    MotorRB_SetSpeed(Speed);
    MotorLB_SetSpeed(Speed);
}

void Back(int8_t Speed)//后退
{
    MotorRF_SetSpeed(-Speed);
    MotorLF_SetSpeed(-Speed);
    MotorRB_SetSpeed(-Speed);
    MotorLB_SetSpeed(-Speed);
}

void Stop(void)//停止
{
    MotorRF_SetSpeed(0);
    MotorLF_SetSpeed(0);
    MotorRB_SetSpeed(0);
    MotorLB_SetSpeed(0);
}

void Left(int8_t Speed)//左转
{
    MotorRF_SetSpeed(Speed);
    MotorLF_SetSpeed(-Speed);
    MotorRB_SetSpeed(Speed);
    MotorLB_SetSpeed(-Speed);
}

void Right(int8_t Speed)//右转
{
    MotorRF_SetSpeed(-Speed);
    MotorLF_SetSpeed(Speed);
    MotorRB_SetSpeed(-Speed);
    MotorLB_SetSpeed(Speed);
}

四、蓝牙串口代码、

bsp_usart.h

#ifndef __BSP_USART_H
#define __BSP_USART_H
 
#include "stm32f10x.h"
 
/*TX的GPIO端口定义*/
#define USART3_GPIO_TX_PIN					 GPIO_Pin_10
#define USART3_GPIO_TX_PORT					 GPIOB
#define USART3_GPIO_TX_CLK					 RCC_APB2Periph_GPIOB
 
/*RX的GPIO端口定义*/
#define USART3_GPIO_RX_PIN					 GPIO_Pin_11
#define USART3_GPIO_RX_PORT					 GPIOB
#define USART3_GPIO_RX_CLK					 RCC_APB2Periph_GPIOB
 
/*USART3定义*/
#define DEBUG_USARTx_CLK						 RCC_APB1Periph_USART3
 
 
void USART3_Config(void);
void USART3_Prg(void);
 
 
#endif /*__BSP_USART_H*/

bsp_usart.c

#include "bsp_usart.h"
 
static void USART3_NVIC_Config(void)
{
	NVIC_InitTypeDef NVIC_InitStructure;
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
}

void USART3_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);   //使能GPIO时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);	//使能USART3时钟
	
	/*TX_GPIO*/
	GPIO_InitStructure.GPIO_Pin = USART3_GPIO_TX_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(USART3_GPIO_TX_PORT, &GPIO_InitStructure);
	
	/*RX_GPIO*/
	GPIO_InitStructure.GPIO_Pin = USART3_GPIO_RX_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(USART3_GPIO_RX_PORT, &GPIO_InitStructure);
	
	/*USART3*/
	USART_InitStructure.USART_BaudRate = 9600;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	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);
 
    USART3_NVIC_Config();  
	USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);   //使能串口接收终断
	USART_Cmd(USART3, ENABLE);  //使能串口
}

五、蓝牙控制小车

Car_crtl.h

#ifndef __CAR_CTRL_H
#define __CAR_CTRL_H
 
#include "stm32f10x.h"
 
void RUN_Prg(void);
 
#endif 

Car_crtl.c

#include "car_ctrl.h"
#include "bsp_usart.h"
#include "Motor.h"
#include "Car.h"
#include "Delay.h"


extern uint8_t rx_end;
extern uint8_t rx_data;
 
void RUN_Prg(void)
	
{
        if(rx_end)
        {
		rx_end = 0;
		if(rx_data == 'U')  		//前进     
			Go(100);		
		}
		else if(rx_data == 'L')    //左转  
		{
			Left(100);
		}		
		else if(rx_data == 'R')    //右转  
		{
				Right(100);
		}
		else if(rx_data == 'D')    //后退  
		{
			Back(100);		
		}
    else if(rx_data == 'S' )
		{
			Stop();		
		}

六、主函数

#include "stm32f10x.h"                  // Device header
#include "Motor.h"
#include "PWM.h"
#include "Car.h"
#include "Delay.h"
#include "bsp_usart.h"
#include "car_ctrl.h"


uint8_t rx_data;
uint32_t rx_end;

void USART3_IRQHandler(void)
{	
	if(USART_GetITStatus(USART3,USART_IT_RXNE) != RESET)
	{
		rx_data = USART_ReceiveData(USART3);   //接收到的数据放入rx_data
		rx_end = 1;
	}
	USART_ClearITPendingBit(USART3,USART_IT_RXNE);   //清除中断待处理位
}



 int main(void)
{
	//OLED_Init();
	//OLED_I2C_Init();
	USART3_Config();       //初始化蓝牙模块的串口

		//Servo_Init();0.
    Motor_RF_Init();    //右前电机初始化
    Motor_LF_Init();    //左前电机初始化
    Motor_RB_Init();    //右后电机初始化
    Motor_LB_Init();    //左后电机初始化
	  PWM_Tim20_Init();   //PWM_Tim20初始化
	  PWM_Tim21_Init();   //PWM_Tim21初始化
	  PWM_Tim22_Init();   //PWM_Tim22初始化
	  PWM_Tim23_Init();   //PWM_Tim23初始化
    while(1)
    {
        RUN_Prg();
    }
}





到这里,32蓝牙小车已完成,让你的小车跑起来吧!!!!!

下面是我制作蓝牙小车的照片

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值