stm32八路灰度传感器pid循迹+tb6612驱动两个霍尔编码电机运转
时间: 2025-04-02 17:00:31 浏览: 317
### STM32控制八路灰度传感器并使用PID算法完成循迹功能
以下是实现STM32通过八路灰度传感器进行循迹,并利用TB6612驱动两台带霍尔编码器的电机运转的示例代码。
#### 主要模块说明
- **硬件初始化**: 使用STM32CubeMX配置GPIO、TIM定时器和PWM输出,用于控制TB6612芯片。
- **灰度传感器读取**: 利用ADC采集灰度传感器数据[^1]。
- **PID控制器**: 实现速度闭环控制,调整小车的速度偏差。
- **电机驱动**: TB6612作为H桥驱动电路,接收PWM信号调节电机转速。
---
#### 示例代码
```c
#include "main.h"
#include "adc.h"
#include "tim.h"
#define NUM_SENSORS 8 // 灰度传感器数量
#define KP 0.5 // PID比例系数
#define KI 0 // 积分系数 (可选)
#define KD 0.1 // 微分系数
// 定义全局变量
float error = 0; // 当前误差
float integral = 0; // 积分项
float derivative = 0; // 微分项
float last_error = 0; // 上一次误差
uint16_t sensor_values[NUM_SENSORS]; // 存储灰度传感器值
/**
* @brief 初始化函数
*/
void SystemInit(void) {
MX_GPIO_Init(); // GPIO初始化
MX_ADC1_Init(); // ADC初始化
MX_TIM2_Init(); // TIM2 PWM初始化
}
/**
* @brief 获取灰度传感器数值
*/
void ReadSensors(uint16_t* values) {
for(int i=0;i<NUM_SENSORS;i++) {
HAL_ADC_Start(&hadc1); // 启动ADC转换
HAL_ADC_PollForConversion(&hadc1, 100); // 等待转换结束
values[i] = HAL_ADC_GetValue(&hadc1); // 获取ADC值
}
}
/**
* @brief 计算目标位置偏移量
*/
int CalculateOffset(uint16_t* sensors) {
int sum = 0;
float weighted_sum = 0;
for(int i=0;i<NUM_SENSORS;i++) {
if(sensors[i] > 2000) { // 假设黑线对应高电平(具体阈值需调试)
sum += 1 << i; // 权重计算
weighted_sum += i * (sensors[i]); // 加权求和
}
}
return (weighted_sum / sum) - (NUM_SENSORS/2);
}
/**
* @brief PID控制器
*/
float ComputePID(float current_offset) {
error = current_offset;
integral += error;
derivative = error - last_error;
float output = KP * error + KI * integral + KD * derivative;
last_error = error;
return output;
}
/**
* @brief 调节电机速度
*/
void AdjustMotorSpeed(float correction_value) {
uint16_t pwm_left = 1000 + correction_value; // 左轮基础占空比+修正值
uint16_t pwm_right = 1000 - correction_value; // 右轮基础占空比-修正值
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, pwm_left); // 设置左轮PWM
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, pwm_right); // 设置右轮PWM
}
int main(void) {
SystemInit();
while(1) {
ReadSensors(sensor_values); // 读取灰度传感器数据
int offset = CalculateOffset(sensor_values); // 计算偏离中心的距离
float pid_output = ComputePID(offset); // 执行PID运算
AdjustMotorSpeed(pid_output); // 调整电机速度
HAL_Delay(50); // 延迟一定时间
}
}
```
---
### 功能解析
1. **灰度传感器读取**
- 使用`ReadSensors()`函数依次启动ADC通道采样,获取八个灰度传感器的数据。
2. **目标位置偏移量计算**
- `CalculateOffset()`函数通过对传感器权重加权平均来判断当前车辆相对于轨迹的位置偏差。
3. **PID控制器设计**
- PID参数(KP,KD)可根据实际情况微调。积分项(KI)通常设置较小或为零以防止过冲。
4. **电机速度调节**
- 根据PID输出的结果动态改变左右轮的PWM占空比,从而纠正行驶方向。
---
### 注意事项
- 编码器反馈可用于进一步优化速度控制精度[^2]。
- 如果未配备编码器,则可通过固定延时模拟短距离前进动作。
阅读全文
相关推荐

















