写内容的目的:
在这两天学习
振动传感器点灯的实验时,对于GPIO为什么口腔输入模式选择下拉输入不太理解,搜索文章的内容很少,所以他们整理知识点,希望帮助你,或嵌入式小白色,如果文章有缺点或可以优化,请给予更多的建议。
解决的问题:
这边做的是一个通过震动传感器来点灯的实验,敲代码的时候是没有什么问题的,初始化使用到的外设GPIO接收振动传感器传输的电平,LED相应的变化。问题是设置振动传感器GPIO为什么选择时选择的输入模式是下拉输入?
振动传感器:
使用:振动时输出低电平,不振动时输出高电平。
本次实验使用的传感器模块是SW-18015P振动传感器通过红框内的振动传感器DO把电平发给我们STM32开发板对应IO口。当产品不振动时,振动开关断开,输入端输出高电平;振动时,振动开关立即导通,输出端输出低电平。
GPIO口初始化:
使用:这边直接调用库函数来进行GPIO口的配置
void Relay_Init(void) { GPIO_InitTypeDef shake_init; ///置结构体 /*使能 APB2 - PA端口时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA时钟 shake_init.GPIO_Mode = GPIO_Mode_IPD; ///输入类型下拉输入 shake_init.GPIO_Pin = GPIO_Pin_1; //引脚 PA.1 shake_init.GPIO_Speed = GPIO_Speed_10MHz; //频率为10MHz GPIO_Init(GPIOA, &shake_init); //初始化 }
在这里注意GPIO我们选择的下拉输入口模式。
读取引脚电平
while(1) { if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == 0) ///返回值高电平为1,低电平为0 { GPIO_ResetBits(GPIOC,GPIO_Pin_13); delay(1000); GPIO_SetBits(GPIOC,GPIO_Pin_13); } else { GPIO_SetBits(GPIOC,GPIO_Pin_13); } }
问题点:
振动传感器传输低电通常触发我们LED灯,应该是下降沿触发器,此时不设置为上拉输入,对吗?上拉输入将管脚拉到高电平作为引脚输入电压的默认值,但为什么实验使用下拉输入呢?
经过这两天的数据阅读和战友们的热情帮助,现将思路整理如下:
首先要知道有两种状态:初始化和有效瞬间:
- 初始化的时候,就是震动传感器在不震动时,输出高电平。
- 有效时刻,即当我们的振动传感器振动时,输出为低电平。
此外,在数字电路中,用逻辑电平表示电压:
逻辑电平分为高电平和低电平。这两种电平在电路中体现为有或无,没有中间值,与不同电路上的电压值不同。
- 高电平表示高电压状态,一般规定高电平为3.5~5V。
- 低电平表示低电压, 记为0,低电平为0~2.5V。
- 不定电压:高低电平之间的电压属于不定电压。在此电压下,设备将不稳定工作。例如,有时计算机启动后会出现异常现象,但重新启动后没有问题。这是因为数字电路有时无法识别故障,因为设备遇到此不定电压。
总结:
初始状态输入高电平,箭头标记的电阻点和VSS之间形成电位差,这个点的电平会变成外部高电平,所以单片机会得到高电平信号。
振动输入处于低电压状态,但由于瞬时产生,瞬时低电平和正常高电平将成为低于正常高电平的信号,因此电压值不一定在低电平范围内,也可能在低电平和高电平之间。此时,我们的下拉电阻起作用,立即降低电压,下拉电阻通常不在高电平范围内Vss拉动方向,进一步下拉电压,通过下拉电阻将不确定信号转换为低电平。此时,单片机可以获得一个确定的低电平信号,并读取0。