硬汉嵌入式论坛

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

[ADC] 求助:STM32H750VBT6 现在ADC采样只能设置到500K?

[复制链接]

8

主题

36

回帖

60

积分

初级会员

积分
60
发表于 2020-5-11 15:21:56 | 显示全部楼层 |阅读模式
我用的芯片是 STM32H750VBT6, 采用的是PC4引脚快速通道,时钟采用PLL时钟,ADC时钟设置为36MHZ.
现在问题是,采用周期数只能设置为64.5以上,如果设置为64.5以下,用串口打印ADC数据不显示。
求助,STM32H750单通道DMA ADC如何设置频率最高为2MHZ以上呢?
我的部分配置代码
ADC_ChannelConfTypeDef ADC_Config;
    RCC_PeriphCLKInitTypeDef RCC_PeriphClkInit;  
   
     
        
   
    ADC_GPIO_Init();  //ADC¶Ë¿ÚÅäÖÃ
      
    /*            ÅäÖÃADC1ʱÖÓÔ´            */
    /*    HSE Frequency(Hz)    = 25000000    */                                             
    /*         PLL_M                = 25     */
    /*         PLL_N                = 504    */
    /*         PLL_P                = 7      */
    /*         PLL_Q                = 7      */
    /*         PLL_R                = 7      */
    /*     ADC_ker_clk         = 36000000    */
//   
        RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
    RCC_PeriphClkInit.PLL2.PLL2M = 25;
    RCC_PeriphClkInit.PLL2.PLL2N = 504;
    RCC_PeriphClkInit.PLL2.PLL2P = 7;
    RCC_PeriphClkInit.PLL2.PLL2Q = 7;
    RCC_PeriphClkInit.PLL2.PLL2R = 7;
    RCC_PeriphClkInit.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_0;
    RCC_PeriphClkInit.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
        RCC_PeriphClkInit.PLL2.PLL2FRACN = 0;
    RCC_PeriphClkInit.AdcClockSelection = RCC_ADCCLKSOURCE_PLL2;
        HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit);  
//  
   
     //ʹÄÜADC1ʱÖÓºÍDMAʱÖÓ
    __HAL_RCC_DMA1_CLK_ENABLE();
        
    ADC1_DMA_Handle.Instance = DMA1_Stream1;                               //ʹÓÃstream1
    ADC1_DMA_Handle.Init.Request = DMA_REQUEST_ADC1;                       //ʹÓÃADC1µÄÇëÇó
    ADC1_DMA_Handle.Init.Direction = DMA_PERIPH_TO_MEMORY;                // ·½Ïò£ºÍâÉèµ½ÄÚ´æ
    ADC1_DMA_Handle.Init.PeriphInc = DMA_PINC_DISABLE;                   // ÍâÉèµØÖ·²»×ÔÔö
    ADC1_DMA_Handle.Init.MemInc =    DMA_MINC_DISABLE;                   // ÄÚ´æµØÖ·²»×ÔÔö
    ADC1_DMA_Handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; //¿í¶È°ë×Ö
    ADC1_DMA_Handle.Init.MemDataAlignment =   DMA_MDATAALIGN_HALFWORD;   
    ADC1_DMA_Handle.Init.Mode = DMA_CIRCULAR;                       //ģʽ£ºÑ­»··½Ê½
    ADC1_DMA_Handle.Init.Priority = DMA_PRIORITY_VERY_HIGH ;       //DMAµÄÈí¼þÓÅÏȼ¶
    ADC1_DMA_Handle.Init.FIFOMode = DMA_FIFOMODE_DISABLE;          // FIFOģʽ¹Ø±Õ
        
    if(HAL_DMA_Init(&ADC1_DMA_Handle) != HAL_OK)
    {
          Error_Handler(__FILE__, __LINE__);
        
        }
    __HAL_LINKDMA(&ADC1_Handle,DMA_Handle,ADC1_DMA_Handle);   
      
