【STM32H7S78-DK】测评+STM32CubeIDE配置ADC单通道轮询
[复制链接]
本帖最后由 dql2016 于 2024-9-19 23:00 编辑
STM32H7S78支持2个12bit ADC,采样率高达5Msps,这对于一般的工业工频电信号如电压、电流的采集足够了,上一个采样率这么高的芯片还是STM32F303,可以说12bit 5Msps应该是ST系列MCU最高配置了。ADC主要特点与其它系列类似:
两个ADC1和ADC2可以交替模式采集,ADC1作为主设备,ADC2作为从设备,交替采集这样采样率可以达到10Msps:
ADC1和ADC2特性一览表:
ADC通道描述:
可以看到,和STM32H743系列一样, ADC通道分为快速通道和慢速通道,但是没有STM32H743系列的直接通道。
ADC时钟最高支持75MHz,和STM32H743系列玩法类似,不同时钟对应的最高采样率不同。
最终的ADC转换时间=(采样时间+0.5+分辨率)N个时钟周期,时钟配置最高75MHz,采样时间配置最短2.5个clk时,达到最大5Msps采样率,75/(2.5+0.5+12)=5
需要注意的是注释部分,这些性能数据只有BGA封装能够保证,熟悉STM32H743系列的朋友知道,不同封装的ADC性能数据不同,差别很大,尤其LQFP和BGA封装之间,至于当前板卡的芯片型号是否能达到这些最大性能数值,还没找到相关资料说明,只有在后续的测试中验证了。
下载官方软件包后,发现官方SDK包暂时没提供ADC例程:
熟悉STM32系列的话,通过查看数据和用户手册,了解ADC的特性,使用STM32CubeMX进行配置也是十分简单,这里不得不说ST的开发生态超级牛逼。
先看看原理图,板卡的ADC模拟电源和参考电压,可以看到模拟电源和参考电压都是接到了VDD电源3.3V,也可以断开相应的0欧姆电阻,外接高性能的电压基准和独立的模拟供电电源,来提高ADC的精度。
板载了Arduino接口,可以看到模拟输入一共有5个,综合前面的快速通道和慢速通道,这里选择了A4---PF13进行实验,它是ADC2的快速通道:
在之前的工程配置了串口pritnf打印的基础上增加单通道ADC轮询采集,将数据打印出来。ADC的轮询模式,指的是软件开始ADC转换后,一直等到转换完成后,才向后执行。
首先将ADC时钟配置为25MHz:
这里我采用ADC2的通道2,单端输入模式,并开启连续采样模式,否则每次开启ADC采样后只进行一次采样就自动关闭了:
开启ADC全局中断,如果只采用轮询模式也可以不用开启,我这里开启是为了后面方进行中断模式的采集:
然后就可以生成工程,在main.c添加用户代码,首先加入只执行一次的校准(不校准也可以,但精度会低一点):
if (HAL_ADCEx_Calibration_Start(&hadc2, ADC_SINGLE_ENDED) != HAL_OK)
{
printf("ADC Calibration Err\n");
Error_Handler();
}
printf("ADC Calibration End\n");
uint32_t adc_value = 0;
然后在主循环就可以使用ADC轮询转换了,只需要三步:启动转换、等待转换完成、读取转换数据,即可完成一次ADC转换,如下代码所示,将转换数据和换算的电压数据通过串口打印出来:
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_ADC_Start(&hadc2);
if(HAL_ADC_PollForConversion(&hadc2, 0xFFFF) == HAL_OK)
{
adc_value = HAL_ADC_GetValue(&hadc2);
printf("raw=%d voltage=%fV\n",adc_value,1.0*adc_value/4096*3.3);
}
HAL_ADC_Stop(&hadc2);
HAL_Delay(100);
}
/* USER CODE END 3 */
由于开启了连续转换模式,因此每次转换完成后都要调用HAL_ADC_Stop关闭ADC,如果不想每次都调用HAL_ADC_Stop来关闭ADC,可以配置关闭连续转换模式,这样每次开启ADC转换以后只会进行一次采样,就不用每次都关闭ADC。
将A4连接到3.3V位置,如下:
效果:
将A4连接到GND位置,如下:
效果:
可以看到,接地后,跳动1-2个字左右,如果连接外部电压基准跳动可能减少许多。
后面将测试ADC中断采集模式和DMA传输模式。
|