最近的一个项目中,使用了ADC1的ch2/ch3,ADC2的ch4/ch5,共4个通道,要求控制两个ADC分别采集这4路信号,ADC1、ADC2都配置为扫描、非连续、间断,查询方式。
void MX_ADC1_Init(void)
{hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DiscontinuousConvMode = ENABLE;
hadc1.Init.NbrOfDiscConversion = 1;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 2;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}
sConfig.Channel = ADC_CHANNEL_2;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
sConfig.Channel = ADC_CHANNEL_3;
sConfig.Rank = ADC_REGULAR_RANK_2;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
}
void MX_ADC2_Init(void)
{
hadc2.Instance = ADC2;
hadc2.Init.ScanConvMode = ADC_SCAN_ENABLE;
hadc2.Init.ContinuousConvMode = DISABLE;
hadc2.Init.DiscontinuousConvMode = ENABLE;
hadc2.Init.NbrOfDiscConversion = 1;
hadc2.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc2.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc2.Init.NbrOfConversion = 2;
if (HAL_ADC_Init(&hadc2) != HAL_OK)
{
Error_Handler();
}
sConfig.Channel = ADC_CHANNEL_4;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)
{
Error_Handler();
}
sConfig.Channel = ADC_CHANNEL_5;
sConfig.Rank = ADC_REGULAR_RANK_2;
if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)
{
Error_Handler();
}
}
if ( adc1_start )
{
uint16_t v2_cur_value = 0;
uint16_t v3_cur_value = 0;
v2_cur_value = ADC1_IN();
if(v2_cur_value < v1_threshold)
GPIOA->BSRR = (uint32_t)GPIO_PIN_11 << 16; //PA11输出低电平
else
GPIOA->BSRR = GPIO_PIN_11; //PA11输出高电平 }
v3_cur_value = ADC1_IN();
if(v3_cur_value < v2_threshold)
GPIOA->BSRR = (uint32_t)GPIO_PIN_12 << 16; //PA12输出低电平
else
GPIOA->BSRR = GPIO_PIN_12; //PA12输出高电平
HAL_ADC_Stop(&hadc1);
}
if ( adc2_start)
{
uint16_t v3_cur_value = 0;
uint16_t v4_cur_value = 0;
v3_cur_value = ADC2_IN();
if(v3_cur_value < v3_threshold)
GPIOB->BSRR = (uint32_t)GPIO_PIN_3 << 16; //PB3输出低电平
else
GPIOB->BSRR = GPIO_PIN_3; //PB3输出高电平
v4_cur_value = ADC2_IN();
if(v4_cur_value < v4_threshold)
GPIOB->BSRR = (uint32_t)GPIO_PIN_4 << 16; //PB4输出低电平
else
GPIOB->BSRR = GPIO_PIN_4; //PB4输出高电平
HAL_ADC_Stop(&hadc2);
}
uint16_t ADC1_IN(void) //ADC采集程序
{
HAL_ADC_Start(&hadc1);//开始ADC1采集
HAL_ADC_PollForConversion(&hadc1,0xffff);//等待采集结束
if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))//读取ADC完成标志位
{
//HAL_ADC_Stop(&hadc1);
return HAL_ADC_GetValue(&hadc1);//读出ADC数值
}
return 0;
}
uint16_t ADC2_IN(void) //ADC采集程序
{
HAL_ADC_Start(&hadc2);//开始ADC2采集
HAL_ADC_PollForConversion(&hadc2,0xffff);//等待采集结束
if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc2), HAL_ADC_STATE_REG_EOC))//读取ADC完成标志位
{
//HAL_ADC_Stop(&hadc2);
return HAL_ADC_GetValue(&hadc2);//读出ADC数值
}
return 0;
}
现在的问题是,有时候ADC1的ch3通道采集的信号异常,有时候ADC2的ch5通道采集的信号异常,都为固定电平,而其它三个通道采集的数据正确,百思不得其解,求高手相帮,多谢了!
举报
更多回帖