main.c
#include "stm32f10x.h" // Device header
#include "OLED.h"
#include "adc.h"
uint16_t advalue;
float voltage;
int main(void)
{
OLED_Init();//初始化外设
ad_init();
OLED_ShowString(1,1,"value:");
OLED_ShowString(2,1,"voltage:0.00v");
while(1)//死循环
{
advalue=ad_getvalue();
OLED_ShowNum(1,7,advalue,4);
voltage=(float)advalue/4095*3.3;//max=4095=2的12次 STM32 的 ADC 是 12 位逐次逼近型的模拟数字转换器
OLED_ShowNum(2,9,voltage,1);
OLED_ShowNum(2,11,(uint16_t)(voltage*100)%100,2);
}
}
adc.c
#include "stm32f10x.h" // Device header
void ad_init(void)//rcc时钟(gpio,adc,adcclock)→配置gpio模拟输入模式→接入ad转换器,使用规则组列表→配置adc转换器→开关开启adc
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//adc时钟
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//adcclock=72m/6=12m adc分频→逐次逼近
GPIO_InitTypeDef GPIO_InitStruct;//定义结构体 初始化gpio中一参数
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AIN;//模拟输入模式
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;//使用gpio_a0
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);//初始化gpio
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_41Cycles5);//配置输入通道 选择adc1通道0,将通道0放置于规则组次序1,指定通道采样时间(越短越快,越慢越准)
ADC_InitTypeDef ADC_InitStruct;//定义结构体 初始化adc中一参数
ADC_InitStruct.ADC_Mode=ADC_Mode_Independent;//选择独立模式
ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;//数据右对齐
ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//触发源 使用软件触发
ADC_InitStruct.ADC_ContinuousConvMode=ENABLE;//是否连续转换
ADC_InitStruct.ADC_ScanConvMode=DISABLE;//是否扫描模式
ADC_InitStruct.ADC_NbrOfChannel=1;//扫描模式下,使用通道数
ADC_Init(ADC1, &ADC_InitStruct);//初始化adc
ADC_Cmd(ADC1, ENABLE);//开启adc供电
//adc校准
ADC_ResetCalibration(ADC1);//复位校准
while(ADC_GetResetCalibrationStatus(ADC1)==SET);//等待返回复位校准完成(复位校准标志位为1,校准完成后清零),0时跳出死循环
ADC_StartCalibration(ADC1);//开始校准
while(ADC_GetCalibrationStatus(ADC1)==SET);//获取校准状态,等待校准完成(复位校准标志位为1,校准完成后清零),0时跳出死循环
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//软件触发ad转换
}
uint16_t ad_getvalue(void)//取转换结果
{
return ADC_GetConversionValue(ADC1);//返回转换结果
}
adc.h
#ifndef __ad_h
#define __ad_h
void ad_init(void);
uint16_t ad_getvalue(void);
#endif
OLED模块前有介绍
运行效果
单通道数模转换