帮我写基于Stm32f103的寻迹小车项目设计说明书,并且包含核心模块代码,不少于3000字
时间: 2023-05-31 15:06:42 浏览: 60
一、 前言
寻迹小车是一种基于光电传感器的自动控制小车,它能够根据环境中的黑线和白线自动行驶。本项目基于Stm32f103芯片设计,通过搭载两个电机驱动模块和四个光电传感器,实现了寻迹小车的自动控制功能。
二、 硬件设计
1. 硬件连接
本设计采用了两个电机驱动模块,通过PWM信号控制电机的转速。同时,四个光电传感器采集环境中的反射光信号,检测出黑线和白线,从而实现寻迹小车的自动行驶。具体的硬件连接如下图所示:
![image-20210902104052210](https://cdn.jsdelivr.net/gh/wonderfulnp/figurebed/img/image-20210902104052210.png)
2. 光电传感器
本设计采用了四个光电传感器,分别连接在PA0~PA3引脚上。当传感器检测到黑线时输出低电平,检测到白线时输出高电平。通过检测四个传感器的输出信号,寻迹小车能够自动调整行驶方向,从而实现自动寻迹的功能。
3. 电机驱动模块
本设计采用了两个电机驱动模块,分别连接在PB0~PB3和PB6~PB7引脚上。电机驱动模块能够通过PWM信号控制电机的转速和方向,从而实现小车的前进、后退、左转和右转等功能。
三、 软件设计
1. 系统初始化
在系统初始化阶段,需要对时钟、GPIO、定时器等进行初始化,从而为后续的程序运行打下基础。
```c
void System_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_TimeBaseInitStructure.TIM_Period = 2000 - 1;
TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_OC3Init(TIM3, &TIM_OCInitStructure);
TIM_OC4Init(TIM3, &TIM_OCInitStructure);
TIM_Cmd(TIM3, ENABLE);
}
```
2. 寻迹算法
寻迹小车的行驶方向是由光电传感器检测出的黑线和白线来控制的。本设计采用了基于PD控制算法的寻迹方法,通过对传感器输出信号的处理,计算出电机的PWM占空比,从而控制小车的行驶方向。
```c
void Tracing_Control(void)
{
int left = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
int middle_left = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1);
int middle_right = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2);
int right = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3);
int error = 0;
int count = 0;
if (left == 0) {
error -= 3;
count++;
}
if (middle_left == 0) {
error -= 1;
count++;
}
if (middle_right == 0) {
error += 1;
count++;
}
if (right == 0) {
error += 3;
count++;
}
if (count == 0) {
return;
}
int deviation = error / count;
int left_speed = 800 - deviation * 50;
int right_speed = 800 + deviation * 50;
if (left_speed < 0) {
left_speed = 0;
}
if (left_speed > 2000) {
left_speed = 2000;
}
if (right_speed < 0) {
right_speed = 0;
}
if (right_speed > 2000) {
right_speed = 2000;
}
TIM_SetCompare1(TIM3, left_speed);
TIM_SetCompare2(TIM3, left_speed);
TIM_SetCompare3(TIM3, right_speed);
TIM_SetCompare4(TIM3, right_speed);
}
```
3. 主函数
在主函数中,首先进行系统初始化操作,然后进入循环中,不断调用寻迹算法,控制小车的行驶方向。
```c
int main(void)
{
System_Init();
while (1) {
Tracing_Control();
}
}
```
四、 总结
本设计通过采用Stm32f103芯片,搭载光电传感器和电机驱动模块,实现了基于PD控制算法的寻迹小车。通过对传感器输出信号的处理,计算出电机的PWM占空比,从而控制小车的行驶方向。该设计具有简单可靠、成本低廉的优点,适用于初学者的电子设计实践。