
事实上,一些简单的传感器模块使用相同的电路,如光敏模块、热敏模块和红外接收管,使用图2中的电路,即电路中的变化N如果将热敏电阻放置在1的属性中N在位置上,可以形成热敏模块。
引脚及器件说明
VCC:电源正极 3.3V—5V
GND:电源负极
DO(Digital Output):数字输出接口
AO(Analog Output):模拟量输出接口
LED1.电源指示灯
LED2:数字输出指示灯
LM393:作为电压比较器
R2.电位器(用于调节模块的灵敏度)
电路原理(以NTC以热敏模块为例)
一、模拟量输出原理
从图中可以看出,模拟输出口通过网络标签接收R1与热敏电阻中间,此时AO口的电压为
,当NTC热敏电阻(NTC是英文Negative Temperature Coefficient的缩写。其含义为负温度系数。随着温度的升高,升高而降低。)当温度升高时,其电阻值会降低,因此热敏电阻分的电压会降低,AO当热敏电阻的温度降低时,口腔的电压也会降低。AO口的电压会上升,赋值会上升VCC至GND之间变化。
下面给大家STM32下接受AO口模拟量代码
void AD_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //打开时钟 RCC_ADCCLKConfig(RCC_PCLK2_Div6); //ADC分频器(CLOCK信号),72MHz/6=12MHz GPIO_InitTypeDef GPIO_InitStruture; GPIO_InitStruture.GPIO_Mode = GPIO_Mode_AIN; GPIO_InitStruture.GPIO_Pin = GPIO_Pin_0; GPIO_InitStruture.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStruture); ///配置模拟数据输入通道 ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); //配置多路开关 ADC_InitTypeDef ADC_InitStruture; ADC_InitStruture.ADC_Mode = ADC_Mode_Independent; //模数转换模式,ADC_Mode_Independent(独立模式):ADC1与ADC2互不干扰 ADC_InitStruture.ADC_DataAlign = ADC_DataAlign_Right; ///数据对齐 ADC_InitStruture.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ///触发源选择,ADC_ExternalTrigConv_None(内部软件触发) ADC_InitStruture.ADC_ContinuousConvMode = DISABLE; //选择连续转换模式,DISABLE(单次转换) ADC_InitStruture.ADC_ScanConvMode = DISABLE; //选择扫描模式,DISABLE(非扫描模式) ADC_InitStruture.ADC_NbrOfChannel = 1; //需要几个通道,非扫描模式只有一个有效,此时此参数无效 ADC_Init(ADC1,&ADC_InitStruture); ADC_Cmd(ADC1,ENABLE); ///开关控制 ADC_ResetCalibration(ADC1); while((ADC_GetResetCalibrationStatus(ADC1)) == SET); ///复位校准 ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1) == SET); //开始校准 } uint16_t AD_GetValue(void) { ADC_SoftwareStartConvCmd(ADC1, ENABLE); ///软件触发 while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); //检测标志位 return ADC_GetConversionValue(ADC1); //AD转换后获得的值为0-4096 }
只要不断调用uint16_t AD_GetValue(void)函数,可以接受AO口的模拟值,但该函数返回的值为整数,其值变化范围为0-4096,如果返回为0,则表示AO如果是4096,电压为0AO的电压为VCC,所以要准确得到AO还需要增加电压。
ADValue = AD_GetValue(); Voltage = (float)ADValue / 4095 * VCC; //VCC需自己定义
此时Voltage就为AO模拟口腔的电压值。
2、数字量输出原理
先介绍一下电压比较器的工作的工作过程LM当393电压比较器时,如果阳极电压大于阴极电压,则输出将使高电平,如果阴极电压大于阳极电压,则输出低电平。
由图2可知,DO是LM其阳极连接到393电压比较器的输出端R1电阻与N在电阻之间,进行比较电压,阴极接到电位器,进行校准电压,因此当阳极电压大于校准电压时,LM393电压比较器DO端口输出高电位,反之亦然DO口本通过电阻连接VCC,所以DO口默认输出高电位,只有当比较电压低于校准电压时,DO此时口才输出低压,LED2灯发光。
灵敏度调节:通过灵敏度调节R当电位器端的电压调整较小时,即电压比较器的阴极电压调整较小时,NTC热敏电阻需要承受较高的温度,使阳极电压小于阴极电压,从而输出低电位。
下面给大家STM32下接受DO口数代码
void LightSensor_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //打开时钟 GPIO_InitTypeDef GPIO_InitStruture; GPIO_InitStruture.GPIO_Mode = GPIO_Mode_IPU; //上拉输入模式 GPIO_InitStruture.GPIO_Pin = GPIO_Pin_13; GPIO_InitStruture.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStruture); } uint8_t LightSensor_Get(void) { return GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13); ///读取端口电平 }
调用uint8_t LightSensor_Get(void)函数,返回端口值,高电位返回1,低电位返回0.
这里提醒一下,因为DO口默认为高电位,因此时设置IO上拉输入模式是拉输入模式。
如果你认为这篇文章对你有帮助,给你一点赞美。