stm32写循迹小车代码
时间: 2025-06-18 16:46:36 浏览: 13
### STM32循迹小车代码实现
以下是基于STM32的红外循迹小车的核心代码实现示例。该代码主要涉及如何通过读取红外传感器的状态来控制小车前进、停止以及转弯等功能。
#### 主程序逻辑
主函数负责初始化硬件资源(如定时器、GPIO、UART等),并通过循环不断检测红外传感器状态,进而调用相应的运动控制函数。
```c
#include "stm32f1xx_hal.h"
// 定义全局变量
uint8_t sensor_status[4]; // 存储四个红外传感器的状态
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM2_Init(void);
/**
* @brief 初始化系统时钟和外设
*/
void setup() {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init(); // GPIO初始化
MX_TIM2_Init(); // 定时器TIM2初始化 (用于PWM输出)
}
/**
* @brief 控制小车向前移动
*/
void goForward() {
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1, 50); // 设置左轮占空比为50%
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, 50); // 设置右轮占空比为50%
}
/**
* @brief 控制小车向左转
*/
void turnLeft() {
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1, 15); // 减少左轮速度
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, 80); // 增加右轮速度
}
/**
* @brief 控制小车向右转
*/
void turnRight() {
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1, 80); // 增加左轮速度
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, 15); // 减少右轮速度
}
/**
* @brief 小车停止
*/
void stopCar() {
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1, 0); // 左轮停转
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, 0); // 右轮停转
}
/**
* @brief 获取红外传感器状态
*/
void readSensors(uint8_t* status) {
for(int i=0;i<4;i++) {
status[i] = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN(i)); // 假设传感器连接到PA0~PA3
}
}
int main(void) {
setup();
while (1) {
readSensors(sensor_status); // 读取传感器数据
if (sensor_status[0] && !sensor_status[1]) { // 如果左侧偏离轨道
turnLeft(); // 向左转
} else if (!sensor_status[0] && sensor_status[1]) { // 如果右侧偏离轨道
turnRight(); // 向右转
} else if (sensor_status[0] && sensor_status[1]) { // 如果两个传感器都在黑线上
goForward(); // 直线行驶
} else { // 其他情况
stopCar(); // 停止
}
HAL_Delay(10); // 添加延时防止频繁切换动作
}
}
```
以上代码实现了基本的小车循迹功能[^1]。其中,`readSensors()`函数用于获取红外传感器的状态;根据不同的传感器组合状态,分别调用了`turnLeft()`、`turnRight()`或`goForward()`函数完成相应操作。
对于更复杂的场景,还可以引入PID算法进一步提升轨迹跟踪精度[^3]。
---
阅读全文
相关推荐

















