硬汉嵌入式论坛

 找回密码
 立即注册
查看: 9191|回复: 15
收起左侧

[ADC] STM32H7中ADC功能被ST玩出花,现在分直接通道,快速通道和慢速通道,不同封装最高速不同, LQFP封装速度最低

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2020-4-17 02:06:08 | 显示全部楼层 |阅读模式
手册:dm00628458-getting-started-with-the-stm32h7-series-mcu-16bit-adc-stmicroelectronics.pdf (422.87KB)

早期我们叫快速通道和慢速通道是不准确的。

现在重新命名为直接通道,快速通道和慢速通道。

直接通道就是PA0_C, PA1_C, PC2_C和PC3_C这四个引脚。

55555.png

BGA封装,其中16bit里面速度最高的UFBGA176,当前H7-TOOL用的是这款封装

1111.png

LQFP的封装速度最低

55555555555.png

数据手册里面参数是直接通道,快速通道和慢速通道支持的最高速度,不同封装是不同的。

7777.png








回复

使用道具 举报

2

主题

72

回帖

83

积分

初级会员

积分
83
发表于 2020-4-17 08:43:18 | 显示全部楼层
一个强大的示波器缓缓出现在眼前
回复

使用道具 举报

23

主题

1406

回帖

1475

积分

至尊会员

积分
1475
发表于 2020-4-17 10:47:39 | 显示全部楼层


我服
代码不规范,亲人两行泪!
回复

使用道具 举报

609

主题

3050

回帖

4897

积分

至尊会员

积分
4897
发表于 2020-4-17 20:21:37 | 显示全部楼层
很是期待大神的作品哟
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
 楼主| 发表于 2020-4-18 09:16:54 | 显示全部楼层
hpdell 发表于 2020-4-17 20:21
很是期待大神的作品哟

过奖,抓紧恢复H7-TOOL的RTX5全家桶版制作。
回复

使用道具 举报

609

主题

3050

回帖

4897

积分

至尊会员

积分
4897
发表于 2020-4-18 10:16:31 | 显示全部楼层
eric2013 发表于 2020-4-18 09:16
过奖,抓紧恢复H7-TOOL的RTX5全家桶版制作。

V7  的有没有出 rtx5 的教程啊 ?  另外 rtx5 能否把堆栈定义到外部 sdram 或者自己指定的 ram 位置 ?

之前看 v6 里面的 rtx5 的教程,貌似有很多与现在的 rtx 的不一样啊
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
 楼主| 发表于 2020-4-18 10:31:37 | 显示全部楼层
hpdell 发表于 2020-4-18 10:16
V7  的有没有出 rtx5 的教程啊 ?  另外 rtx5 能否把堆栈定义到外部 sdram 或者自己指定的 ram 位置 ?

...

V7的RTX5教程还没有发布。

RTX5在这里,全局通道内存使用的数组,修改使用SDRAM即可,不过不推荐,没有实战价值,任务栈全靠这个活着,性能会大大折扣
QQ截图20200418102750.png

回复

使用道具 举报

609

主题

3050

回帖

4897

积分

至尊会员

积分
4897
发表于 2020-4-18 10:53:52 | 显示全部楼层
eric2013 发表于 2020-4-18 10:31
V7的RTX5教程还没有发布。

RTX5在这里,全局通道内存使用的数组,修改使用SDRAM即可,不过不推荐,没 ...

那看来还是不使用外部的 sdram 了
回复

使用道具 举报

0

主题

19

回帖

19

积分

新手上路

积分
19
发表于 2020-4-20 10:56:12 | 显示全部楼层
看完了上面关于16BIT ADC的文档,原来不同封装之间ADC性能差别这么大,10BIT的速度还差不多,16bit的时候速度就就差了一倍呀,之前买了750VB的芯片打算利用16BIT的ADC DIY个简单的LCR玩玩,原以为可以上到3.2MSPS,结果这篇文档一看原来就只能到1.9MSPS采样率
回复

