你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F302 ADC问题

[复制链接]
迷... 提问时间:2021-11-17 11:24 / 未解决

我使用ADC进行多通道采样,通道2,5采样正确,通道10,11,15采样同样的信号老是不对。这是什么原因啊

收藏 评论8 发布时间:2021-11-17 11:24

举报

8个回答
废鱼 回答时间:2021-11-17 11:37:06

楼主,最好能贴出ADC的配置,应该采集的值时多少,实际采集到的是多少。这样好帮助分析。

先从配置进行分析,也可以单独进行10 11 15的数据采集来判断是不是配置的问题。

xmshao 回答时间:2021-11-17 11:41:04
你的问题也犹如你ID名“迷”一般。
如果确认通道2、5结果正确,那ADC模块相关硬件及供电一般来讲不会有啥大问题。你检查下目前有问题的通道10/11/15外部线路有无影响AD采用的地方。再就是确认下软件配置方面,重点检查下这块。另外,初始化配置方面尽量使用CubeMx来完成,这样帮你省却很多工作量。
迷... 回答时间:2021-11-17 12:53:51

IO初始化如下

void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(hadc->Instance==ADC1)
{
/* USER CODE BEGIN ADC1_MspInit 0 *//* USER CODE END ADC1_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_ADC1_CLK_ENABLE();__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/**ADC1 GPIO Configuration
PC0     ------> ADC1_IN6
PC1     ------> ADC1_IN7
PC2     ------> ADC1_IN8
PC3     ------> ADC1_IN9
PA1     ------> ADC1_IN2
PA2     ------> ADC1_IN3
PA3     ------> ADC1_IN4
PA4     ------> ADC1_IN5
PA6     ------> ADC1_IN10
PA7     ------> ADC1_IN15
PB0     ------> ADC1_IN11
*/
GPIO_InitStruct.Pin = ADC1_IN6_BDC1_Pin|ADC1_IN7_BDC2_Pin|ADC1_IN8_BDC3_Pin|ADC1_IN9_TEMP_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

GPIO_InitStruct.Pin = ADC1_IN2_VBUS_Pin|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4
                      |GPIO_PIN_6|BLDC_BK_CMP_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

GPIO_InitStruct.Pin = ADC1_IN11_CURR_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(ADC1_IN11_CURR_GPIO_Port, &GPIO_InitStruct);

/* ADC1 DMA Init */
/* ADC1 Init */
hdma_adc1.Instance = DMA1_Channel1;
hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_adc1.Init.Mode = DMA_CIRCULAR;
hdma_adc1.Init.Priority = DMA_PRIORITY_VERY_HIGH;
if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
{
  Error_Handler();
}

__HAL_LINKDMA(hadc,DMA_Handle,hdma_adc1);

/* ADC1 interrupt Init */
HAL_NVIC_SetPriority(ADC1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(ADC1_IRQn);
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/**ADC1 GPIO Configuration
PC0     ------> ADC1_IN6
PC1     ------> ADC1_IN7
PC2     ------> ADC1_IN8
PC3     ------> ADC1_IN9
PA1     ------> ADC1_IN2
PA2     ------> ADC1_IN3
PA3     ------> ADC1_IN4
PA4     ------> ADC1_IN5
PA6     ------> ADC1_IN10
PA7     ------> ADC1_IN15
PB0     ------> ADC1_IN11
*/
GPIO_InitStruct.Pin = ADC1_IN6_BDC1_Pin|ADC1_IN7_BDC2_Pin|ADC1_IN8_BDC3_Pin|ADC1_IN9_TEMP_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

GPIO_InitStruct.Pin = ADC1_IN2_VBUS_Pin|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4
                      |GPIO_PIN_6|BLDC_BK_CMP_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

GPIO_InitStruct.Pin = ADC1_IN11_CURR_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(ADC1_IN11_CURR_GPIO_Port, &GPIO_InitStruct);

/* ADC1 DMA Init */
/* ADC1 Init */
hdma_adc1.Instance = DMA1_Channel1;
hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_adc1.Init.Mode = DMA_CIRCULAR;
hdma_adc1.Init.Priority = DMA_PRIORITY_VERY_HIGH;
if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
{
  Error_Handler();
}

__HAL_LINKDMA(hadc,DMA_Handle,hdma_adc1);

/* ADC1 interrupt Init */
HAL_NVIC_SetPriority(ADC1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(ADC1_IRQn);
/* USER CODE BEGIN ADC1_MspInit 1 *//* USER CODE END ADC1_MspInit 1 */
}}

ADC配置如下

{/* USER CODE BEGIN ADC1_Init 0 *//* USER CODE END ADC1_Init 0 */ADC_ChannelConfTypeDef sConfig = {0};/* USER CODE BEGIN ADC1_Init 1 *//* USER CODE END ADC1_Init 1 */
/** Common config
*/
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 10;
hadc1.Init.DMAContinuousRequests = ENABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc1.Init.LowPowerAutoWait = DISABLE;
hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}
/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_6;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SingleDiff = ADC_SINGLE_ENDED;
sConfig.SamplingTime = ADC_SAMPLETIME_7CYCLES_5;
sConfig.OffsetNumber = ADC_OFFSET_NONE;
sConfig.Offset = 0;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_7;
sConfig.Rank = ADC_REGULAR_RANK_2;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_8;
sConfig.Rank = ADC_REGULAR_RANK_3;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_2;
sConfig.Rank = ADC_REGULAR_RANK_4;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_10;
sConfig.Rank = ADC_REGULAR_RANK_5;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_11;
sConfig.Rank = ADC_REGULAR_RANK_6;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_15;
sConfig.Rank = ADC_REGULAR_RANK_7;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_3;
sConfig.Rank = ADC_REGULAR_RANK_8;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_4;
sConfig.Rank = ADC_REGULAR_RANK_9;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_5;
sConfig.Rank = ADC_REGULAR_RANK_10;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN ADC1_Init 2 *//* USER CODE END ADC1_Init 2 */}
废鱼 回答时间:2021-11-17 14:15:14

楼主,能详细说一下你的芯片类型吗?我用CubeMx查到PA6用的是ADC2,你看一下CubeMx的硬件配置。

迷... 回答时间:2021-11-17 16:37:12

废鱼 发表于 2021-11-17 14:15
楼主,能详细说一下你的芯片类型吗?我用CubeMx查到<code>A6</code>用的是ADC2,你看一下CubeMx的硬件配置。 ...

[md]芯片型号是STM32F302R8T6。

启用的通道6,7,8也能正常工作。

现在通道3和15接一起,通道3测出0x03F正确。通道15测出0xFBD-0xFBE。

通道10现在没接信号,也没复用其他功能,浮空的,测出来是0x777-78A。

之前怀疑是高速通道和低速通道可能不一样,现在可以排除了。

ADC使用Cube配置,用户代码里面就开启DMA连续采集,没有改动。

废鱼 回答时间:2021-11-18 08:40:28

hadc1.Init.NbrOfConversion = 10;看一下这里,我看你配置的是要采集11个AD值,这里写的是10个。

xmshao 回答时间:2021-11-19 11:16:35

除了检查电源外,再确认下有无干扰问题。

我刚用F302测试10 11 15通道,结果很好,下面是3组数据。CH10接地,CH11悬空,CH15接VDDA.

image.png

我使用CubeMx进行配置的,没啥特别的。

static void MX_ADC1_Init(void) {

/ USER CODE BEGIN ADC1_Init 0 /

/ USER CODE END ADC1_Init 0 /

ADC_ChannelConfTypeDef sConfig = {0};

/ USER CODE BEGIN ADC1_Init 1 /

/ USER CODE END ADC1_Init 1 / / Common config */ hadc1.Instance = ADC1; hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1; hadc1.Init.Resolution = ADC_RESOLUTION_12B; hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE; hadc1.Init.ContinuousConvMode = DISABLE; hadc1.Init.DiscontinuousConvMode = DISABLE; hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING; hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_TRGO; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc1.Init.NbrOfConversion = 3; hadc1.Init.DMAContinuousRequests = ENABLE; hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; hadc1.Init.LowPowerAutoWait = DISABLE; hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN; if (HAL_ADC_Init(&hadc1) != HAL_OK) { Error_Handler(); } /* Configure Regular Channel / sConfig.Channel = ADC_CHANNEL_10; sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.SingleDiff = ADC_SINGLE_ENDED; sConfig.SamplingTime = ADC_SAMPLETIME_181CYCLES_5; sConfig.OffsetNumber = ADC_OFFSET_NONE; sConfig.Offset = 0; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } / Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_11; sConfig.Rank = ADC_REGULAR_RANK_2; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /* Configure Regular Channel / sConfig.Channel = ADC_CHANNEL_15; sConfig.Rank = ADC_REGULAR_RANK_3; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } / USER CODE BEGIN ADC1_Init 2 /

/ USER CODE END ADC1_Init 2 /

}

the360 回答时间:2022-10-9 13:02:55
这个问题解决了吗?我使用STM32F302C8T6也遇到同样的问题。使用1,2,3,4,5,10,11,12,8个通道,其中1,2,3,4,这4个通道采样正常;5,10这2个通道采集值一直为0;11,12这2个通道采集值一直是4080左右。

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版