本帖最后由 jinglixixi 于 2025-8-12 15:30 编辑
#申请原创#
在厂家提供的例程中,有一个ADC转换多个通道进行采集的示例,它将ADC配置为单次转换模式,由SW进行触发。 在STM32设备上,ADC默认组被配置为3个转换通道,即1个外部输入通道和2个内部通道(分别是内部电压VrefInt和温度传感器)。DMA被配置为在RAM内存中以环形模式传输转换数据,数据大小为三个元素的数组(每个通道的转换数据数组地址)。 在每一秒是由ADC对扫描序列中的3个通道进行转换,每次转换开始时(启用不连续模式)进行。 若禁用不连续模式,则整个扫描序列将在一个转换开始时以突发方式转换。 每个序列的ADC转换数据由DMA传输到数组“uhADCxConvertedData”中存放。
1. 数据采集与波形绘制 为进行检测值得显示及波形绘制,采用LCD屏作为显示器件,其与开发板的连接关系为: CLK ---PA6 MOSI---PA7 DC ---PC7 CS ---PC9 RST---PC6
所使用的接口为CN5,见图1所示。 图1 显示屏所用接口
A/D数据采集的端口为通道4,引脚为PA1,可从CN8 的 A1或CN8 中引用。 图2 数据采集端口
实现多数据项采集与波形绘制的主程序为: - int main(void)
- {
- uint16_t i=1,k,sj,sp=0;
- uint32_t tmp_index;
- for (tmp_index = 0; tmp_index < ADC_CONVERTED_DATA_BUFFER_SIZE; tmp_index++)
- {
- uhADCxConvertedData[tmp_index] = VAR_CONVERTED_DATA_INIT_VALUE;
- }
- NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
- NVIC_SetPriority(SysTick_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),15, 0));
- SystemClock_Config();
- LCD_Init();
- init_lcd_st7735();
- Lcd_Clear(RED);
- LCD_ShowString(40,0,"U385 & ADC ",YELLOW ,RED,16,0);
- LCD_DrawLine(0,20,127,20,YELLOW);
- LCD_DrawLine(0,98,127,98,YELLOW);
- LCD_Fill(1,21,127,97,BLACK);
- LL_AHB1_GRP2_EnableClock(LL_AHB1_GRP2_PERIPH_PWR);
- LL_PWR_EnableVDDA();
- LL_PWR_EnableVDDIO2();
- MX_GPIO_Init();
- MX_ADC1_Init();
- MX_ICACHE_Init();
- ADC_Activate();
- while (1)
- {
- if ((LL_ADC_IsEnabled(ADC1) == 1) &&
- (LL_ADC_IsDisableOngoing(ADC1) == 0) &&
- (LL_ADC_REG_IsConversionOngoing(ADC1) == 0) )
- {
- LL_ADC_REG_StartConversion(ADC1);
- }
- else
- {
- Error_Handler();
- }
- LED_On();
- LL_mDelay(LED_BLINK_SLOW);
- LED_Off();
- LL_mDelay(LED_BLINK_SLOW);
- if(ubDmaTransferStatus == 1)
- {
- uhADCxConvertedData_VrefAnalog_mVolt = __LL_ADC_CALC_VREFANALOG_VOLTAGE(uhADCxConvertedData[1], LL_ADC_RESOLUTION_12B);
- uhADCxConvertedData_VoltageGPIO_mVolt = __LL_ADC_CALC_DATA_TO_VOLTAGE(uhADCxConvertedData_VrefAnalog_mVolt, uhADCxConvertedData[0], LL_ADC_RESOLUTION_12B);
- uhADCxConvertedData_VrefInt_mVolt = __LL_ADC_CALC_DATA_TO_VOLTAGE(uhADCxConvertedData_VrefAnalog_mVolt, uhADCxConvertedData[1], LL_ADC_RESOLUTION_12B);
- hADCxConvertedData_Temperature_DegreeCelsius = __LL_ADC_CALC_TEMPERATURE(uhADCxConvertedData_VrefAnalog_mVolt, uhADCxConvertedData[2], LL_ADC_RESOLUTION_12B);
- LCD_ShowString(10,100,"U1= mV",YELLOW ,RED,16,0);
- LCD_ShowString(10,120,"U2= mV",YELLOW ,RED,16,0);
- LCD_ShowString(10,140,"T= C",YELLOW ,RED,16,0);
- LCD_ShowIntNum(42,100,uhADCxConvertedData_VoltageGPIO_mVolt,4,WHITE,RED,16);
- k=uhADCxConvertedData_VoltageGPIO_mVolt;
- LCD_ShowIntNum(42,120,uhADCxConvertedData_VrefInt_mVolt,4,WHITE,RED,16);
- LCD_ShowIntNum(42,140,hADCxConvertedData_Temperature_DegreeCelsius,3,WHITE,RED,16); if(i<30)
- {
- k=k/3;
- if(k>75) sj=75;
- else sj=k;
- LCD_DrawLine(2+4*(i-1),96-sp, 2+4*i,96-sj, GREEN);
- sp=sj;
- i=i+1;
- }
- else
- {
- LCD_Fill(1,21,127,97,BLACK);
- i=1;
- }
- if (ubAdcGrpRegularSequenceConvStatus != 1)
- {
- Error_Handler();
- }
- ubAdcGrpRegularSequenceConvStatus = 0;
- ubDmaTransferStatus = 0;
- tmp_index = 4*2;
- while(tmp_index != 0)
- {
- LED_Toggle();
- LL_mDelay(LED_BLINK_FAST);
- tmp_index--;
- }
- LL_mDelay(500);
- }
- }
- }
经程序的编译和下载,其测试的结果如图3所示。 图3 采集结果
图4 数据波形
2. 传感器检测 传感器有多种类型,其大致可分为3种类型,即:数字式传感器、模拟式传感器及脉冲式传感器。 对于数字式传感器,它主要是通过I2C接口或SPI接口来传送指令及检测结果;而对于模拟式传感器,则是通过传感器或变送器将外部变化转化相应的模拟量以供采集,而对于这些模拟信号量的采集则需要A/D数据采集功能的配合来完成。 对于火焰、气体及土壤湿度传感器来讲,则是以模拟式传感器的形式呈现。 为此,在配接这3种传感器的情况下,可实现火焰、气体及土壤湿度的检测,其具体的检测效果 分别见图5至图8所示。
图5中的波形缺口即使火焰照射时的变化,图6 是无火焰时呈现的效果。 图7是气体传感器在上电后的缓慢变化情况,图8是土壤湿度在干燥状态下的情况。 图5 火焰检测
图6 无火焰呈现的检测
图7 气体检测效果
图8 干燥状态的检测效果
|