一、功能介绍
小车能够通过蓝牙来控制运行方向,同时它也能够循迹,循迹之后不用蓝牙控制就能够自己行走,当前方有障碍物时,它能够扭头,找到没有障碍物的方向然后再走。
二、硬件模块
1、stm32f103主控芯片
2、L298N驱动电机
若要对直流电机进行 PWM 调速,需设置 IN1 和 IN2,确定电机的转动方向, 然后对使能端输出 PWM 脉冲,即可实现调速。注意当使能信号为 0 时,电机处于自由停止状态;当使能信号为 1,且 IN1 和 IN2 为 00 或 11 时,电机处于制动状 态,阻止电机转动。
如果要控制小车的速度,则拔开L298N驱动电机的跳线帽,然后使能ENA和ENB引脚。
3、红外循迹模块
TCRT5000传感器的红外发射二极管不断发射红外线,当发射出的红外线没有被反射回来或被反射回来但强度不够大时,红外接收管一直处于关断状态,此时模块的输出端为高电平,指示二极管一直处于熄灭状态;被检测物体出现在检测范围内时,红外线被反射回来且强度足够大,红外接收管饱和,此时模块的输出端为低电平,指示二极管被点亮。
接口说明:
(1) VCC 外接3.3V-5V电压(可以直接与5v单片机和3.3v单片机相连)
(2) GND 外接GND
(3) OUT 小板数字量输出接口(0和1)
4、蓝牙模块
5、小车
三、代码介绍
复用pin6和pin8来使能L298N电机驱动的ENA和ENB引脚来控制速度
pwm.c
void pwm()
{
// 变量初始化
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_8; // 6和8引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 50HZ
GPIO_Init(GPIOB, &GPIO_InitStructure); // 初始化接口
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能定时器4时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB时钟
TIM_TimeBaseStructure.TIM_Period =99; //设置自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =71; //设置预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //脉冲宽度调制模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //
TIM_OCInitStructure.TIM_Pulse=0;
TIM_OC1Init(TIM4, &TIM_OCInitStructure);
TIM_OC3Init(TIM4, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4在CCR1上的预装载寄存器
TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4在CCR3上的预装载寄存器
TIM_Cmd(TIM4, ENABLE); //使能TIM4
}
// 前进
void front()
{
TIM_SetCompare1(TIM4,66);
TIM_SetCompare3(TIM4,66);
IN1 = 1;
IN2 = 0;
IN3 = 1;
IN4 = 0;
}
//后退
//IN1~IN4可根据L298N逻辑图来设置
void back()
{
TIM_SetCompare1(TIM4,66);
TIM_SetCompare3(TIM4,66);
IN1 = 0;
IN2 = 1;
IN3 = 0;
IN4 = 1;
}
//右转
void right()
{
TIM_SetCompare1(TIM4,0);
TIM_SetCompare3(TIM4,66);
IN1 = 1;
IN2 = 0;
IN3 = 0;
IN4 = 0;
}
//左转
void left()
{
TIM_SetCompare1(TIM4,66);
TIM_SetCompare3(TIM4,0);
IN1 = 0;
IN2 = 0;
IN3 = 1;
IN4 = 0;
}
//停下
void stop()
{
IN1 = 0;
IN2 = 0;
IN3 = 0;
IN4 = 0;
}
HC05.c
void USART1_IRQHandler(void) //串口中断服务函数
{
u8 Rec;
if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
{
Rec = USART_ReceiveData(USART1); //接收蓝牙传输过来的数据
switch(Rec)
{
case '1': //前进
void front();
break;
case '2': //后退
back();
break;
case '3': //右转
right();
break;
case '4': //左转
left();
break;
case '5': //停止
shop();
break;
default: //停止
shop();
break;
}
}
}
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/m0_58664533/article/details/136764878
|