STM32模数转换原理及应用(火焰强度读取)

STM32模数转换

原理结构

  • 每个 ADC 有 12 位、10 位、8 位和 6 位可选,每个 ADC 有 16 个外部通道,还有内部通道,不同的芯片的ADC内部通道连接不相同,可以查看数据手册

  • 独立模式就是仅仅适用三个ADC的其中一个,双重模式就是同时使用ADC1和 ADC2,而三重模式就是三个 ADC 同时使用。

  • ADC结构如下:

    在这里插入图片描述

  • 电压输入范围:V REF- ≤ V IN ≤ V REF+ ,一般把 V SSA 和 V REF- 接地,把 V REF+ 和 V DDA 接 3V3,得到 ADC 的输
    入电压范围为:0~3.3V。

  • 外部的 16 个通道在转换的时候又分为规则通道和注入通道,其中规则通道最多有 16 路,注入通道最多有 4 路。

    • 注入通道和中断程序很像,当该通道有输入时,会先进行该通道的转换,之后再去对其他的通道进行操作
转换顺序
  • 规则顺序:

    • 在设置多个通道的转换时,可以通过规则序列寄存器来设置优先级,规则序列寄存器有 3 个,分别为 SQR3、SQR2、SQR1

    • 比如想让第16通道在第7个转换,则在SQR2的SQ7写入16

      在这里插入图片描述

  • 注入序列寄存器 JSQR 只有一个,最多支持 4 个通道,具体多少个由 JSQR 的 JL[1:0] 决定

  • 如果JL的值小于4的话,则JSQR跟SQR决定转换顺序的设置不一样,第一次转换的不是JSQR1[4:0],
    而是 JCQRx[4:0] ,x = (4-JL),跟 SQR 刚好相反。

  • 如果 JL=00(1 个转换),那么转换的顺序是从 JSQR4[4:0] 开始,而不是从 JSQR1[4:0] 开始,

    在这里插入图片描述

触发源
  • ADC 转换可以由 ADC 控制寄存器 2: ADC_CR2 的 ADON 这个位来控制,写 1 的时候开始转换,写 0 的时候停止转换
  • ADC 还支持外部事件触发转换,这个触发包括内部定时器触发和外部 IO 触发
  • 如果使能了外部触发事件,我们还可以通过设置 ADC 控制寄存器 2:ADC_CR2 的 EXTEN[1:0] 和JEXTEN[1:0] 来控制触发极性,可以有 4 种状态,分别是:禁止触发检测、上升沿检测、下降沿检测以及上升沿和下降沿均检测。
转换时间
  • ADC时钟:
    • ADC 输入时钟 ADC_CLK 由 PCLK2 经过分频产生,最大值是 36MHz,典型值为 30MHz,分频因子由 ADC 通用控制寄存器 ADC_CCR 的 ADCPRE[1:0] 设置
    • ADCADC 需要若干个 ADC_CLK 周期完成对输入的电压进行采样
    • 周期数可通过 ADC 采样时间寄存器 ADC_SMPR1 和 ADC_SMPR2 中的 SMP[2:0] 位设置,ADC_SMPR2 控制的是通道 0~9,
      ADC_SMPR1 控制的是通道 10~17
    • 每个通道可以分别用不同的时间采样。其中采样周期最小是3 个,即如果我们要达到最快的采样,那么应该设置采样周期为 3 个周期,这里说的周期就是1/ADC_CLK。
    • ADC 的总转换时间跟 ADC 的输入时钟和采样时间有关,公式为:
      Tconv = 采样时间 + 12 个周期
    • 一般我们设置 PCLK2=84MHz,经过 ADC 预分频器能分频到最大的时钟只能是 21M,采样周期设置为 3 个周期,算出最短的转换时间为 0.7142us
数据寄存器
  • 规则组的数据放在 ADC_DR 寄存器,注入组的数据放在 JDRx
  • ADC_DR和 JDRx都是32位寄存器,低16位有效,可以选择数据的对齐方式
  • 通道有很多,但对应的寄存器只有一个,因此当转换完成之后,应立刻将数据取出,可以使用DMA将数据传出去,如果不使用DMA就要使用 ADC 状态寄存器 ADC_SR 获取当前 ADC 转换的进度状态,进而进行程序控制
  • 如果是使用双重或者三重模式那规矩组的数据是存放在通用规矩寄存器 ADC_CDR
电压转换
  • 模拟电压经过 ADC 转换后,是一个 12 位的数字值

  • 如果ADC的电压范围是0~3.3V,ADC 是 12 位的,那么 12 位满量程对应的就是 3.3V,12 位满量程对应的数字值是:2^12。数值 0 对应的就是 0V,那么通过比例关系就可以计算出当前的电压值

  • 例如当前数值是X,外部电压为Y
    X 2 12 = Y 3.3 ; Y = 3.3 ∗ X 2 12 \frac{X}{2^{12}}= \frac{Y}{3.3} ; Y= \frac{3.3*X}{2^{12}} 212X=3.3Y;Y=2123.3X

    实际测试

  • 传感器为火焰强度传感器,通道stm32的AD转换将其输入的模拟信号转化为数字信号,并进行显示

  • 先在CubeMX中进行相关的配置

