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

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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版