ST意法半导体
直播中

石利军

8年用户 983经验值
私信 关注
[问答]

STM32F405 ADC内部上拉的问题求解

我正在使用带有 DMA(循环)的三重同时转换 ADC(每个 2 次转换):
  • static void MX_ADC1_Init(void)
  • {
  •   ADC_MultiModeTypeDef multimode = {0};
  •   ADC_ChannelConfTypeDef sConfig = {0};
  •   /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
  •   */
  •   hadc1.Instance = ADC1;
  •   hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
  •   hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  •   hadc1.Init.ScanConvMode = ENABLE;
  •   hadc1.Init.ContinuousConvMode = DISABLE;
  •   hadc1.Init.DiscontinuousConvMode = DISABLE;
  •   hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
  •   hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T8_TRGO;
  •   hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  •   hadc1.Init.NbrOfConversion = 2;
  •   hadc1.Init.DMAContinuousRequests = ENABLE;
  •   hadc1.Init.EOCSelection = ADC_EOC_SEQ_CONV;
  •   if (HAL_ADC_Init(&hadc1) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   /** Configure the ADC multi-mode
  •   */
  •   multimode.Mode = ADC_TRIPLEMODE_REGSIMULT;
  •   multimode.DMAAccessMode = ADC_DMAACCESSMODE_1;
  •   multimode.TwoSamplingDelay = ADC_TWOSAMPLINGDELAY_5CYCLES;
  •   if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
  •   */
  •   sConfig.Channel = ADC_CHANNEL_12;
  •   sConfig.Rank = 1;
  •   sConfig.SamplingTime = ADC_SAMPLETIME_28CYCLES;
  •   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
  •   */
  •   sConfig.Channel = ADC_CHANNEL_7;
  •   sConfig.Rank = 2;
  •   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  • }
  • /**
  •   * @brief ADC2 Initialization Function
  •   * @param None
  •   * @retval None
  •   */
  • static void MX_ADC2_Init(void)
  • {
  •   ADC_ChannelConfTypeDef sConfig = {0};
  •   /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
  •   */
  •   hadc2.Instance = ADC2;
  •   hadc2.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
  •   hadc2.Init.Resolution = ADC_RESOLUTION_12B;
  •   hadc2.Init.ScanConvMode = ENABLE;
  •   hadc2.Init.ContinuousConvMode = DISABLE;
  •   hadc2.Init.DiscontinuousConvMode = DISABLE;
  •   hadc2.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  •   hadc2.Init.NbrOfConversion = 2;
  •   hadc2.Init.DMAContinuousRequests = DISABLE;
  •   hadc2.Init.EOCSelection = ADC_EOC_SEQ_CONV;
  •   if (HAL_ADC_Init(&hadc2) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
  •   */
  •   sConfig.Channel = ADC_CHANNEL_11;
  •   sConfig.Rank = 1;
  •   sConfig.SamplingTime = ADC_SAMPLETIME_28CYCLES;
  •   if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
  •   */
  •   sConfig.Channel = ADC_CHANNEL_14;
  •   sConfig.Rank = 2;
  •   if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  • }
  • /**
  •   * @brief ADC3 Initialization Function
  •   * @param None
  •   * @retval None
  •   */
  • static void MX_ADC3_Init(void)
  • {
  •   ADC_ChannelConfTypeDef sConfig = {0};
  •   /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
  •   */
  •   hadc3.Instance = ADC3;
  •   hadc3.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
  •   hadc3.Init.Resolution = ADC_RESOLUTION_12B;
  •   hadc3.Init.ScanConvMode = ENABLE;
  •   hadc3.Init.ContinuousConvMode = DISABLE;
  •   hadc3.Init.DiscontinuousConvMode = DISABLE;
  •   hadc3.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  •   hadc3.Init.NbrOfConversion = 2;
  •   hadc3.Init.DMAContinuousRequests = DISABLE;
  •   hadc3.Init.EOCSelection = ADC_EOC_SEQ_CONV;
  •   if (HAL_ADC_Init(&hadc3) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
  •   */
  •   sConfig.Channel = ADC_CHANNEL_10;
  •   sConfig.Rank = 1;
  •   sConfig.SamplingTime = ADC_SAMPLETIME_28CYCLES;
  •   if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
  •   */
  •   sConfig.Channel = ADC_CHANNEL_13;
  •   sConfig.Rank = 2;
  •   if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  • }
我的问题是 ADC3 (PC3) 的通道 13 - 它正在测量一个简单的分压器:

即使在移除 R2 和 C2 之后,万用表和 ADC 都显示在 3.2V 左右(似乎内部上拉)。例如,当我将引脚模式更改为 AF_OD 或 OUTPUT_OD 时,电压为 0.6-0.8V。但是,如果我切换回模拟,无论如何电压都会升至 3.2。我在 C2 的位置焊接了 6k8 电阻以产生更强的下拉,但这并没有改变任何事情......
关于可能是什么问题的任何想法?








回帖(1)

刘颖

2022-12-6 10:58:08
也许芯片有问题,由于这个引脚上的静电放电......?(短路保护二极管)
你能试试另一个芯片吗?
或使用其他尚未损坏的输入通道/引脚进行测试?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分