采用hal库,多路采样,发现只要启动ad,ad输入就会莫名其妙有0.4V左右的电压。配置如下, hadc.Instance = ADC1; hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4 ; hadc.Init.Resolution = ADC_RESOLUTION_12B; hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD; hadc.Init.EOCSelection =ADC_EOC_SEQ_CONV;// hadc.Init.LowPowerAutoWait = DISABLE; hadc.Init.LowPowerAutoPowerOff = DISABLE; hadc.Init.ContinuousConvMode = ENABLE;// hadc.Init.DiscontinuousConvMode =DISABLE; hadc.Init.ExternalTrigConv =ADC_SOFTWARE_START; hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc.Init.DMAContinuousRequests = ENABLE; hadc.Init.Overrun =ADC_OVR_DATA_OVERWRITTEN;// if (HAL_ADC_Init(&hadc) != HAL_OK) { Error_Handler(ERR_ADC_init); } __HAL_RCC_DMA1_CLK_ENABLE(); hdma_adc.Instance = DMA1_Channel1; 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_HALFWORD; hdma_adc.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; hdma_adc.Init.Mode = DMA_CIRCULAR; hdma_adc.Init.Priority = DMA_PRIORITY_MEDIUM; if (HAL_DMA_Init(&hdma_adc) != HAL_OK) { Error_Handler(ERR_DMA_Init); } __HAL_DMA1_REMAP(HAL_DMA1_CH1_ADC); __HAL_LINKDMA(&hadc,DMA_Handle,hdma_adc); if (HAL_ADCEx_Calibration_Start(&hadc) != HAL_OK) { Error_Handler(ERR_ADCEx_Cal); } sConfig.Channel = ADC_CHANNEL_0; sConfig.Rank =ADC_RANK_CHANNEL_NUMBER; sConfig.SamplingTime = ADC_SAMPLETIME_13CYCLES_5; if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK) { Error_Handler(ERR_ADC_Config); } sConfig.Channel = ADC_CHANNEL_6; if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK) { Error_Handler(ERR_ADC_Config); } sConfig.Channel = ADC_CHANNEL_7; if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK) { Error_Handler(ERR_ADC_Config); } sConfig.Channel = ADC_CHANNEL_14; if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK) { Error_Handler(ERR_ADC_Config); } sConfig.Channel = ADC_CHANNEL_15; if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK) { Error_Handler(ERR_ADC_Config); } 硬件io配置如下 __HAL_RCC_ADC1_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); /**ADC GPIO Configuration PA0 ------> ADC_IN0 PA6 ------> ADC_IN6 PA7 ------> ADC_IN7 PC4 ------> ADC_IN14 PC5 ------> ADC_IN15 */ GPIO_InitStruct.Pin =AD6_NOISE_Pin| AD0_V25_Pin|AD7_R_Pin; GPIO_InitStruct.Mode =GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed=GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* GPIO_InitStruct.Pin = AD14_R_Pin|AD15_R_Pin; GPIO_InitStruct.Mode =GPIO_MODE_ANALOG; GPIO_InitStruct.Pull =GPIO_NOPULL; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);*/ 之后在while(1)前启动ad,调用如下 HAL_ADC_Start_DMA(&hadc, (uint32_t *)ADCConvertedDMABUF, 5); 之后测量各路的ad输入,正常应该是0V,可测量得到是0.4V左右,ad值为600左右。 |
然后外部引脚最好不要悬空。。。。
评分
查看全部评分
评分
查看全部评分