硬件: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蓝牙小车已完成,让你的小车跑起来吧!!!!!
下面是我制作蓝牙小车的照片