使用道具 举报

1

主题

11

回帖

14

积分

新手上路

积分
14
发表于 2020-9-16 15:43:00 | 显示全部楼层
jackfrost 发表于 2020-4-20 10:56
看完了上面关于16BIT ADC的文档,原来不同封装之间ADC性能差别这么大,10BIT的速度还差不多,16bit的时候速 ...

你好,h743单通道独立模式DMA,定时器触发ADC采样,你试过可以到多少采样率,我想用3MHz采样率,始终上不去,有什么办法吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
 楼主| 发表于 2020-9-16 16:30:03 | 显示全部楼层
bao292387701 发表于 2020-9-16 15:43
你好,h743单通道独立模式DMA,定时器触发ADC采样,你试过可以到多少采样率,我想用3MHz采样率,始终上不 ...

你用的LQFP封装,16bit情况下,最高只能到1.9MHz,再高属于超频
5.png
回复

使用道具 举报

1

主题

11

回帖

14

积分

新手上路

积分
14
发表于 2020-9-16 19:20:57 | 显示全部楼层
eric2013 发表于 2020-9-16 16:30
你用的LQFP封装,16bit情况下,最高只能到1.9MHz,再高属于超频

我已经改到12bit,用的是ADC通道5,是个快速通道,可是定时器分到3MHz的时候还是不行,实在看不出哪的配置有问题
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
 楼主| 发表于 2020-9-16 21:34:41 | 显示全部楼层
bao292387701 发表于 2020-9-16 19:20
我已经改到12bit,用的是ADC通道5,是个快速通道,可是定时器分到3MHz的时候还是不行,实在看不出哪的配 ...

那就改成8bit试试,还是有问题,基本可以确定是配置问题了。
回复

使用道具 举报

1

主题

11

回帖

14

积分

新手上路

积分
14
发表于 2020-9-17 10:35:43 | 显示全部楼层
双重ADC交替采集,我采到的ADC1和ADC2的值是一样的,这是为什么,我已经配置成交替模式了。
ALIGN_32BYTES (__attribute__ ((at(0x24000000))) __IO uint32_t ADC_ConvertedValue = 0);
extern float ADC_vol;

ADC_HandleTypeDef ADC1_Handle;
ADC_HandleTypeDef ADC2_Handle;
DMA_HandleTypeDef hdma_adc;
ADC_MultiModeTypeDef ADC_multimode;