在这里插入图片描述

  • 主要程序如下:

    #include "Flame_Sensor.h"
    
    uint32_t Flame_Sensor_Get()
    {
    	HAL_ADC_Start(&hadc1);  //轮询转换开启
    	HAL_ADC_PollForConversion(&hadc1,10); //轮询转换
    	
    	return HAL_ADC_GetValue(&hadc1);
    }
    uint32_t temp_val=0;
    uint32_t Flame_Sensor_Get_Val(void)
    {
    	uint8_t t;
    	for(t=0;t<LSENS_READ_TIMES;t++)
    	{
    		temp_val+=Flame_Sensor_Get();	//读取ADC值
    		osDelay(5);
    	}
    	temp_val/=LSENS_READ_TIMES;//得到平均值 
    	if(temp_val>4000)temp_val=4000;
    	//HAL_ADC_Stop(&hadc1);
    	temp_val=(100-(temp_val/40));
    	return temp_val;
    }
    
    //主函数循环部分如下:
    for(;;)
      {
    		Flame_Sensor_Value=0;
    		Flame_Sensor_Value=Flame_Sensor_Get_Val();
    		sprintf(shuchu0,"Strength:%d",Flame_Sensor_Value);
    		for(m=0;shuchu0[m]!='\0';m++)
    		{
    			shuchu1[m]=shuchu0[m];
    		}
    		shuchu1[m]='\0';
    		OLED_CLS();
    		OLED_ShowStr(0,4,shuchu1,2);	
    }
    
  • 部分内容整理自野火

