红外寻迹原理以及GPIO的输入检测
一、红外寻迹原理
????采用YL-70 红外寻迹壁障模块,红外发射管(透明)发出红外光,如果红外光照在浅色平面,则红外光被反射,并且被红外接收管(黑色)接收,同时对应的输出接口输出低电平(0),红外主板上对应的LED灯也会点亮如果红外光照在深色平面,则红外光被吸收不会被反射,此时对应的输出接口输出高电平(1),对应的LED灯熄灭红外主板链接红外发射和接收管的位置处,有一个点位旋钮可以用来调节红外管的检测距离,顺时针增加检测距离,逆时针降低检测距离 小板原理图 主控板原理图 主板实物图
二、STM32 GPIO的输入检测
GPIO_ReadInputDataBit用来获取输入模式下的 GPIO引脚的电平状态
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef*GPIOx , uint16_t GPIO_Pin )
@GPIOx:指定要获取输入状态的引脚的GPIO分组
GPIOA ... GPIOI
@GPIO_Pin:指定要获取输入状态的引脚编号
GPIO_Pin_0 ... GPIO_Pin_15
返回值: 获取到高电平,则返回 1
获取到低电平,则返回 0
注意:链接红外的GPIO引脚是需要获取红外检测信号所以,该引脚应该配置为 输入模式,并且不需要上下拉电阻
工作任务
获取红外检测信号,完成小车红外寻迹
/*红外模式的 IN1链接在 PC11上,IN4链接在PB6上*/
#define IN1 GPIO_Pin_11
#define IN2 GPIO_Pin_6
/*初始化输入检测GPIO*/
void Input_init(void)
{
/*定义GPIO初始化结构体*/
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitTypeDef GPIO_InitStruct1;
/*1.使能GPIOC组GPIOB组时钟*/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
/*2.配置GPIO输入模式*/
GPIO_InitStruct.GPIO_Pin = IN1 ;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_InitStruct1.GPIO_Pin = IN2 ;
GPIO_InitStruct1.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStruct1.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct1.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStruct1.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStruct1);
/*3.默认复位*/
GPIO_ResetBits(GPIOC, IN1);
GPIO_ResetBits(GPIOB, IN2);
}
int main(void)
{
/*定义时钟*/
SysTick_Config(SystemCoreClock/1000);
/*初始化GPIO*/
control_init();
Input_init();
/*进入寻迹模式*/
while (1)
{
if(GPIO_ReadInputDataBit(GPIOC,IN1)==0&&GPIO_ReadInputDataBit(GPIOB,IN2)==0)
{
car_go();
}
else if(GPIO_ReadInputDataBit(GPIOC,IN1)==1&&GPIO_ReadInputDataBit(GPIOB,IN2)==0)
{
car_turn_left();
}
else if(GPIO_ReadInputDataBit(GPIOC,IN1)==0&&GPIO_ReadInputDataBit(GPIOB,IN2)==1)
{
car_turn_right();
}
else
{
car_stop();
}
}
|