【STM32U385RG 测评】+ 多数据项采集与波形绘制
本帖最后由 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 ---PA6MOSI---PA7DC ---PC7CS ---PC9RST---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 = 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, LL_ADC_RESOLUTION_12B);
uhADCxConvertedData_VoltageGPIO_mVolt = __LL_ADC_CALC_DATA_TO_VOLTAGE(uhADCxConvertedData_VrefAnalog_mVolt, uhADCxConvertedData, LL_ADC_RESOLUTION_12B);
uhADCxConvertedData_VrefInt_mVolt = __LL_ADC_CALC_DATA_TO_VOLTAGE(uhADCxConvertedData_VrefAnalog_mVolt, uhADCxConvertedData, LL_ADC_RESOLUTION_12B);
hADCxConvertedData_Temperature_DegreeCelsius = __LL_ADC_CALC_TEMPERATURE(uhADCxConvertedData_VrefAnalog_mVolt, uhADCxConvertedData, 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 干燥状态的检测效果
页:
[1]