记录一下stm32F103 ADC的学习心得

记录一下stm32F103 ADC的学习心得

目录

  1. 配置stm32CubeMx
  2. 编写Keil代码

AD的原理在此就不赘述,不了解可以去看下其他文章,说的已经非常详细

一、配置stm32CubeMx
新建一个工程,选择自己的开发板(这里我用的F103RBTx),这里只说一下关于AD的配置,其他的根据需要自行配置
在这里插入图片描述
在这里插入图片描述
这里使用ADC1,打开了三个通道,分别是IN6、内置的一个模拟温度、标准电压通道,按图上所示完成配置,然后添加DMA,设置成circular。
说的
这里使用了一个定时器用于输出采样值,频率的计算如图中的公式,如果不知道时钟频率就去看一下时钟树,看下定时器挂载在那个总线,至此CubeMx就配置完成,点击生成代码。

二、修改Keil代码

HAL_ADCEx_Calibration_Start(&hadc1);
HAL_ADC_Start_DMA(&hadc1,(uint32_t *)&my_adc[0][0],100*3);

第一行用于取消stm32AD内部的自动校准,第二行用于开启DMA采样,第一个参数是AD通道,第二个参数“my_adc”定义成uint16_8,但是参数要求为32位,这里进行了一下强制转换,为什么一开始不定义成32位的呢,因为在开启DMA的时候设置的是half,如图所示:
在这里插入图片描述
第三个参数是取样的长度,由于数组定义成100行三列,所以每次采样的三个数据分别存入每一行

定时器的回调函数定义如下:


void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	
	if(htim==&htim4)
	{
		HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
		x1=my_adc[i][0]*3.3/4095;
		x2=(1.43-my_adc[i][1]*3.3/4095)/0.0043+25;
		x3=my_adc[i][2]*3.3/4095;
		printf("%.2f,%.2f,%.2f",x1,x2,x3);
		i++;
		if(i>99)
			i=0;
	}	
}

这里引用一下计算公式:
在这里插入图片描述
这里说一下除数为什么是4095,AD是12位的,0~4095那是因为按等级分的话4096个数总共有4095段。

猜你喜欢

转载自blog.csdn.net/qq_43644801/article/details/89878887