求助:STM32H750VBT6 现在ADC采样只能设置到500K?
我用的芯片是 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_DIV2ADC_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ת»»
注意DMA的Cache文件,别的没有要注意的了。 请问硬汉哥,H750的 DMA方式采集多通道ADC,参考的例子都是用中断来获得数据,这个不用中断可以吗?直接读取SRAM的变量
shenxl419 发表于 2020-5-11 15:49
请问硬汉哥,H750的 DMA方式采集多通道ADC,参考的例子都是用中断来获得数据,这个不用中断可以吗?直接读 ...
没问题,之所以采用DMA双缓冲配合中断是为了实时获取数据。
需要直接读取使用,这个章节配套的例子适合你。
http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980&extra=page%3D1
这里有两块内容,一块是DMA的操作,另一块是串口输出。
DMA的两个中断程序HalfCplt和Cplt都必须能正确地把相应的采样数据从buffer中拷出来。输出动作不要放在中断响应程序中做。
串口输出,不知道你想输出多少内容。串口如果波特率设3Mbps,传输速率就是300kcps。
如果用4个字节表示一个采样数据,加一个空格分隔,300kcps最多每秒显示60k个数据。
2Msps的采样数据,是不可能通过串口全部实时显示出来的。 定时器触发ADC采样,频率能到多少,我想用3MHz采样,可是一直上不去,我已经降到12Bit,36MHzADC时钟,采样周期是2.5个ADC,不知道为什么还是上不去,手册上写的是能到4点几Mhz,你做过这方面实验吗? bao292387701 发表于 2020-9-16 20:27
定时器触发ADC采样,频率能到多少,我想用3MHz采样,可是一直上不去,我已经降到12Bit,36MHzADC时钟,采样 ...
已经回复
STM32H743adc采样率上不去的问题
http://www.armbbs.cn/forum.php?mod=viewthread&tid=100026&fromuid=58
(出处: 硬汉嵌入式论坛)
bao292387701 发表于 2020-9-16 20:27
定时器触发ADC采样,频率能到多少,我想用3MHz采样,可是一直上不去,我已经降到12Bit,36MHzADC时钟,采样 ...
请问您采样率上去了吗?我现在用的是VBT6 8bit感觉采样率也才4M多,连5M都达不到 不吃鱼的猫大人 发表于 2024-4-22 17:04
请问您采样率上去了吗?我现在用的是VBT6 8bit感觉采样率也才4M多,连5M都达不到
注意这个帖子的问题。
STM32H7中ADC功能被ST玩出花,现在分直接通道,快速通道和慢速通道,不同封装最高速不同, LQFP封装速度最低
https://www.armbbs.cn/forum.php?mod=viewthread&tid=97343
页:
[1]