实验目的:掌握STM32L071 ADC的基本功能和编程方法。
实验现象:OLED显示屏显示当前电压转接值。Pot&LED模块插到传感器位置,转动电位器RP2,屏幕显示变化的电压值。
前言:AD转换模块原理图如下
![](https://i-blog.csdnimg.cn/blog_migrate/8cbc1fa5e83fa2194bb60677ff0c9879.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c2712dadf8aa34f5a4e6fbef59b18b07.png)
由原理图可以看出,RP1对应的引脚为PB1即采用通道9,RP2对应的引脚为PB0即采用通道8
一、STM32CubeMX配置
1、配置ADC模块
![](https://i-blog.csdnimg.cn/blog_migrate/1295346f4aca8f4fc8042a48c0198a12.png)
2、配置串口模块
![](https://i-blog.csdnimg.cn/blog_migrate/6b18114772c9c3f16b2cece8def1960b.png)
3、配置时钟模块
![](https://i-blog.csdnimg.cn/blog_migrate/e9120fa51d99cfd9580cefeb57750c42.png)
二、在keil5中添加需要的代码
1、导入赛点资源包中的代码
![](https://i-blog.csdnimg.cn/blog_migrate/42c7dd362dea080625cc3c89339569bf.png)
2、添加实验代码
void Task_BrdInit(void)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);//OLED屏幕供电
HAL_Delay(200);//延时200ms很重要,否则可能会无法显示
OLED_Init();
OLED_Clear();
OLED_ShowString(0, 0, (unsigned char *)" ", 16);
OLED_ShowString(0, 2, (unsigned char *)" ", 16);
OLED_ShowString(0, 0, (unsigned char *)"ADC Test ", 16);
}
void Task_Main(void)
{
float ADC_Value = 0;
char lcdLine_2nd_line[16];
HAL_ADC_Start(&hadc);
ADC_Value=HAL_ADC_GetValue(&hadc)*(3.3/4095);
if (ADC_Value >= 1.5)
{
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_RESET);
}
else
{
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_SET);
}
sprintf(lcdLine_2nd_line, "RP2:%.2fV", ADC_Value);
OLED_ShowString(0, 2, (unsigned char *)lcdLine_2nd_line, 16);
}
}
三、实验现象
![](https://i-blog.csdnimg.cn/blog_migrate/751871528a0f2d3b2c3d5ebfc2d9c2f2.jpeg)