static void ADC_GPIO_Mode_Config(void)
{
        GPIO_InitTypeDef  GPIO_InitStruct;
        __GPIOB_CLK_ENABLE();
        GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Pin = GPIO_PIN_1;
        /* 配置为模拟输入,不需要上拉电阻 */
        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
       
}
static void ADC_Mode_Config(void)
{
        ADC_ChannelConfTypeDef ADC_Config;
  
    RCC_PeriphCLKInitTypeDef RCC_PeriphClkInit;  
    /*            配置ADC3时钟源             */
    /*    HSE Frequency(Hz)    = 25000000   */                                             
    /*         PLL_M                = 5     */
    /*         PLL_N                = 160   */
    /*         PLL_P                = 25    */
    /*         PLL_Q                = 2     */
    /*         PLL_R                = 2     */
    /*     ADC_ker_clk         = 32000000   */
        RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
    RCC_PeriphClkInit.PLL2.PLL2FRACN = 0;
    RCC_PeriphClkInit.PLL2.PLL2M = 5;
    RCC_PeriphClkInit.PLL2.PLL2N = 180;
    RCC_PeriphClkInit.PLL2.PLL2P = 8;
    RCC_PeriphClkInit.PLL2.PLL2Q = 2;
    RCC_PeriphClkInit.PLL2.PLL2R = 2;
    RCC_PeriphClkInit.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_2;
    RCC_PeriphClkInit.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
    RCC_PeriphClkInit.AdcClockSelection = RCC_ADCCLKSOURCE_PLL2;
        HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit);  
               
                __HAL_RCC_ADC12_CLK_ENABLE();
                __HAL_RCC_DMA1_CLK_ENABLE();

                 //选择DMA1的Stream1
    hdma_adc.Instance = DMA1_Stream0;
    //ADC1的DMA请求
    hdma_adc.Init.Request = DMA_REQUEST_ADC1;
    //传输方向:外设-》内存
    hdma_adc.Init.Direction = DMA_PERIPH_TO_MEMORY;
    //外设地址不自增
    hdma_adc.Init.PeriphInc = DMA_PINC_DISABLE;
    //内存地址不自增
    hdma_adc.Init.MemInc = DMA_MINC_ENABLE;

    hdma_adc.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;

    hdma_adc.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
    //DMA循环传输
    hdma_adc.Init.Mode = DMA_CIRCULAR;
    //DMA的软件优先级:低
    hdma_adc.Init.Priority = DMA_PRIORITY_LOW;
    //FIFO模式关闭
    hdma_adc.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
    //DMA初始化
    HAL_DMA_Init(&hdma_adc);
    //hdma_adc和ADC_Handle.DMA_Handle链接
    __HAL_LINKDMA(&ADC1_Handle,DMA_Handle,hdma_adc);


    ADC1_Handle.Instance = ADC1;
    //使能Boost模式
    ADC1_Handle.Init.BoostMode = ENABLE;
    //ADC时钟1分频
    ADC1_Handle.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
    //使能连续转换模式
    ADC1_Handle.Init.ContinuousConvMode = DISABLE;
    //数据存放在数据寄存器中
    ADC1_Handle.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;
    //关闭不连续转换模式
    ADC1_Handle.Init.DiscontinuousConvMode = DISABLE;
//         ADC1_Handle.Init.NbrOfDiscConversion   =  0;
//         ADC1_Handle.Init.NbrOfConversion       =  1;
    //单次转换
    ADC1_Handle.Init.EOCSelection = ADC_EOC_SINGLE_CONV;       
        ADC1_Handle.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T3_TRGO;
    ADC1_Handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
    //关闭低功耗自动等待
    ADC1_Handle.Init.LowPowerAutoWait = DISABLE;
    //数据溢出时,覆盖写入
    ADC1_Handle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
        ADC1_Handle.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
    //不使能过采样模式
    ADC1_Handle.Init.OversamplingMode = DISABLE;
    //分辨率为:16bit
    ADC1_Handle.Init.Resolution = ADC_RESOLUTION_12B;
    //不使能多通道扫描
    ADC1_Handle.Init.ScanConvMode = DISABLE;
    //初始化 ADC_MASTER
    HAL_ADC_Init(&ADC1_Handle);
   
       
        ADC2_Handle.Instance = ADC2;
    ADC2_Handle.Init.BoostMode = ENABLE;
    //ADC时钟1分频
    ADC2_Handle.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
    //使能连续转换模式
    ADC2_Handle.Init.ContinuousConvMode = DISABLE;
    //数据存放在数据寄存器中
    ADC2_Handle.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;
    //关闭不连续转换模式
    ADC2_Handle.Init.DiscontinuousConvMode = DISABLE;
