硬汉嵌入式论坛

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

[ADC] H750VBT6外部触发ADC采集问题

[复制链接]

20

主题

102

回帖

162

积分

初级会员

积分
162
QQ
发表于 2024-7-24 18:15:15 | 显示全部楼层 |阅读模式
微信截图_20240724181328.png


就是我想问一下:
1.我在keil仿真里面看了一下ADC采集的数据,如果我设置为上升沿外部触发,一下子采集500个点,但是我用杜邦线连接PE11(adc外部触发的一个事件引脚)触碰3.3V的引脚的时候,一次只会采集几个点,这是为啥?
2.如果我设置了外部上升沿触发采集的话,这样我的ADC时钟配置还会有用吗?就是我的ADC的采样率应该和谁有关系?是不是我上升沿触发的频率?
3.当我用一个外部的方波信号触发ADC上升沿采样的时候,这个时候ADC采样率是不是和这个方波的频率一样?

#define ADC_DATA_LENGTH  500  //定义采集数据长度为1024
uint32_t g_adc3_dma_data1[ADC_DATA_LENGTH];//定义adc3采集数据存放数组
uint8_t g_adc3_dma_complete_flag = 0;        //adc3数据dma采集完成标志,在dma采集完成回调函数设置

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) // 处理GPIO_PIN_11的中断事件
{
    if (GPIO_Pin == GPIO_PIN_11)
    {
                HAL_ADC_Start_DMA(&hadc3,g_adc3_dma_data1,ADC_DATA_LENGTH);//ADC的dma开始采集
    }
}       
//        采集完回调函数
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
        if (hadc->Instance == ADC3)
        {
                g_adc3_dma_complete_flag = 1;
                HAL_ADC_Stop_DMA(&hadc3);
        }
}
void SystemClock_Config(void);

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART6_UART_Init();
  MX_ADC3_Init();
  while (1)
                        {
                                if( g_adc3_dma_complete_flag == 1 )//采集数据完成
                                {
                                        for(int i=0;i<ADC_DATA_LENGTH;i++)
                                        {                               
                                                printf("%d\r\n",g_adc3_dma_data1&0x0000ffff);
                                        }
                                g_adc3_dma_complete_flag = 0;       
                                memset(g_adc3_dma_data1,0,ADC_DATA_LENGTH);//清除数据       
                                }                                               
                        }
}
ADC的配置


hadc3.Instance = ADC3;
  hadc3.Init.Resolution = ADC_RESOLUTION_16B;
  hadc3.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc3.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  hadc3.Init.LowPowerAutoWait = DISABLE;
  hadc3.Init.ContinuousConvMode = DISABLE;
  hadc3.Init.NbrOfConversion = 1;
  hadc3.Init.DiscontinuousConvMode = DISABLE;
  hadc3.Init.ExternalTrigConv = ADC_EXTERNALTRIG_EXT_IT11;
  hadc3.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
  hadc3.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_ONESHOT;
  hadc3.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
  hadc3.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
  hadc3.Init.OversamplingMode = DISABLE;

adc时钟配置50M

  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_ADC;
    PeriphClkInitStruct.PLL3.PLL3M = 25;
    PeriphClkInitStruct.PLL3.PLL3N = 200;
    PeriphClkInitStruct.PLL3.PLL3P = 10;
    PeriphClkInitStruct.PLL3.PLL3Q = 10;
    PeriphClkInitStruct.PLL3.PLL3R = 2;
    PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_0;
    PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE;
    PeriphClkInitStruct.PLL3.PLL3FRACN = 0;
    PeriphClkInitStruct.AdcClockSelection = RCC_ADCCLKSOURCE_PLL3;



GPIO_InitStruct.Pin = GPIO_PIN_3;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
    HAL_SYSCFG_AnalogSwitchConfig(SYSCFG_SWITCH_PC3, SYSCFG_SWITCH_PC3_OPEN);

    hdma_adc3.Instance = DMA1_Stream0;
    hdma_adc3.Init.Request = DMA_REQUEST_ADC3;
    hdma_adc3.Init.Direction = DMA_PERIPH_TO_MEMORY;
    hdma_adc3.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_adc3.Init.MemInc = DMA_MINC_ENABLE;
    hdma_adc3.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
    hdma_adc3.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
    hdma_adc3.Init.Mode = DMA_NORMAL;//DMA
    hdma_adc3.Init.Priority = DMA_PRIORITY_LOW;
    hdma_adc3.Init.FIFOMode = DMA_FIFOMODE_DISABLE;

这个是我PE11的配置:

  /*Configure GPIO pin : PE11 */
  GPIO_InitStruct.Pin = GPIO_PIN_11;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;

  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2024-7-25 11:21:41 | 显示全部楼层
我觉得你的设计还是有问题,你这个还是上个帖子的问题吧,而且你这个触发是关联了外部中断的,这样发,触发后就会启动转换的。

不需要你在中断里面再调用HAL_ADC_Start_DMA来启动。初始化完毕ADC,直接调用这个函数就行,另外注意,你确认下,这个外部触发时触发一次,DMA连续转换一轮,还是触发一次转换一次,这个非常重要
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-16 13:49 , Processed in 0.039495 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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