[STM32U3] 【STM32U385RG 测评】+ 多数据项采集与波形绘制

[复制链接]
637|0
jinglixixi 发表于 2025-8-12 15:14 | 显示全部楼层 |阅读模式
本帖最后由 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.png
1 显示屏所用接口


A/D数据采集的端口为通道4,引脚为PA1,可从CN8 的 A1或CN8 中引用。
图片2.png
2 数据采集端口


实现多数据项采集与波形绘制的主程序为:
  1. int main(void)
  2. {
  3.   uint16_t i=1,k,sj,sp=0;        
  4.   uint32_t tmp_index;        
  5.   for (tmp_index = 0; tmp_index < ADC_CONVERTED_DATA_BUFFER_SIZE; tmp_index++)
  6.   {
  7.     uhADCxConvertedData[tmp_index] = VAR_CONVERTED_DATA_INIT_VALUE;
  8.   }
  9.   NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
  10.   NVIC_SetPriority(SysTick_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),15, 0));
  11.   SystemClock_Config();        
  12.   LCD_Init();        
  13.   init_lcd_st7735();
  14.   Lcd_Clear(RED);        
  15.   LCD_ShowString(40,0,"U385 & ADC ",YELLOW ,RED,16,0);        
  16.   LCD_DrawLine(0,20,127,20,YELLOW);
  17.   LCD_DrawLine(0,98,127,98,YELLOW);        
  18.   LCD_Fill(1,21,127,97,BLACK);
  19.   LL_AHB1_GRP2_EnableClock(LL_AHB1_GRP2_PERIPH_PWR);
  20.   LL_PWR_EnableVDDA();
  21.   LL_PWR_EnableVDDIO2();
  22.   MX_GPIO_Init();               
  23.   MX_ADC1_Init();
  24.   MX_ICACHE_Init();
  25.   ADC_Activate();                        
  26.   while (1)
  27.   {               
  28.     if ((LL_ADC_IsEnabled(ADC1) == 1)               &&
  29.         (LL_ADC_IsDisableOngoing(ADC1) == 0)        &&
  30.         (LL_ADC_REG_IsConversionOngoing(ADC1) == 0)   )
  31.     {
  32.            LL_ADC_REG_StartConversion(ADC1);
  33.     }
  34.     else
  35.     {
  36.           Error_Handler();
  37.     }
  38.     LED_On();
  39.     LL_mDelay(LED_BLINK_SLOW);
  40.     LED_Off();
  41.     LL_mDelay(LED_BLINK_SLOW);
  42.     if(ubDmaTransferStatus == 1)
  43.     {
  44.           uhADCxConvertedData_VrefAnalog_mVolt = __LL_ADC_CALC_VREFANALOG_VOLTAGE(uhADCxConvertedData[1], LL_ADC_RESOLUTION_12B);
  45.           uhADCxConvertedData_VoltageGPIO_mVolt        = __LL_ADC_CALC_DATA_TO_VOLTAGE(uhADCxConvertedData_VrefAnalog_mVolt, uhADCxConvertedData[0], LL_ADC_RESOLUTION_12B);
  46.           uhADCxConvertedData_VrefInt_mVolt            = __LL_ADC_CALC_DATA_TO_VOLTAGE(uhADCxConvertedData_VrefAnalog_mVolt, uhADCxConvertedData[1], LL_ADC_RESOLUTION_12B);
  47.           hADCxConvertedData_Temperature_DegreeCelsius = __LL_ADC_CALC_TEMPERATURE(uhADCxConvertedData_VrefAnalog_mVolt, uhADCxConvertedData[2], LL_ADC_RESOLUTION_12B);
  48.           LCD_ShowString(10,100,"U1=      mV",YELLOW ,RED,16,0);
  49.           LCD_ShowString(10,120,"U2=      mV",YELLOW ,RED,16,0);        
  50.           LCD_ShowString(10,140,"T=       C",YELLOW ,RED,16,0);                        
  51.           LCD_ShowIntNum(42,100,uhADCxConvertedData_VoltageGPIO_mVolt,4,WHITE,RED,16);
  52.           k=uhADCxConvertedData_VoltageGPIO_mVolt;
  53.           LCD_ShowIntNum(42,120,uhADCxConvertedData_VrefInt_mVolt,4,WHITE,RED,16);
  54.           LCD_ShowIntNum(42,140,hADCxConvertedData_Temperature_DegreeCelsius,3,WHITE,RED,16);                           if(i<30)
  55.           {
  56.                   k=k/3;
  57.                   if(k>75) sj=75;
  58.                   else sj=k;                                
  59.                   LCD_DrawLine(2+4*(i-1),96-sp, 2+4*i,96-sj, GREEN);
  60.                   sp=sj;        
  61.                   i=i+1;                                
  62.           }
  63.           else
  64.           {
  65.                   LCD_Fill(1,21,127,97,BLACK);
  66.                   i=1;                                
  67.           }                        
  68.           if (ubAdcGrpRegularSequenceConvStatus != 1)
  69.           {
  70.                  Error_Handler();
  71.           }
  72.           ubAdcGrpRegularSequenceConvStatus = 0;
  73.           ubDmaTransferStatus = 0;
  74.           tmp_index = 4*2;
  75.           while(tmp_index != 0)
  76.           {
  77.                LED_Toggle();
  78.                LL_mDelay(LED_BLINK_FAST);
  79.                tmp_index--;
  80.          }
  81.          LL_mDelay(500);
  82.     }
  83.   }
  84. }


经程序的编译和下载,其测试的结果如图3所示。
图片3.png
3 采集结果

图片4.png
4 数据波形

2. 传感器检测
传感器有多种类型,其大致可分为3种类型,即:数字式传感器、模拟式传感器及脉冲式传感器。
对于数字式传感器,它主要是通过I2C接口或SPI接口来传送指令及检测结果;而对于模拟式传感器,则是通过传感器或变送器将外部变化转化相应的模拟量以供采集,而对于这些模拟信号量的采集则需要A/D数据采集功能的配合来完成。
对于火焰、气体及土壤湿度传感器来讲,则是以模拟式传感器形式呈现。
为此,在配接这3种传感器的情况下,可实现火焰、气体及土壤湿度的检测,其具体的检测效果 分别见图5至图8所示。

5中的波形缺口即使火焰照射时的变化,图6 是无火焰时呈现的效果。
7是气体传感器在上电后的缓慢变化情况,图8土壤湿度在干燥状态下的情况。
图片5.png
5 火焰检测

图片6.png
6 无火焰呈现的检测

图片7.png
7 气体检测效果

图片8.png
8 干燥状态的检测效果



您需要登录后才可以回帖 登录 | 注册

本版积分规则

525

主题

2957

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部