//         ADC2_Handle.Init.NbrOfDiscConversion   =  0;
//         ADC2_Handle.Init.NbrOfConversion       =  1;
    //单次转换
    ADC2_Handle.Init.EOCSelection = ADC_EOC_SINGLE_CONV;               
        ADC2_Handle.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T3_TRGO;
    ADC2_Handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
    //关闭低功耗自动等待
    ADC2_Handle.Init.LowPowerAutoWait = DISABLE;
    //数据溢出时,覆盖写入
    ADC2_Handle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
        ADC2_Handle.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
    //不使能过采样模式
    ADC2_Handle.Init.OversamplingMode = DISABLE;
    //分辨率为:16bit
    ADC2_Handle.Init.Resolution = ADC_RESOLUTION_12B;
    //不使能多通道扫描
    ADC2_Handle.Init.ScanConvMode = DISABLE;
    HAL_ADC_Init(&ADC2_Handle);
                  

    ADC_Config.Channel = ADC_CHANNEL_5;
    //转换顺序为1
    ADC_Config.Rank = ADC_REGULAR_RANK_1;
    ADC_Config.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
    //不使用差分输入的功能
    ADC_Config.SingleDiff = ADC_SINGLE_ENDED;
    //配置ADC_MASTER通道
    HAL_ADC_ConfigChannel(&ADC1_Handle, &ADC_Config);

        ADC_Config.Channel = ADC_CHANNEL_5;
    //转换顺序为1
    ADC_Config.Rank = ADC_REGULAR_RANK_1;
    ADC_Config.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
    //不使用差分输入的功能
    ADC_Config.SingleDiff = ADC_SINGLE_ENDED;
                //配置ADC_SLAVE通道
    HAL_ADC_ConfigChannel(&ADC2_Handle, &ADC_Config);
   
    //使能ADC1、2
    ADC_Enable(&ADC1_Handle);
    ADC_Enable(&ADC2_Handle);
   
    ADC_multimode.Mode = ADC_DUALMODE_INTERL;
    //数据格式
    ADC_multimode.DualModeData = ADC_DUALMODEDATAFORMAT_32_10_BITS;  
    //ADC_MASTER和ADC_SLAVE采样间隔3个ADC时钟
    ADC_multimode.TwoSamplingDelay = ADC_TWOSAMPLINGDELAY_4CYCLES;
    //ADC双重模式配置初始化
    HAL_ADCEx_MultiModeConfigChannel(&ADC1_Handle, &ADC_multimode);
    //使能DMA,此函数会开启DMA中断,需要用户自行配置DMA中断优先级
    HAL_ADCEx_MultiModeStart_DMA(&ADC1_Handle, (uint32_t*)&ADC_ConvertedValue, 2);
               
}

void Rheostat_DMA_NVIC_Config(void)
{
       
        HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 1, 0);
        HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn);
}
void ADC_Init(void)
{       
        ADC_GPIO_Mode_Config();
        ADC_Mode_Config();
        Rheostat_DMA_NVIC_Config();
        HAL_ADC_Start(&ADC1_Handle);
        HAL_ADC_Start(&ADC2_Handle);
}

下面是回调函数获取AD值
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle)   //ADC回调函数,用于读取AD值
{

        ADC_ConvertedValue = HAL_ADCEx_MultiModeGetValue(&ADC1_Handle);  
        static int j=0;
        //ADC_convol1采样值存放在低16位;ADC_convol2采样值存放在高16位;            
          ADC_convol1[2*j] = (uint16_t)(ADC_ConvertedValue&0x0000ffff);
        ADC_convol1[2*j+1] = (uint16_t)((ADC_ConvertedValue&0xffff0000)>>16);
        j++;
        if(j>=2000)
        {
                j=0;
                __HAL_RCC_TIM3_CLK_DISABLE();
                DMA_finsh=1;
        }
               
}
两个ADC采到的值是一样的
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
 楼主| 发表于 2020-9-17 10:46:56 | 显示全部楼层
bao292387701 发表于 2020-9-17 10:35
双重ADC交替采集,我采到的ADC1和ADC2的值是一样的,这是为什么,我已经配置成交替模式了。
ALIGN_32BYTES ...

其它问题自己解决下,自带的双通道交替模式我没有测试过。

大概率都是程序问题。
回复

使用道具 举报

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
发表于 2023-4-1 23:25:36 | 显示全部楼层
补充下:快速通道的引脚
Fast channels correspond to PF3, PF5, PF7, PF9, PA6, PC4, PB1, PF11 and PF13.
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-3 00:14 , Processed in 0.268377 second(s), 36 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表