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

STM32L071RB ADC 多通道模式

[复制链接]
hellolinux-2302 发布时间:2018-10-20 20:56
项目上要用到STM32L071 ,很简单的采集4个通道的ADC值。网上找了一下什么IT模式,DMA模式.....太多了,太麻烦。我们的应用很简单,就是每隔1秒采集一下ADC IN0,ADC IN1, 内部参考电压, 内部温度传感器4个通道。
首先是ADC初始化,用到了Vrefint,和内部温度传感器。

  1. /* ADC init function */
  2. void MX_ADC_Init(void)
  3. {

  4.   ADC_ChannelConfTypeDef sConfig;

  5.     /**Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
  6.     */
  7.   hadc.Instance = ADC1;
  8.   hadc.Init.OversamplingMode = DISABLE;
  9.   hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
  10.   hadc.Init.Resolution = ADC_RESOLUTION_12B;
  11.   hadc.Init.SamplingTime = ADC_SAMPLETIME_160CYCLES_5;
  12.   hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
  13.   hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  14.   hadc.Init.ContinuousConvMode = DISABLE;
  15.   hadc.Init.DiscontinuousConvMode = ENABLE;
  16.   hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  17.   hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  18.   hadc.Init.DMAContinuousRequests = DISABLE;
  19.   hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  20.   hadc.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  21.   hadc.Init.LowPowerAutoWait = DISABLE;
  22.   hadc.Init.LowPowerFrequencyMode = DISABLE;
  23.   hadc.Init.LowPowerAutoPowerOff = DISABLE;
  24.   if (HAL_ADC_Init(&hadc) != HAL_OK)
  25.   {
  26.     _Error_Handler(__FILE__, __LINE__);
  27.   }
  28.   /* 校正ADC */
  29.   if(HAL_ADCEx_Calibration_Start(&hadc, ADC_SINGLE_ENDED) != HAL_OK)
  30.   {
  31.     _Error_Handler(__FILE__, __LINE__);
  32.   }
  33.   
  34.   /**Configure for the selected ADC regular channel 0 to be converted.*/
  35.   sConfig.Channel = ADC_CHANNEL_0;
  36.   sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
  37.   if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  38.   {
  39.     _Error_Handler(__FILE__, __LINE__);
  40.   }
  41.   /**Configure for the selected ADC regular channel 1 to be converted.*/
  42.   sConfig.Channel = ADC_CHANNEL_1;
  43.   if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  44.   {
  45.     _Error_Handler(__FILE__, __LINE__);
  46.   }
  47.   
  48.   /**Configure for the selected ADC regular channel 17 to be converted.*/
  49.   sConfig.Channel = ADC_CHANNEL_VREFINT;
  50.   if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  51.   {
  52.     _Error_Handler(__FILE__, __LINE__);
  53.   }
  54.   
  55.   /**Configure for the selected ADC regular channel 18 to be converted.*/
  56.   sConfig.Channel = ADC_CHANNEL_TEMPSENSOR;
  57.   if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  58.   {
  59.     _Error_Handler(__FILE__, __LINE__);
  60.   }
  61.   
  62.   HAL_ADCEx_EnableVREFINT();
  63.   HAL_ADCEx_EnableVREFINTTempSensor();
  64. }
复制代码




