HAL ADC

ADC读取函数,加了中位均值滤波算法,再读取ADC数据前,调用HAL_ADCEx_Calibration_Start函数,提高ADC的准确度。


int adc_read_withCal(ADC_ChannelConfTypeDef sConfig)
{
	 int max=0,min=4096,volSum=0,failCount=0,ret=0;
	 int voltage=0,current=0,tempVol=0,vol=0,adc_time=20;   //adc read time: 8->20

	 HAL_ADCEx_Calibration_Start(&hadc1);
	 HAL_ADC_ConfigChannel(&hadc1,&sConfig);
	 for( int i=0;i<adc_time;i++){
		 HAL_ADC_Start(&hadc1);
		 HAL_ADC_PollForConversion(&hadc1,100);
		 if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1),HAL_ADC_STATE_REG_EOC))
		 {
			tempVol = HAL_ADC_GetValue(&hadc1);
			volSum += tempVol;
			if(tempVol >= max){
				max = tempVol;
			}
			if(tempVol<= min){
				min = tempVol;
			}
		 }else{
			 failCount++;
		 }
	 }
	 tempVol = (volSum-max-min)/(adc_time-2-failCount);
	 vol = 3300*tempVol/4096;
	 if(sConfig.Channel<6){   //channel 4 ->Vin ,channel 5 -> Vout
     //voltage = 3300*tempVol/4096*33.3;   //33.3009=(1130+36500)/1130; 1mv->33.3mv
		 voltage = (330*333*tempVol)/4096;        //make some change for accuracy
		 ret=voltage;
		 printf("voltage: channel%d adc:%d  %dmv  %dmv\r\n",(int)sConfig.Channel,tempVol,vol,voltage);
	 }else{
		 //current = (3300*tempVol/4096/165*1000;  //channel 7->Iin , channel 9 -> Iout //165mV->1A
		 current = (3300*100*tempVol)/67584;       //make some change for accuracy
		 ret=current;
		 printf("current: channel%d adc:%d  %dmv  %dma\r\n",(int)sConfig.Channel,tempVol,vol,current);

	 }
	 return ret;
}

我写adc读取函数的目的,是为了提高代码的可读性,减少重复代码出现,具体调用方式如下。为了进一步分离功能,还应该把提示语句单独写,我写demo程序,只看功能,就没有进一步规范。

//read every three seconds, 3s读取一次
	 if(count%3==0){
		 sConfig.Rank = ADC_REGULAR_RANK_1;
		 sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
		 sConfig.Channel = ADC_CHANNEL_4;
		 Vin=adc_read_withCal(sConfig);
		 sConfig.Channel = ADC_CHANNEL_5;
		 Vout=adc_read_withCal(sConfig);
		 sConfig.Channel = ADC_CHANNEL_7;
		 adc_read_withCal(sConfig);
		 sConfig.Channel = ADC_CHANNEL_9;
		 adc_read_withCal(sConfig);
	 }

ADC1模块初始化代码,STM32CubeIDE依据图形配置自动生成。


/**
  * @brief ADC1 Initialization Function
  * @param None
  * @retval None
  */
static void MX_ADC1_Init(void)
{

  /* USER CODE BEGIN ADC1_Init 0 */

  /* USER CODE END ADC1_Init 0 */

  ADC_ChannelConfTypeDef sConfig = {0};

  /* USER CODE BEGIN ADC1_Init 1 */

  /* USER CODE END ADC1_Init 1 */

  /** Common config
  */
  hadc1.Instance = ADC1;
  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc1.Init.ContinuousConvMode = DISABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 1;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_4;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN ADC1_Init 2 */

  /* USER CODE END ADC1_Init 2 */

}

图形化配置界面参数设置

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值