STM32G474 CubeMX + CLion双重ADC交替采样实现2M+2M = 4M

STM32G474 CubeMX + CLion双重ADC交替采样实现2M+2M = 4M采样率

前言

并非所有通道都有三重ADC的采样,笔者之前配过G474RET6,找了半天最多只有双重,没有三重。

换了H750发现也只有引脚支持三重ADC ,而F407有不知道多少引脚能够三重。怪不得那么多人买F407。

1.cube配置

都用上交替采样了,时钟就配成120M,方便后面的ADC2分频

QQ_1721653328044

然后引脚这边加上ADC1和ADC2

QQ_1721653389452

也可以不选A0做双重,选其他引脚也可以。

记得选完在左边的ADC中使能这个通道。

1.1配置下ADC

QQ_1721653633579

QQ_1721653710151

注意到这里用的定时器8,因为手头这块板子似乎TIM3有问题,没法用来做触发ADC

ADC2不用配,已经帮你同步成跟ADC1一样了

QQ_1721653858037

1.2接下来配置DMA

QQ_1721653775579

注意选全字,交替模式DMA的数据存在一个32位数组中,其中低16位是ADC1,高16位是ADC2。就随便试验下,DMA配成NOMAL。channel随便选一个。

QQ_1721654035723

ADC2的DMA不用配,一个DMA搬运完ADC1的就去搬运ADC2的,如果配置了那么对不起,高16位就没数据了。

1.3定时器(重要)

QQ_1721654157741

这边配置上2M频率,然后我们讲下之前为什么要配成12cycle。

首先明确下,cycle就是ADC时钟经过分频后的数值,也就是说,我们120M经过二分频,60M就是者的cycle。

同时,ADC双重采样,是ADC1先采样,经历了采样时间与等待时间后,再经历这个Delay between 2 sampling phases,然后轮到ADC2采样,ADC2经历采样时间与等待时间,然后就是等待下一次TIM8的上升沿到来。

QQ_1721699354417

所以我们知道了,这里的 Delay between 2 sampling phases 最好正好是定时器频率的两倍,也就是说

n ∗ c y c l e = 2 ∗ T I M n*cycle=2*TIM ncycle=2TIM

我们这120M/2=60M,要匹配上定时器的2M理论上需要60/15个cycle=4M,配置栏中没有,只能退而求其次选择12cycle,实际测试下来误差很小了。

2.代码编写

usart记得cube配置下,printf重定向不再赘述。

QQ_1721655584410

/* USER CODE BEGIN PM */
#define data_len 100//
/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
uint32_t dmabuffer[data_len];
double adc_123[data_len*2];
uint16_t conv_done=0;//DMA传输完成标志
/* USER CODE END PV */

QQ_1721655756263

HAL_ADC_Start(&hadc2);
    HAL_ADCEx_MultiModeStart_DMA(&hadc1,(uint32_t   *)dmabuffer,data_len);
    //多重adc开启,并让dma把数据搬运到dmabuffer数组中
    HAL_TIM_Base_Start(&htim8);

    while(!conv_done) ; //等待dma传输完成
    for(int i=0;i<data_len*2;i++)
    {
        printf("%d,%.3f\r\n",i,adc_123[i]); //打印采样得到的值
    }

QQ_1721655789420

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
    conv_done=1;
    int i=0,j=0;
    for(i=0,j=0;j<data_len && i<data_len*2;i++)
    {
        adc_123[i]=(dmabuffer[j] & 0x0000FFFF)*3.3/4096 ;//取低16位ADC1的数据
        i++;
        adc_123[i]=((dmabuffer[j] >>16))*3.3/4096 ;//取高16位ADC2的数据

        j++;
    }//取出DMA传输的数据
}

用了两种写法获取高低位的值

3.结果

Delay between 2 sampling phases 的选择至关重要,如果不选好了就会出现下图的情况

QQ_1721628255538

两次时钟的间隔就不对了

下图为12cycle的图像

QQ_1721656735571

可以看到已经很漂亮了

200KHZ波,一个周期20个点,2M的adc实现了4M采样率,牺牲了硬件资源换取了采样率

Something for nothing.

  • 14
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值