//====================================================================================//
//  ADCÅäÖÃ
        __HAL_RCC_ADC12_CLK_ENABLE(); //ʹÄÜADC1µÄʱÖÓ
        
    ADC1_Handle.Instance = ADC1; //ADC1  
    ADC1_Handle.Init.BoostMode = DISABLE;                         //µ±Ê±ÖÓ³¬¹ý20MHZ,ʹÄÜBoostģʽ
    ADC1_Handle.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1 ;  //ADCʱÖÓ1·ÖƵ  // ; ²ÉÓÃAHBͬ²½Ê±ÖÓ    ADC_CLOCK_ASYNC_DIV2  ADC_CLOCKPRESCALER_PCLK_DIV4
    ADC1_Handle.Init.Resolution = ADC_RESOLUTION_16B;        //·Ö±æÂÊΪ£º16bit
    ADC1_Handle.Init.ScanConvMode = ENABLE;                     //²»Ê¹ÄܶàͨµÀɨÃè
    ADC1_Handle.Init.EOCSelection = ADC_EOC_SINGLE_CONV;  //µ¥´Îת»»
        ADC1_Handle.Init.LowPowerAutoWait = DISABLE;          //¹Ø±ÕµÍ¹¦ºÄ×Ô¶¯µÈ´ý
        ADC1_Handle.Init.ContinuousConvMode = ENABLE;          //ʹÄÜÁ¬Ðøת»»Ä£Ê½
    ADC1_Handle.Init.NbrOfConversion = 1;                    //ɨÃè1¸öͨµÀ
    ADC1_Handle.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;  //  DMAÑ­»··½Ê½½ÓÊÕÊý¾Ý
    ADC1_Handle.Init.DiscontinuousConvMode = DISABLE;        //¹Ø±Õ²»Á¬Ðøת»»Ä£Ê½
    ADC1_Handle.Init.NbrOfDiscConversion = 0;                 // ·ÇÁ¬Ðøת»»¸öÊý
    ADC1_Handle.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;    // Êý¾ÝÓÒ¶ÔÆë   
    ADC1_Handle.Init.ExternalTrigConv = ADC_SOFTWARE_START;  //Èí¼þ´¥·¢
    ADC1_Handle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;     //Êý¾ÝÒç³öʱ£¬¸²¸ÇдÈë
    ADC1_Handle.Init.OversamplingMode = DISABLE;            //½ûֹʹÓùý²ÉÑù
    HAL_ADC_Init(&ADC1_Handle); //³õʼ»¯ ADC1
         
  //====================================================================================//
    // ADCµÄͨµÀÅäÖà    
    ADC_Config.Channel = ADC_CHANNEL_4;  //ʹÓÃͨµÀ10
    ADC_Config.Rank = ADC_REGULAR_RANK_1;  //ת»»Ë³ÐòΪ1  
    ADC_Config.SamplingTime = ADC_SAMPLETIME_64CYCLES_5 ;   
        //²ÉÑùÖÜÆÚΪ64.5¸öÖÜÆÚ
   
        // ADC_AMPLETIME_2CYCLES_5
        // ADC_SAMPLETIME_16CYCLES_5
      // ADC_SAMPLETIME_32CYCLES_5;
        //ADC_SAMPLETIME_64CYCLES_5
    // ADC_SAMPLETIME_387CYCLES_5
    // ADC_SAMPLETIME_810CYCLES_5        
    ADC_Config.SingleDiff = ADC_SINGLE_ENDED ;  //²»Ê¹Óòî·ÖÊäÈëµÄ¹¦ÄÜ
    HAL_ADC_ConfigChannel(&ADC1_Handle, &ADC_Config); //ÅäÖÃADCͨµÀ  
        
    //ʹÄÜADC1
    ADC_Enable(&ADC1_Handle);  
    HAL_ADC_Start_DMA(&ADC1_Handle, (uint32_t*)&ADC_ConvertedValue, 1); //¿ªÆôDMAÊý¾Ý´«Êä
        
        HAL_ADC_Start(&ADC1_Handle); //¿ªÊ¼ADCת»»



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106769
QQ
发表于 2020-5-11 15:37:20 | 显示全部楼层
注意DMA的Cache文件,别的没有要注意的了。
回复

使用道具 举报

8

主题

36

回帖

60

积分

初级会员

积分
60
 楼主| 发表于 2020-5-11 15:49:07 | 显示全部楼层
请问硬汉哥,H750的 DMA方式采集多通道ADC,参考的例子都是用中断来获得数据,这个不用中断可以吗?直接读取SRAM的变量
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106769
QQ
发表于 2020-5-12 07:31:02 | 显示全部楼层
shenxl419 发表于 2020-5-11 15:49
请问硬汉哥,H750的 DMA方式采集多通道ADC,参考的例子都是用中断来获得数据,这个不用中断可以吗?直接读 ...

没问题,之所以采用DMA双缓冲配合中断是为了实时获取数据。

需要直接读取使用,这个章节配套的例子适合你。
http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980&extra=page%3D1

QQ截图20200512073214.png
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2020-5-20 18:21:43 | 显示全部楼层
这里有两块内容,一块是DMA的操作,另一块是串口输出。
DMA的两个中断程序HalfCplt和Cplt都必须能正确地把相应的采样数据从buffer中拷出来。输出动作不要放在中断响应程序中做。

串口输出,不知道你想输出多少内容。串口如果波特率设3Mbps,传输速率就是300kcps。
如果用4个字节表示一个采样数据,加一个空格分隔,300kcps最多每秒显示60k个数据。
2Msps的采样数据,是不可能通过串口全部实时显示出来的。
回复

使用道具 举报

1

主题

11

回帖

14

积分

新手上路

积分
14
发表于 2020-9-16 20:27:05 | 显示全部楼层
定时器触发ADC采样,频率能到多少,我想用3MHz采样,可是一直上不去,我已经降到12Bit,36MHzADC时钟,采样周期是2.5个ADC,不知道为什么还是上不去,手册上写的是能到4点几Mhz,你做过这方面实验吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106769
QQ
发表于 2020-9-16 21:40:39 | 显示全部楼层
bao292387701 发表于 2020-9-16 20:27
定时器触发ADC采样,频率能到多少,我想用3MHz采样,可是一直上不去,我已经降到12Bit,36MHzADC时钟,采样 ...

已经回复

STM32H743adc采样率上不去的问题
http://www.armbbs.cn/forum.php?m ... 0026&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2024-4-22 17:04:17 | 显示全部楼层
bao292387701 发表于 2020-9-16 20:27
定时器触发ADC采样,频率能到多少,我想用3MHz采样,可是一直上不去,我已经降到12Bit,36MHzADC时钟,采样 ...

请问您采样率上去了吗?我现在用的是VBT6 8bit感觉采样率也才4M多,连5M都达不到
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106769
QQ
发表于 2024-4-23 07:51:05 | 显示全部楼层
不吃鱼的猫大人 发表于 2024-4-22 17:04
请问您采样率上去了吗?我现在用的是VBT6 8bit感觉采样率也才4M多,连5M都达不到

注意这个帖子的问题。

STM32H7中ADC功能被ST玩出花,现在分直接通道,快速通道和慢速通道,不同封装最高速不同, LQFP封装速度最低
https://www.armbbs.cn/forum.php?mod=viewthread&tid=97343
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 10:41 , Processed in 0.196783 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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