STM32F103C8T6 小车测速和寻迹
时间: 2024-12-26 08:20:08 浏览: 10
### STM32F103C8T6 小车测速与寻迹功能实现
#### 测速功能原理
为了实现小车的速度测量,通常采用编码器或霍尔传感器检测轮子转数。通过定时器中断计算单位时间内脉冲数量,进而得出速度值[^2]。
```c
// 定义全局变量用于存储当前和上一次捕获的时间戳
uint32_t currentCapture, lastCapture;
float speed;
void TIM Capture_Compare_IRQHandler(void){
if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET){ // 检查是否发生捕捉事件
currentCapture = TIM_GetCapture1(TIM2); // 获取最新时间戳
if(lastCapture != 0){
uint32_t period = abs(currentCapture - lastCapture);
float frequency = SystemCoreClock / ((period * 2)); // 计算频率
// 假设每圈有 N 个脉冲,则可以得到实际线速度 v = πDf/N
const float wheel_diameter = 0.06; // 轮直径(m)
const int pulses_per_revolution = 20; // 编码器分辨率(每圈多少个脉冲)
speed = M_PI * wheel_diameter * frequency / pulses_per_revolution;
printf("Current Speed:%fm/s\n",speed);
}
lastCapture = currentCapture;
TIM_ClearITPendingBit(TIM2,TIM_IT_CC1); // 清除标志位
}
}
```
#### 寻迹功能介绍
对于循迹功能而言,一般会利用红外反射传感器阵列判断地面黑白边界位置变化情况。当遇到黑色线条时,由于黑颜色吸收光线能力强于白色背景,因此返回到接收端信号强度较弱;反之亦然。根据这些特性编写程序控制电机转动方向完成自动跟踪路径行驶任务[^3]。
```c
#define LEFT_LINE_SENSOR_PIN GPIO_Pin_0
#define RIGHT_LINE_SENSOR_PIN GPIO_Pin_1
bool IsOnBlackLine(GPIO_TypeDef* port,uint16_t pin){
return !(GPIO_ReadInputDataBit(port,pin));
}
int main(){
while(true){
bool leftSensorValue = IsOnBlackLine(GPIOA,LEFT_LINE_SENSOR_PIN);
bool rightSensorValue = IsOnBlackLine(GPIOB,RIGHT_LINE_SENSOR_PIN);
if(!leftSensorValue && !rightSensorValue){
MoveForward(); // 当两个感应器都处于白线上方时直行
}else if(leftSensorValue && !rightSensorValue){
TurnRight(); // 左边感应器位于黑线上则右转调整路线
}else if(!leftSensorValue && rightSensorValue){
TurnLeft(); // 右边感应器位于黑线上则左转调整路线
}else{
Stop(); // 如果两侧均探测到黑线说明已经偏离轨道停止并重新校准定位
}
Delay_ms(50); // 循环延时防止过度频繁查询影响性能
}
}
```
阅读全文