新手上路
- 积分
- 48
- 金钱
- 48
- 注册时间
- 2018-7-3
- 在线时间
- 9 小时
|
1金钱
ADC 我配置的12为右对齐,Vref = 2.5(参考电压)
但是 采集回来的数据一直是不变的,给Chanel2不管是多少采集回来的数值一直不变,有大佬看下原因吗?
ADC_HandleTypeDef Adc1_Handle,Adc2_Handle;
ADC_ChannelConfTypeDef sConfig_1;
ADC_ChannelConfTypeDef sConfig_2;
void My_Adc_Init(void)
{
Adc1_Handle.Instance = ADC1;
Adc1_Handle.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1; /* Asynchronous clock mode, input ADC clock not divided */
Adc1_Handle.Init.Resolution = ADC_RESOLUTION_12B; /* 12-bit resolution for converted data */
Adc1_Handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; /* Right-alignment for converted data */
Adc1_Handle.Init.ScanConvMode = DISABLE; /* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */
Adc1_Handle.Init.EOCSelection = ADC_EOC_SINGLE_CONV; /* EOC flag picked-up to indicate conversion end */
Adc1_Handle.Init.LowPowerAutoWait = DISABLE; /* Auto-delayed conversion feature disabled */
Adc1_Handle.Init.ContinuousConvMode = ENABLE; /* Continuous mode disabled to have only 1 conversion at each conversion trig */
Adc1_Handle.Init.NbrOfConversion = 1; /* Parameter discarded because sequencer is disabled */
Adc1_Handle.Init.DiscontinuousConvMode = DISABLE; /* Parameter discarded because sequencer is disabled */
Adc1_Handle.Init.NbrOfDiscConversion = 1; /* Parameter discarded because sequencer is disabled */
Adc1_Handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; /* Software start to trig the 1st conversion manually, without external event */
Adc1_Handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; /* Parameter discarded because software trigger chosen */
Adc1_Handle.Init.DMAContinuousRequests = DISABLE; /* DMA one-shot mode selected (not applied to this example) */
Adc1_Handle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN; /* DR register is overwritten with the last conversion result in case of overrun */
Adc1_Handle.Init.OversamplingMode = DISABLE; /* No oversampling */
Adc2_Handle.Instance = ADC2;
Adc2_Handle.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1; /* Asynchronous clock mode, input ADC clock not divided */
Adc2_Handle.Init.Resolution = ADC_RESOLUTION_12B; /* 12-bit resolution for converted data */
Adc2_Handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; /* Right-alignment for converted data */
Adc2_Handle.Init.ScanConvMode = DISABLE; /* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */
Adc2_Handle.Init.EOCSelection = ADC_EOC_SINGLE_CONV; /* EOC flag picked-up to indicate conversion end */
Adc2_Handle.Init.LowPowerAutoWait = DISABLE; /* Auto-delayed conversion feature disabled */
Adc2_Handle.Init.ContinuousConvMode = DISABLE; /* Continuous mode disabled to have only 1 conversion at each conversion trig */
Adc2_Handle.Init.NbrOfConversion = 1; /* Parameter discarded because sequencer is disabled */
Adc2_Handle.Init.DiscontinuousConvMode = DISABLE; /* Parameter discarded because sequencer is disabled */
Adc2_Handle.Init.NbrOfDiscConversion = 1; /* Parameter discarded because sequencer is disabled */
Adc2_Handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; /* Software start to trig the 1st conversion manually, without external event */
Adc2_Handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; /* Parameter discarded because software trigger chosen */
Adc2_Handle.Init.DMAContinuousRequests = DISABLE; /* DMA one-shot mode selected (not applied to this example) */
Adc2_Handle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN; /* DR register is overwritten with the last conversion result in case of overrun */
Adc2_Handle.Init.OversamplingMode = DISABLE; /* No oversampling */
//初始化ADC12
HAL_ADC_Init(&Adc1_Handle);
HAL_ADC_Init(&Adc2_Handle);
/*ADC1 IN2*/
sConfig_1.Channel = ADC_CHANNEL_2; //通道2
sConfig_1.Rank = ADC_REGULAR_RANK_1; //一个序列
sConfig_1.SamplingTime = LL_ADC_SAMPLINGTIME_47CYCLES_5; //采样时间
sConfig_1.SingleDiff = ADC_SINGLE_ENDED; //单端通道输入
sConfig_1.OffsetNumber = ADC_OFFSET_NONE; //无偏移
sConfig_1.Offset = 0; //由于偏移校正被禁用,参数被丢弃
HAL_ADC_ConfigChannel(&Adc1_Handle, &sConfig_1);
/*ADC2 IN4*/
sConfig_2.Channel = ADC_CHANNEL_4; //通道4
sConfig_2.Rank = ADC_REGULAR_RANK_1; //一个序列
sConfig_2.SamplingTime = ADC_SAMPLETIME_24CYCLES_5; //采样时间
sConfig_2.SingleDiff = ADC_SINGLE_ENDED; //单端通道输入
sConfig_2.OffsetNumber = ADC_OFFSET_NONE; //无偏移
sConfig_2.Offset = 0; //由于偏移校正被禁用,参数被丢弃
HAL_ADC_ConfigChannel(&Adc2_Handle, &sConfig_2);
ADC_Enable(&Adc1_Handle);
ADC_Enable(&Adc2_Handle);
}
下面是数据采集 我只用了Chanel2
uint32_t adc_channel1_avg(ADC_HandleTypeDef* hadc)
{
#define MAX_CNT (5)
uint16_t anum[MAX_CNT] = {0};
int sample_cnt = 0;
/*单端模式下ADC的校准*/
HAL_ADCEx_Calibration_Start(hadc, ADC_SINGLE_ENDED);
/*##-2-启动转换过程*/
HAL_ADC_Start(hadc);
for(;sample_cnt<MAX_CNT;sample_cnt++)
{
HAL_ADC_PollForConversion(hadc,50); //轮询转换
//if(HAL_IS_BIT_SET(HAL_ADC_GetState(&Adc1_Handle), HAL_ADC_STATE_REG_EOC))
anum[sample_cnt] = HAL_ADC_GetValue(hadc);
}
HAL_ADC_Stop(hadc);
return ((anum[0] + anum[1] + anum[2] + anum[3] + anum[4] ) / MAX_CNT);
}
最后是main函数调用
int main(void)
{
HAL_Init();
SystemClock_Config();
My_Usart_Init(115200);
My_Adc_Init();
while(1)
{
Value = adc_channel1_avg(&Adc1_Handle);
printf("ADC_Channel2_Number:%d\r\n",Value);
HAL_Delay(500);
}
}
求大佬指教,怎么回来的数据一直不变啊,我给2.5V采集回来的应该是4096但数值还是不变,难受了。
|
|