STM32CubeMX之ADC采集烟雾值 |
您所在的位置:网站首页 › 看门狗2中真实建筑物是啥 › STM32CubeMX之ADC采集烟雾值 |
STM32CubeMX之ADC烟雾值
1.ADC简介
STM32中硬件本身自带ADC外设,ADC精度为12位。ADC是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。 ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。 模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。 ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生。 2.ADC主要特性 ● 12位分辨率 ● 转换结束、注入转换结束和发生模拟看门狗事件时产生中断 ● 单次和连续转换模式 ● 从通道0到通道n的自动扫描模式 ● 自校准 ● 带内嵌数据一致性的数据对齐 ● 采样间隔可以按通道分别编程 ● 规则转换和注入转换均有外部触发选项 ● 间断模式 ● 双重模式(带2个或以上ADC的器件) ● ADC转换时间: ─ STM32F103xx增强型产品:时钟为56MHz时为1 μs(时钟为72MHz为1.17μs) ─ STM32F101xx基本型产品:时钟为28MHz时为1 μs(时钟为36MHz为1.55μs) ─ STM32F102xxUSB型产品:时钟为48MHz时为1.2μs ─ STM32F105xx和STM32F107xx产品:时钟为56MHz时为1 μs(时钟为72MHz为1.17μs) ● ADC供电要求: 2.4V到3.6V ● ADC输入范围: VREF- ≤ VIN ≤ VREF+ 有16个多路通道。可以把转换组织成两组:规则组和注入组。在任意多个通道上以任意顺序进行的一系列转换构成成组转换。例如,可以如下顺序完成转换:通道3、通道8、通道2、通道2、通道0、通道2、通道2、通道15。 ● 规则组由多达16个转换组成。规则通道和它们的转换顺序在ADC_SQRx寄存器中选择。规则组中转换的总数应写入ADC_SQR1 寄存器的L[3:0]位中。 ● 注入组由多达4个转换组成。注入通道和它们的转换顺序在ADC_JSQR寄存器中选择。注入组里的转换总数目应写入ADC_JSQR寄存器的L[1:0]位中。 如果ADC_SQRx或ADC_JSQR寄存器在转换期间被更改,当前的转换被清除,一个新的启动脉冲将发送到ADC以转换新选择的组。 ADC转换支持单次转换模式和连续转换模式。转换过程中支持扫描模式和间断模式。 3.1 单次转换模式单次转换模式下, ADC只执行一次转换。该模式既可通过设置ADC_CR2寄存器的ADON位(只适用于规则通道)启动,也可通过外部触发启动(适用于规则通道或注入通道),这时CONT位为0。 3.2 连续转换模式 在连续转换模式中,当前面ADC转换一结束马上就启动另一次转换。此模式可通过外部触发启动或通过设置ADC_CR2寄存器上的ADON位启动,此时CONT位是1。 如下图所示, ADC在开始精确转换前需要一个稳定时间tSTAB。在开始ADC转换和14个时钟周期后, EOC标志被设置, 16位ADC数据寄存器包含转换的结果。 此模式用来扫描一组模拟通道。 扫描模式可通过设置ADC_CR1 寄存器的SCAN位来选择。一旦这个位被设置, ADC扫描所有被ADC_SQRX寄存器(对规则通道)或ADC_JSQR(对注入通道)选中的所有通道。在每个组的每个通道上执行单次转换。在每个转换结束时,同一组的下一个通道被自动转换。如果设置了CONT位,转换不会在选择组的最后一个通道上停止,而是再次从选择组的第一个通道继续转换。 如果设置了 DMA位,在每次EOC后, DMA控制器把规则组通道的转换数据传输到SRAM中。而注入通道转换的数据总是存储ADC_JDRx寄存器中。 3.4 间断模式STM32在配置过程有规则组转换和注入组转换两种方式。配置过程使用的寄存器则不一样,在间断模式下配置执行过程如下: 规则组此模式通过设置ADC_CR1 寄存器上的DISCEN位激活。它可以用来执行一个短序列的n次转换(nInstance==ADC1) { /* USER CODE BEGIN ADC1_MspInit 0 */ /* USER CODE END ADC1_MspInit 0 */ /* ADC1 clock enable */ __HAL_RCC_ADC1_CLK_ENABLE();//开启ADC时钟 __HAL_RCC_GPIOA_CLK_ENABLE();//开PA时钟 /**ADC1 GPIO Configuration PA0-WKUP ------> ADC1_IN0 */ GPIO_InitStruct.Pin = GPIO_PIN_0;//PA0 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;//模拟输入 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);//GPIO口配置 /* USER CODE BEGIN ADC1_MspInit 1 */ HAL_ADCEx_Calibration_Start(adcHandle);//启动并校准ADC /* USER CODE END ADC1_MspInit 1 */ } } 7.1 完成一次规则通道转换 u16 Get_Regular_Channelx(u16 ch) { ADC_ChannelConfTypeDef sConfig = {0}; sConfig.Channel=ch;//通道号 sConfig.SamplingTime=ADC_SAMPLETIME_239CYCLES_5;//采样周期 if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)//ADC通道初始化 { Error_Handler(); } HAL_ADC_Start(&hadc1);//开启ADC HAL_ADC_PollForConversion(&hadc1,20);//等待规则通道转换完成 return HAL_ADC_GetValue(&hadc1); } 主函数 初始化硬件,通过MQ2烟雾传感器采用烟雾值,设置烟雾报警阈值,超过范围通过蜂鸣器报警。 int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_TIM4_Init(); MX_USART1_UART_Init(); MX_ADC1_Init(); /* USER CODE BEGIN 2 */ u16 data; /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1)//轮询 { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ data=ADC1_Get_Regular_Chx(ADC_CHANNEL_0); printf("data=%d\r\n",data); if(data>=1000)//烟雾浓度超过1000,则报警 { HAL_GPIO_WritePin(BEEP_GPIO_Port,BEEP_Pin,GPIO_PIN_SET); } else HAL_GPIO_WritePin(BEEP_GPIO_Port,BEEP_Pin,GPIO_PIN_RESET); Delay_Ms(500); } /* USER CODE END 3 */ }示例工程:https://download.csdn.net/download/weixin_44453694/19092935 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |