硬件限制
封装
在手册 AN5354 中说明了不同封装、不同分辨率的最大速率是不一致的;
BGA封装的ADC的速度要快于LQFP封装的速度的;
分辨位数越高、转换时间越长,所以ADC的最大采样速率也就最低;
ADC通道模式
STM32H7的ADC有三种类型Slow、Fast、Direct;
这取决于引脚和ADC采样电容之间存在的电阻的阻值,阻值越小,给电容充电的时间越短,采样速率更快;
ADC123的通道[0:5] 是 fast channels , [6:19] slow channels;
以H750为例,数据手册中说明了不同通道类型的ADC的最大采样速率是不同的;
设备的类型
V版硬件芯片对ADC主频的强制二分频
测试
使用 V版本 的 STM32H750VBT6 的 ADC1_IN3 测试
使用定时器触发DMA采样
根据手册得到ADC的最大采样速率为 1.9M
CubeMx配置
ADC
时钟配置
ADC具体配置
使用TIM4触发DMA采样
ADC 时钟源
TIM
代码
采样1000次后拉高测试引脚的电平,设置标志位,在主循环中将adc采样二点数据打印出来后再次开启采样
// 数据定义
#define ADC_BUF_SIZE 1000
uint16_t ADC_BUF[2 * ADC_BUF_SIZE + 20];
uint8_t flag = 0;
// 中断回调
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
HAL_GPIO_WritePin(TP_GPIO_Port, TP_Pin, GPIO_PIN_SET);
HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_1);
HAL_ADC_Stop_DMA(&hadc1);
flag = 1;
}
// 开启pwm输出和ADC采样
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1);
HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC_BUF, ADC_BUF_SIZE);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
if(flag)
{
flag = 0;
for (int i = 0; i < ADC_BUF_SIZE; i++)
{
printf("%d\r\n",ADC_BUF);
}
memset(ADC_BUF, 0, sizeof(ADC_BUF));
__HAL_TIM_SetCounter(&htim4, 0);
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1);
HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC_BUF, ADC_BUF_SIZE);
HAL_GPIO_WritePin(TP_GPIO_Port, TP_Pin, GPIO_PIN_RESET);
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
结果
Tim的PWM输出是1.9M
ADC采样1000个点使用的时间为526.332uS,采样频率为1.9M;
能后正确采样
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_41555003/article/details/147052899
|