提高红外循迹模块灵敏度——STM32循迹小车

       在调试过程中,发现红外循迹模块不容易识别黑色和白色。b7c6efff17844a549baba728f55564c6.png

 

        但是我们知道红外模块是发出光线,并检测反射光线判断反射物体的特征,所以红外模块可以通过检测到反射光的不同判断黑色和白色。白色反射的光更多,黑色反射的光少,所以白色相当于靠的近的物体,黑色相当于离得远的物体。

       我们用一个物体靠近红外模块的探测头,在某个距离a处,红外模块发出提示光表示检测到物体,而我们稍微远离一下物体,提示光并未关闭,直到距离b处,提示光熄灭表示探测到的物体消失。显而易见,检测阈值a<消失阈值b。我们相当于用检测阈值a检测白色!!!消失阈值b检测黑色!!!

       如果,我们不断调用检测阈值a,让它既检测黑色又检测白色呢?那样就可以大大提升检测灵敏度了!


       所以方案是让红外模块的供电引脚每隔5ms通断一次,相当于每10ms检测一次(也可以根据实际状况改变间隔),这样相当于每10ms刷新一次检测模块,检测阈值a发挥作用,而消失阈值b不发挥作用。

代码思路:

在调试时在main()中写一个

while(1){

   if(读取给vcc电平=0)

    {设置vcc为高电平 }

   else

    {设置vcc为低电平};

 延时5ms;

}

 

 

在使用时用TIM定时器中断,每隔5ms执行一次

 if(读取给vcc电平=0)

    {设置vcc为高电平 }

   else

    {设置vcc为低电平};

### 关于STM32循迹模块的程序实现使用STM32实现循迹功能,通常会结合红外传感器阵列或其他类型的追踪传感器来检测路径。以下是基于STM32循迹模块的一般实现方法及其示例代码。 #### 硬件配置 为了实现循迹功能,需要准备以下硬件组件: - STM32开发板(如STM32F103C8T6) - 红外线循迹传感器模块(多个传感器组成阵列) - 控制电机驱动芯片(如L298N) 将红外传感器的输出端口连接至STM32的GPIO输入引脚,并确保供电正常[^1]。 #### 软件设计思路 循迹的核心逻辑在于读取红外传感器的状态并据此调整电机的速度和方向。如果某个传感器检测到黑色轨迹,则对应侧的轮子减速或停止;反之则加速前进。 ##### 示例代码 下面是一个简单的循迹程序示例: ```c #include "stm32f1xx_hal.h" #define TRACK_SENSOR_LEFT GPIO_PIN_0 #define TRACK_SENSOR_RIGHT GPIO_PIN_1 #define MOTOR_ENABLE_GPIO GPIOA #define SENSOR_INPUT_GPIO GPIOB void SystemClock_Config(void); static void MX_GPIO_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); while (1) { uint8_t leftSensor = HAL_GPIO_ReadPin(SENSOR_INPUT_GPIO, TRACK_SENSOR_LEFT); // 左边传感器状态 uint8_t rightSensor = HAL_GPIO_ReadPin(SENSOR_INPUT_GPIO, TRACK_SENSOR_RIGHT); // 右边传感器状态 if (!leftSensor && !rightSensor) { // 两个传感器都在黑线上 HAL_GPIO_WritePin(MOTOR_ENABLE_GPIO, GPIO_PIN_5, GPIO_PIN_SET); // 前进 HAL_GPIO_WritePin(MOTOR_ENABLE_GPIO, GPIO_PIN_4, GPIO_PIN_RESET); } else if (!leftSensor && rightSensor) { // 左边在黑线上,右边不在 HAL_GPIO_WritePin(MOTOR_ENABLE_GPIO, GPIO_PIN_5, GPIO_PIN_RESET); // 向右转 HAL_GPIO_WritePin(MOTOR_ENABLE_GPIO, GPIO_PIN_4, GPIO_PIN_SET); } else if (leftSensor && !rightSensor) { // 右边在黑线上,左边不在 HAL_GPIO_WritePin(MOTOR_ENABLE_GPIO, GPIO_PIN_5, GPIO_PIN_SET); // 向左转 HAL_GPIO_WritePin(MOTOR_ENABLE_GPIO, GPIO_PIN_4, GPIO_PIN_RESET); } else { // 两个都不在线上 HAL_GPIO_WritePin(MOTOR_ENABLE_GPIO, GPIO_PIN_5, GPIO_PIN_RESET); // 停止 HAL_GPIO_WritePin(MOTOR_ENABLE_GPIO, GPIO_PIN_4, GPIO_PIN_RESET); } HAL_Delay(100); // 循环延 } } static void MX_GPIO_Init(void) { __HAL_RCC_GPIOA_CLK_ENABLE(); // 开启GPIOA钟 __HAL_RCC_GPIOB_CLK_ENABLE(); // 开启GPIOB钟 GPIO_InitTypeDef GPIO_InitStruct = {0}; // 初始化传感器输入引脚 GPIO_InitStruct.Pin = TRACK_SENSOR_LEFT | TRACK_SENSOR_RIGHT; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(SENSOR_INPUT_GPIO, &GPIO_InitStruct); // 初始化电机控制引脚 GPIO_InitStruct.Pin = GPIO_PIN_4 | GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(MOTOR_ENABLE_GPIO, &GPIO_InitStruct); } ``` 此代码实现了基本的双传感器循迹逻辑,可以根据实际情况扩展更多传感器以提高精度。 --- #### 数据处理优化 对于更复杂的场景,可以引入PID控制器调节速度差值,从而提升循迹稳定性。此外,还可以利用定器中断机制替代`HAL_Delay()`函数,使主循环运行效率更高[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值