<think>好的,用户现在想了解火焰传感器的工作原理及相关的计算公式。根据之前的对话历史,用户之前询问了DHT11温湿度传感器的工作原理公式,现在转向火焰传感器,可能需要类似的结构,即工作原理和数学公式。 首先,我需要查阅用户提供的引用内容。引用[1]、[3]、[4]都提到了火焰传感器的相关信息,而引用[2]则是关于光电图像传感器的,可能相关性不大。用户提供的引用中,火焰传感器主要检测火焰的红外波长(760nm-1100nm),使用红外敏感元件,可能涉及光电效应或热效应。 用户的问题分为两部分:工作原理和相关公式。在之前的回答中,关于DHT11,我分成了湿度测量、温度测量、通信协议等部分,并给出了公式。对于火焰传感器,可能需要类似的结构:检测原理(如红外探测)、信号转换、输出处理等,以及涉及的公式,比如电阻变化、电压转换、ADC转换等。 引用[1]提到火焰传感器模块使用LM393比较器,有数字和模拟输出。数字输出通过电位器调节阈值,模拟输出则反映实时电压。引用[4]中的代码示例显示了如何通过ADC读取火焰强度,转换为百分比。这可能涉及将ADC值映射到火焰强度公式,比如temp_val=(100 - (temp_val/40))。 需要注意的是,火焰传感器可能基于不同的原理,如热释电效应、光电导效应等。根据引用内容,这里提到的火焰传感器对特定波长的红外光敏感,可能使用光电二极管或热敏电阻。例如,当火焰存在时,红外光被传感器接收,导致电阻变化,进而转换为电压信号。 在公式方面,可能需要涉及电阻与光强的关系,比如光电导效应中的R = f(光照强度),然后通过分压电路转换为电压。ADC转换公式将模拟电压转换为数字值,再进一步处理为火焰强度百分比。 此外,用户可能想知道如何校准或计算实际火焰强度,例如通过ADC值计算电压,再转换为对应的光强或距离。引用[4]中的代码显示读取ADC值后取平均,并映射到0-100的范围,这可能是一个线性转换公式。 需要验证这些公式的正确性,比如ADC的分辨率(如10位ADC对应0-1023),以及如何将ADC值转换为电压。例如,V = ADC_value * (V_ref / 4095)(假设12位ADC,但引用中的代码使用的是HAL库,可能需要确认具体配置)。然后,电压与火焰强度的关系可能通过实验数据拟合得出,或者使用线性比例。 另外,用户可能对灵敏度调节感兴趣,引用中提到电位器调节阈值,这可能涉及比较器的工作原理,如当输入电压超过阈值时,数字输出切换。这部分可能涉及电压比较器的公式,如V_threshold = V_ref * (R2 / (R1 + R2)),但需要根据具体电路分析。 总结:需要组织火焰传感器的工作原理,包括红外探测、信号转换(模拟和数字输出),以及相关的计算公式,如ADC转换、电压计算、强度映射等,并参考用户提供的代码示例中的处理方式。</think>### 火焰传感器工作原理及计算公式详解 --- #### 一、火焰传感器核心工作原理 火焰传感器主要通过检测火焰发出的**特定波长红外光**(760~1100 nm)实现探测[^1][^3],其工作原理可分为以下两个核心部分: --- ##### 1. **红外光敏感元件** - **敏感材料**:通常采用**热释电红外传感器(Pyroelectric Sensor)**或**光电二极管**,对火焰的红外辐射敏感。 - **物理机制**: - 火焰产生的红外光入射到敏感材料表面,引发材料内部**载流子浓度变化**(光电导效应)或**温度变化**(热释电效应)。 - 敏感材料的电阻值随红外光强度变化,满足公式: $$ R = R_0 \cdot e^{-k \cdot I} $$ 其中: - $R$ 为当前光照下的电阻值 - $R_0$ 为无光照时的基准电阻值 - $k$ 为材料灵敏度系数 - $I$ 为红外光强度(W/m²)[^3]。 --- ##### 2. **信号处理与输出** - **模拟输出(AO)**: 传感器通过分压电路将电阻变化转换为电压信号: $$ V_{\text{out}} = V_{\text{cc}} \cdot \frac{R}{R + R_{\text{fixed}}}} $$ 其中 $R_{\text{fixed}}$ 为固定电阻,$V_{\text{cc}}$ 为供电电压(3.3~5V)。 **ADC转换公式**(以STM32为例): $$ \text{ADC值} = \left\lfloor \frac{V_{\text{out}}}{V_{\text{ref}}} \cdot 2^{N} \right\rfloor $$ - $V_{\text{ref}}$ 为ADC参考电压(如3.3V) - $N$ 为ADC分辨率位数(如12位ADC对应 $N=12$,输出范围0~4095)[^4]。 - **数字输出(DO)**: 使用LM393比较器,当 $V_{\text{out}}$ 超过阈值电压 $V_{\text{th}}$ 时输出高电平(逻辑1),否则输出低电平(逻辑0): $$ V_{\text{th}} = V_{\text{cc}} \cdot \frac{R_{\text{pot}}}{R_{\text{pot}} + R_{\text{adj}}}} $$ 通过调节电位器 $R_{\text{adj}}$ 改变灵敏度[^1][^3]。 --- #### 二、火焰强度计算与标定公式 ##### 1. **ADC值到火焰强度的映射** 引用[4]代码示例中,通过以下步骤将ADC值转换为火焰强度百分比: ```c temp_val = (100 - (temp_val / 40)); // 假设ADC满量程为4000(对应3.3V) ``` **推导公式**: - 若ADC满量程为4000(实际由硬件决定),火焰强度与ADC值呈负相关: $$ \text{强度百分比} = 100\% - \left( \frac{\text{ADC值}}{\text{满量程值}} \times 100\% \right) $$ 实际代码中简化为: $$ \text{强度} = 100 - \frac{\text{ADC值}}{40} $$ (注:此公式需根据传感器实际响应特性校准)[^4]。 --- ##### 2. **距离与光强的关系** 火焰传感器检测距离 $d$ 与光强 $I$ 满足**平方反比定律**: $$ I = \frac{P}{4\pi d^2} $$ - $P$ 为火焰辐射功率(W) - 实际应用中,可通过实验标定 $d$ 与ADC值的对应关系。 --- #### 三、关键参数与误差修正 1. **性能指标** - **检测距离**:打火机火焰约80cm(可调)[^1][^3] - **视角**:60°[^1] - **响应时间**:<100ms(取决于电路设计) 2. **温度补偿公式** 环境温度 $T$ 可能影响灵敏度,修正公式为: $$ I_{\text{校正}} = I_{\text{测量}} \cdot \left( 1 + \alpha (T - T_0) \right) $$ - $\alpha$ 为温度系数(需查器件手册) - $T_0$ 为标定温度(通常25℃)[^3]。 --- #### 四、典型应用电路(STM32) ```c // 火焰强度读取代码(基于HAL库) uint32_t Flame_Sensor_Get_Val(void) { uint32_t adc_sum = 0; for(int t=0; t<10; t++) { // 采样10次取平均 HAL_ADC_Start(&hadc1); HAL_ADC_PollForConversion(&hadc1, 10); adc_sum += HAL_ADC_GetValue(&hadc1); osDelay(5); } uint32_t avg_adc = adc_sum / 10; if(avg_adc > 4000) avg_adc = 4000; // 限制最大值 return (100 - (avg_adc / 40)); // 转换为百分比 } ``` --- ### 相关问题 1. 如何通过实验标定火焰传感器的ADC值与实际距离的关系? 2. LM393比较器的迟滞特性如何影响数字输出的稳定性? 3. 火焰传感器在强环境光干扰下如何提高信噪比? 4. 热释电传感器与光电二极管火焰探测方案的优缺点对比? --- [^1]: 火焰传感器模块技术参数 : 火焰传感器光谱响应范围 [^4]: STM32 ADC转换代码示例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值