文章目录
前言
这是我学习32的心理路程
我会尽量把内容写的仔细
对于一些简单模块的使用,我不打算深究其原理,我只要会用它就欧克。所以看见我的32博客的同志们请注意这一点。如果同志您觉得内容有改进的地方,那就请多多指教啦~~~本人一定认真听取。
一、光敏传感器引脚
我这里使用的光敏传感器是4针的。
AO | 模拟输出:光敏传感器将采集的光线变成一个连续的模拟信号从AO引脚输出 |
---|---|
DO | 数字输出:大于光线阈值,DO引脚输出1(高电平);反之输出0。关于光线阈值,应该是调节模块上面那个十字架旋钮 |
GND | 接地 |
VCC | 3·3v或者5v |
注意:这是我第一次使用这个模块,所以语言描述可能有bug。
3针的光敏传感器就好像没有DO引脚。其他的是一样的。
二、光敏传感器小实验1
1·读取DO引脚的高低电平来控制一个led的亮灭。
这个小实验很简单哈。
lightsensor.c
#include "stm32f10x.h" // Device header
#define LED_OFF() GPIO_SetBits(GPIOB, GPIO_Pin_1 )
#define LED_NO() GPIO_ResetBits(GPIOB, GPIO_Pin_1 )
/**
* @brief 光敏传感器DO引脚所连接32的PC14引脚的初始化,
PC14设置为输入模式,读取DO传过来的电平。
* @param 无
* @retval 无
*/
void Light_Sensor_GPIOinit(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitTypeDef Light_Sensor_GPIO_InitStruct;
Light_Sensor_GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU ;
Light_Sensor_GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14;
Light_Sensor_GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&Light_Sensor_GPIO_InitStruct);
}
/**
* @brief 光敏传感器所控制的led的初始化,这里我是自己外接的led
* @param 无
* @retval 无
*/
void Test_Sensor_LEDinit(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef Test_Sensor_LEDinit;
Test_Sensor_LEDinit.GPIO_Mode = GPIO_Mode_Out_PP ;
Test_Sensor_LEDinit.GPIO_Pin = GPIO_Pin_1;
Test_Sensor_LEDinit.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB,&Test_Sensor_LEDinit);
LED_OFF(); //high--->led off
}
/**
* @brief 功能函数,读取DO电平,来控制外接LED
* @param
* @retval
*/
void Sensor_Contral_LED(void)
{
//uint8_t value = 0;
if( GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_14) == 0 )
{
LED_OFF();
}
else
LED_NO();
}
main.c
#include "stm32f10x.h" // Device header
#include "lightsensor.h"
int main (void)
{
Light_Sensor_GPIOinit();
Test_Sensor_LEDinit();
while(1)
{
//GPIO_ResetBits(GPIOB, GPIO_Pin_1 );// 测试外接led单独能不能亮
Sensor_Contral_LED();
}
}
注意:lightsensor.h就是将lightsensor.c中的函数名复制一下就欧克了,这里就不多展示 了哈!
对于这个实验的总结:
开始测试外接led能不能单独亮的时候,led死活不亮,我还以为是引脚复用的毛病,但是我差了一下资料发现并不是这个问题,结果回去仔细看了一下引脚初始化才发现led要推挽输出(),以及引脚初始化结构体的问题。我麻了。后来修正后就成功点亮了,虽然这个问题是小小的不起眼的问题,至少还是需要总结一下,避免以后再犯~~~
2·这里提一下GPIO的工作模式
4种输出模式:
(1)推挽输出:使用推挽输出目的是增大电流,即提高输出引脚的驱动能力,提高电路负载能力。【驱动led】
(2)开漏输出:由于只有下拉MOS管没有上拉MOS管,所以开漏输出模式下,IO引脚只能输出低电平。如果要输出高电平,则需要外接上拉电阻。
(3)复用推挽,复用开漏输出:IO引脚做复用功能时,可以选则复用推挽或者复用开漏输出模式,在选择复用开漏输出模式时,需要外接上拉电阻。
4种输入模式:
(1)上拉输入模式:引脚内部有一个上拉电阻,通过开关连接到电源VDD,当IO引脚无输入信号时,默认输入高电平。【外接按键】
(2)下拉输入模式:与上拉输入模式相反。当IO引脚无输入信号时,默认输入低电平。
(3)浮空输入:引脚内部即不接上拉也不接下拉电阻。浮空输入模式下的引脚电平是不确定的,外部信号是上面电平,MCU引脚就输入什么电平。【USART,IIC等通信协议】
(4)模拟输入模式:引脚内部即不接上拉也不接下拉电阻。【A/D模拟输入实现对外部信号的采集】
3·这里提一下GPIO的输出速度
(1)输出速度并不是输出信号的的速度,而是IO口驱动电路的响应速度。“我简称为:反应能力”。
(2)32 的输出速度有3种: 2MHz, 10MHz, 50MHz,对应的就是低速反应能力,中速反应能力,高速反应能力。
当输出配置为高速时,噪声大,功耗高,电磁干扰强;当输出为低速时,噪声小,功耗低,电磁干扰弱。当输出较高频率的信号时,应该选用较高频率响应速度的驱动模块,否则容易出现信号失真现象。
一般常用的外设(例如led,蜂鸣器等)建议采用2MHz的输出速度,而作为IIC,SPI等复用功能的输出引脚时,尽量选择高响应速度,如10mhz,50hmz。
GPIO引脚做输入模式时,不需要配置引脚的输出速度。
三、光敏传感器小实验2
稍微提升一下小实验1的难度。
1·光敏传感器DO的高低电平变化来切换OLED的显示。
这里我就不贴OLED的代码了哈。
这个实验就是在实验1的lightsensor.c中加一个函数就行。
void SensorContral_LED_OLED