基于stm32的电脑鼠走迷宫设计
时间: 2023-05-25 11:04:16 浏览: 507
基于STM32的迷宫电脑鼠控制系统设计与实现.zip
5星 · 资源好评率100%
本设计基于STM32单片机,使用红外线传感器和PWM电机驱动模块,实现电脑鼠走迷宫功能。
1. 硬件连接
首先,将红外线传感器与STM32单片机连接,将输出口连接到单片机的GPIO口;将PWM电机驱动模块与STM32单片机连接,将电机控制口连接到单片机的GPIO口。
2. 程序设计
(1)初始化程序:设置GPIO口初始化状态,设置PWM电机控制口输出功率;
```
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
uint16_t PrescalerValue;
void TIM_Configuration(void)
{
TIM_TimeBaseStructure.TIM_Period = 999;
TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 500;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM2, ENABLE);
TIM_Cmd(TIM2, ENABLE);
}
void GPIO_Configuration(void)
{
/* GPIOA clock enable */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
/* Configure PA1, PA2, PA3, PA4 and PA5 in input mode */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* GPIOB clock enable */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
/* Configure PB10, PB11, PB13 and PB14 in output pushpull mode */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_13 | GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void PWM_Configuration(void)
{
/* TIM2 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/* Compute the prescaler value */
PrescalerValue = (uint16_t) (SystemCoreClock / 1000000) - 1;
TIM_Configuration();
}
void Initialize(void)
{
PWM_Configuration();
GPIO_Configuration();
}
```
(2)红外传感器检测程序:检测小车是否处在迷宫边缘,并将检测结果存储在数组中;
```
int IR_sensor(int x)
{
if (GPIO_ReadInputDataBit(GPIOA, x) == 1)
return 1;
else
return 0;
}
int check_IR(int *IR_data)
{
IR_data[0] = IR_sensor(GPIO_Pin_1); //LEFT
IR_data[1] = IR_sensor(GPIO_Pin_2); //FORWARD_LEFT
IR_data[2] = IR_sensor(GPIO_Pin_3); //FORWARD
IR_data[3] = IR_sensor(GPIO_Pin_4); //FORWARD_RIGHT
IR_data[4] = IR_sensor(GPIO_Pin_5); //RIGHT
//return the data
return IR_data[2];
}
```
(3)电机控制程序:根据传感器检测结果确定小车下一步行动,并控制电机驱动模块实现行动;
```
void Forward(int n)
{
GPIO_SetBits(GPIOB, GPIO_Pin_10);
GPIO_ResetBits(GPIOB, GPIO_Pin_11);
GPIO_SetBits(GPIOB, GPIO_Pin_13);
GPIO_ResetBits(GPIOB, GPIO_Pin_14);
TIM_SetCompare1(TIM2, 200);
delay_us(n);
Stop();
}
void Back(int n)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_10);
GPIO_SetBits(GPIOB, GPIO_Pin_11);
GPIO_ResetBits(GPIOB, GPIO_Pin_13);
GPIO_SetBits(GPIOB, GPIO_Pin_14);
TIM_SetCompare1(TIM2, 200);
delay_us(n);
Stop();
}
void Turn_Left(int n)
{
GPIO_SetBits(GPIOB, GPIO_Pin_10);
GPIO_ResetBits(GPIOB, GPIO_Pin_11);
GPIO_ResetBits(GPIOB, GPIO_Pin_13);
GPIO_SetBits(GPIOB, GPIO_Pin_14);
TIM_SetCompare1(TIM2, 100);
delay_us(n);
Stop();
}
void Turn_Right(int n)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_10);
GPIO_SetBits(GPIOB, GPIO_Pin_11);
GPIO_SetBits(GPIOB, GPIO_Pin_13);
GPIO_ResetBits(GPIOB, GPIO_Pin_14);
TIM_SetCompare1(TIM2, 100);
delay_us(n);
Stop();
}
void Stop(void)
{
GPIO_SetBits(GPIOB, GPIO_Pin_10);
GPIO_SetBits(GPIOB, GPIO_Pin_11);
GPIO_SetBits(GPIOB, GPIO_Pin_13);
GPIO_SetBits(GPIOB, GPIO_Pin_14);
TIM_SetCompare1(TIM2, 0);
}
void Go(int *IR_data)
{
if (IR_data[1] == 0 && IR_data[2] == 1 && IR_data[3] == 0)
Forward(50000);
else if (IR_data[1] == 0 && IR_data[2] == 0 && IR_data[3] == 1)
Forward(50000);
else if (IR_data[1] == 1 && IR_data[2] == 0 && IR_data[3] == 0)
Turn_Right(75000);
else if (IR_data[1] == 0 && IR_data[2] == 0 && IR_data[3] == 0)
Turn_Left(75000);
else
Back(100000);
}
```
(4)主程序:
通过调用红外传感器检测程序和电机控制程序,在不断遍历迷宫的过程中找出出口。
```
int main()
{
Initialize();
int IR_data[5];
int flag = 1;
while (flag)
{
check_IR(IR_data);
Go(IR_data);
if (IR_data[0] == 0 && IR_data[4] == 0 && IR_data[1] == 1 && IR_data[2] == 0 && IR_data[3] == 1)
flag = 0;
}
while (1)
{
}
}
```
以上程序为基于STM32的电脑鼠走迷宫设计的主要内容。
阅读全文