OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3402|回复: 2

STM32L4x1系列ADC采集问题

[复制链接]

4

主题

13

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2018-7-3
在线时间
9 小时
发表于 2018-9-12 11:47:32 | 显示全部楼层 |阅读模式
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但数值还是不变,难受了。



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

13

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2018-7-3
在线时间
9 小时
 楼主| 发表于 2018-9-12 11:50:28 | 显示全部楼层
连续转换开了之后情况也是一样的。
回复

使用道具 举报

头像被屏蔽

0

主题

2

帖子

0

精华

禁止访问

积分
9
金钱
9
注册时间
2018-9-12
在线时间
1 小时
发表于 2018-9-12 13:57:32 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-9 18:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表