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

STM32LO51 ADC问题

[复制链接]
小耳朵1500922649 提问时间:2017-12-26 17:08 /
求助,现采用STM32L051采集电压   12位ADC,启用DMA,内部参考电压1.2V 理论上可采集最小值1.2/4096=0.2mV ,但在实际测试8MV以下就检测不到了通道数据为0.  贴出代码,熟悉ADC的大神帮忙看一下,谢谢。//ADC初始化
void MX_ADC_Init(void)
{
  ADC_ChannelConfTypeDef sConfig;

    /**Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
    */
  hadc.Instance = ADC1;
  hadc.Init.OversamplingMode = DISABLE;
  hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV1;
  hadc.Init.Resolution = ADC_RESOLUTION_12B;
  hadc.Init.SamplingTime = ADC_SAMPLETIME_39CYCLES_5;
  hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_BACKWARD;
  hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc.Init.ContinuousConvMode = ENABLE;
  hadc.Init.DiscontinuousConvMode = DISABLE;
  hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc.Init.DMAContinuousRequests = ENABLE;
  hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  hadc.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  hadc.Init.LowPowerAutoWait = DISABLE;
  hadc.Init.LowPowerFrequencyMode = DISABLE;
  hadc.Init.LowPowerAutoPowerOff = DISABLE;
  if (HAL_ADC_Init(&hadc) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure for the selected ADC regular channel to be converted.
    */
  sConfig.Channel = ADC_CHANNEL_4;
  sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure for the selected ADC regular channel to be converted.
    */
  sConfig.Channel = ADC_CHANNEL_5;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure for the selected ADC regular channel to be converted.
    */
  sConfig.Channel = ADC_CHANNEL_6;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure for the selected ADC regular channel to be converted.
    */
  sConfig.Channel = ADC_CHANNEL_7;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure for the selected ADC regular channel to be converted.
    */
  sConfig.Channel = ADC_CHANNEL_8;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure for the selected ADC regular channel to be converted.
    */
  sConfig.Channel = ADC_CHANNEL_9;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure for the selected ADC regular channel to be converted.
    */
  sConfig.Channel = ADC_CHANNEL_TEMPSENSOR;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure for the selected ADC regular channel to be converted.
    */
  sConfig.Channel = ADC_CHANNEL_VREFINT;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}


//主函数
int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_TIM2_Init();
  MX_ADC_Init();
        HAL_ADCEx_Calibration_Start(&hadc,ADC_SINGLE_ENDED);//ADC校准
        HAL_ADC_Start_DMA(&hadc,ADC_Value.ADC_ConvertedValue,ADC_NUMOFCHANNEL);
  MX_USART2_UART_Init();
        if(HAL_TIM_Base_Start_IT(&htim2) != HAL_OK)
        {
                while(1);
        }
  /* USER CODE BEGIN 2 */
        MCU_CHG_Start;
        MCU_DSG_Start;
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE END WHILE */
        HAL_Delay(100);
               
                for(uint16_t index=0; index<ADC_NUMOFCHANNEL; index++)
                        {
                                ADC_Value.ADC_ConvertedVoltage[index]=(uint32_t)(ADC_Value.ADC_ConvertedValueAVER[index]&0xFFF)*ADC_VCC/4096; // mv
                        }
                        Project_Data.NTC1Temperature = (int32_t)get_Temperature(get_Resistance(ADC_Value.ADC_ConvertedVoltage[7]));
                        Project_Data.NTC2Temperature = (int32_t)get_Temperature(get_Resistance(ADC_Value.ADC_ConvertedVoltage[6]));
                        Project_Data.NTC3Temperature = (int32_t)get_Temperature(get_Resistance(ADC_Value.ADC_ConvertedVoltage[5]));
                        Project_Data.NTC4Temperature = (int32_t)get_Temperature(get_Resistance(ADC_Value.ADC_ConvertedVoltage[4]));
                        Project_Data.Current=(ADC_Value.ADC_ConvertedVoltage[3]-ADC_Value.ADC_ConvertedVoltage[2])*1000/Current_Resistance;//MA
               
                //                HAL_IWDG_Refresh(&hiwdg);
  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

}

//定时器0.5ms一次
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
      ADC_Value.ADC_Filter++;       
                        for(uint8_t index=0; index<ADC_NUMOFCHANNEL; index++)
                        {
                                ADC_Value.ADC_ConvertedValueSum[index] += ADC_Value.ADC_ConvertedValue[index];
                        }
               
                        if(ADC_Value.ADC_Filter>=20)//20次滤波
                        {       
                                ADC_Value.ADC_Filter = 0;
                                for(uint8_t index=0; index<ADC_NUMOFCHANNEL; index++)
                                {
                                        ADC_Value.ADC_ConvertedValueAVER[index] = ADC_Value.ADC_ConvertedValueSum[index]/20;
                                        ADC_Value.ADC_ConvertedValueSum[index] = 0;
                                }                                       
                        }                               
}

收藏 评论5 发布时间:2017-12-26 17:08

举报

5个回答
hpdell 回答时间:2017-12-26 17:21:13
内部参考电压是 3.3v 吧

我目前使用是stm32L031的,adc 参考电压貌似是内部 3.3v的

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

小耳朵1500922649 回答时间:2017-12-26 18:41:28
hpdell 发表于 2017-12-26 17:21
内部参考电压是 3.3v 吧

我目前使用是stm32L031的,adc 参考电压貌似是内部 3.3v的 ...

是3.3,记混了。按3.3来算1LSB=3.3/4096=0.8MV,但ADC通道采样实际还是采集不到2MV以下的电压
hpdell 回答时间:2017-12-27 17:20:15
本帖最后由 hpdell 于 2017-12-27 17:22 编辑
小耳朵1500922649 发表于 2017-12-26 18:41
是3.3,记混了。按3.3来算1LSB=3.3/4096=0.8MV,但ADC通道采样实际还是采集不到2MV以下的电压 ...

你看看他内部有没有可以设置参考电压的寄存器 ?
我现在使用 stm32L031xx 这个芯片,采集 adc 电压时,貌似有时不不准,也不知道是怎么回事啊 ?

外部使用 两个 47K 电阻分压,本来想使用 470K的电阻,但是每次开机采集的数据不准,所以就换成了 47K,

换成47K的电阻分压后,刚开机可以采集到准确的adc数据,但是貌似时间运行久了 就不行了,你遇到过这个情况没有啊 ??
小耳朵1500922649 回答时间:2017-12-28 14:13:48
hpdell 发表于 2017-12-27 17:20
你看看他内部有没有可以设置参考电压的寄存器 ?
我现在使用 stm32L031xx 这个芯片,采集 adc 电压时,貌 ...

采集数据不准,是指采集的通道数据跳动很大还是采集的电压值和实际值偏差很大。检查通道的实际电压是否稳定,或者尝试增加采样保持时间,若是采集的数据有波动可再软件处理上增加滤波。
hpdell 回答时间:2017-12-28 16:10:21
小耳朵1500922649 发表于 2017-12-28 14:13
采集数据不准,是指采集的通道数据跳动很大还是采集的电压值和实际值偏差很大。检查通道的实际电压是否稳 ...

我已经加了软件滤波,每次采集10次,只保留中间4次的

采集的电压值说明如下:

比如我第一次采集的是 3.30v
但是时间久了后采集的是 3.322v

电压是保持不变的

所属标签

相似问题

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