ADC采样函数
  1. /* Private functions ---------------------------------------------------------*/
  2. #define RES1  10000   //分压电阻R1,10K
  3. #define RES2  10000   //分压电阻R2,10K
  4. #define PRATIO  (RES1+RES2)/(RES2)

  5. #define ADC_12BIT     4095.0
  6. #define ADC_REF       3.3

  7. #define VOL_RADIO     ADC_REF/ADC_12BIT                                                //无电阻分压模式系数
  8. #define BAT_RADIO     (ADC_REF*PRATIO)/ADC_12BIT  //电阻分压模式系数

  9. //温度校正
  10. #define TEMP130_CAL_ADDR ((uint16_t*) ((uint32_t) 0x1FF8007E))
  11. #define TEMP30_CAL_ADDR ((uint16_t*) ((uint32_t) 0x1FF8007A))
  12. #define VDD_CALIB ((uint16_t) (300))
  13. #define VDD_APPLI ((uint16_t) (330))
  14. /*******************************************************************************
  15. * Function Name  : ComputeTemperature
  16. * Description    : Compute STM32 Temperature
  17. * Input          : None
  18. * Output         : None
  19. * Return         : None
  20. *******************************************************************************/
  21. int32_t ComputeTemperature(uint32_t measure)
  22. {
  23.   int32_t temperature;
  24.   temperature = ((measure * VDD_APPLI / VDD_CALIB)- (int32_t) *TEMP30_CAL_ADDR );
  25.   temperature = temperature * (int32_t)(130 - 30);
  26.   temperature = temperature / (int32_t)(*TEMP130_CAL_ADDR - *TEMP30_CAL_ADDR);
  27.   temperature = temperature + 30;
  28.   return(temperature);
  29. }
  30. /*******************************************************************************
  31. * Function Name  : Get_Adc
  32. * Description    : get voltage
  33. * Input          : None
  34. * Output         : None
  35. * Return         : None
  36. *******************************************************************************/
  37. void Get_Adc(void)
  38. {
  39.   u32 adc_value;
  40.   adc_value = 0;

  41.   /*Start the conversion process*/  
  42.   if (HAL_ADC_Start(&hadc) != HAL_OK)
  43.   {
  44.     /* Start Conversation Error */
  45.     Error_Handler();
  46.   }
  47.   HAL_ADC_PollForConversion(&hadc, 50);   
  48.   /* Check if the continous conversion of regular channel is finished */
  49.   if ((HAL_ADC_GetState(&hadc) & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC)
  50.   {
  51.     /*Get the converted value of regular channel */
  52.     adc_value = HAL_ADC_GetValue(&hadc);
  53.   }
  54.   printf("DEBUG: ADC CHANNEL 0  = %fV\r\n", BAT_RADIO*adc_value);                //ADC 通道0 用10K,10K电阻分压

  55.   
  56.   /*Start the conversion process*/  
  57.   if (HAL_ADC_Start(&hadc) != HAL_OK)
  58.   {
  59.     /* Start Conversation Error */
  60.     Error_Handler();
  61.   }
  62.   HAL_ADC_PollForConversion(&hadc, 50);   
  63.   /* Check if the continous conversion of regular channel is finished */
  64.   if ((HAL_ADC_GetState(&hadc) & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC)
  65.   {
  66.     /*Get the converted value of regular channel */
  67.     adc_value = HAL_ADC_GetValue(&hadc);
  68.   }
  69.   printf("DEBUG: ADC CHANNEL 1  = %fV\r\n", VOL_RADIO*adc_value);                //ADC 通道1 没用电阻分压

  70.   
  71.   /*Start the conversion process*/  
  72.   if (HAL_ADC_Start(&hadc) != HAL_OK)
  73.   {
  74.     /* Start Conversation Error */
  75.     Error_Handler();
  76.   }
  77.   HAL_ADC_PollForConversion(&hadc, 50);   
  78.   /* Check if the continous conversion of regular channel is finished */
  79.   if ((HAL_ADC_GetState(&hadc) & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC)
  80.   {
  81.     /*Get the converted value of regular channel */
  82.     adc_value = HAL_ADC_GetValue(&hadc);
  83.   }
  84.   printf("DEBUG: ADC CHANNEL 17 = %fV\r\n", VOL_RADIO*adc_value);        //内部Vref = 1.2V

  85.   
  86.   /*Start the conversion process*/  
  87.   if (HAL_ADC_Start(&hadc) != HAL_OK)
  88.   {
  89.     /* Start Conversation Error */
  90.     Error_Handler();
  91.   }
  92.   HAL_ADC_PollForConversion(&hadc, 50);   
  93.   /* Check if the continous conversion of regular channel is finished */
  94.   if ((HAL_ADC_GetState(&hadc) & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC)
  95.   {
  96.     /*Get the converted value of regular channel */
  97.     adc_value = HAL_ADC_GetValue(&hadc);
  98.   }
  99.   printf("DEBUG: ADC CHANNEL 18 = %d℃\r\n", ComputeTemperature(adc_value));        //内部温度传感器
  100.   
  101.   HAL_ADC_Stop(&hadc);

  102. }
复制代码


收藏 评论5 发布时间:2018-10-20 20:56

举报

5个回答
fanyao-367090 回答时间:2018-10-25 08:56:04
楼主这是吐槽么
hejun1203 回答时间:2018-10-27 15:48:43
shinyzhuo 回答时间:2019-1-4 16:54:20
楼主可以啊,刚好我这就要用ADC来采集电压,先收藏了
hellolinux-2302 回答时间:2019-1-4 17:13:41

ST 给的很多历程太复杂,其实大家的应用都很简单。
shinyzhuo 回答时间:2019-1-14 16:57:20
“Error[Pe020]: identifier "u32" is undefined ”
楼主这个怎么报错呀

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似分享

官网相关资源

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