一.首先介绍一些ADC常用函数功能
void ADC_DeInit(ADC_TypeDef* ADCx);//恢复缺省配置
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);//ADC初始化
void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct);//ADC结构体初始化
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);//给ADC上电
void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState);//开启DMA输出信号呢
void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState);//中断输出控制,用于控制某个中断能不能通往NVIC
void ADC_ResetCalibration(ADC_TypeDef* ADCx);//复位校准
FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx);//获取复位校准状态
void ADC_StartCalibration(ADC_TypeDef* ADCx);//开始校准
FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx);//获取开始校准状态
void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);//软件触发函数
FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx);//ADC获取软件开始转换状态
FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);//获取ADC标志位状态,参数给EOC时,判断EOC标志位是否置1
void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number);//每隔几个通道间断一次
void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState);//是否启用间断模式
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);//ADC规则组通道配置 给序列的每个位置填写指定通道 参数1:ADCX 参数2:你指定的通道 参数3:序列几的位置 参数4:指定通道的采样时间
void ADC_ExternalTrigConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);//ADC外部触发转换控制,是否允许外部触发转换
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);//ADC获取转换值 获取ADC转换的数据寄存器,读取转换结果
FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);//获取中断状态
void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);//清除中断挂起位
ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT);//获取ADC中断标志位
void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT);//清除ADC中断标志位
二.程序设计流程
三.程序部分代码
AD初始化代码
#include "stm32f10x.h"
void AD_Init(void)
{
//1.分别开启ADC GPIOA的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//2.配置ADC_CLK获取ADC时钟频率
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//PCLk2的频率为72Mhz ADC的时钟线频率要求小于14Mhz,故选择6分频72/6=12Mhz
//3.配置GPIO
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模拟输入
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_0);
//4.选择规则组的输入通道
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);//在规则组的的序列1的位置写入通道0(本要求只有一个通道)
//5.ADC结构体初始化
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//ADC的工作模式:独立模式
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//ADC数据对齐方式:右对齐
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//启动规则组转换的外部触发源:软件触发
ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;//单次转换
ADC_InitStructure.ADC_ScanConvMode=DISABLE;//非扫描模式
ADC_InitStructure.ADC_NbrOfChannel=1;//非扫描模式下通道无论写多少只有一个通道有用
ADC_Init(ADC1,&ADC_InitStructure);
//6.开启ADC的电源
ADC_Cmd(ADC1,ENABLE);
//7.ADC的校准
ADC_ResetCalibration(ADC1);//复位校准
while(ADC_GetResetCalibrationStatus(ADC1)==SET);//等待复位校准完成:返回复位校准的状态 等待复位校准完成标志位会被硬件清零 如果复位校准没有完成需要在while循环里空等待
ADC_StartCalibration(ADC1);//开启校准
while(ADC_GetCalibrationStatus(ADC1)==SET);//等待校准是否完成 返回校准的状态
}
//启动转换获取结果
uint16_t AD_GetValue(void)
{
//首先进行软件触发转换
ADC_SoftwareStartConvCmd(ADC1,ENABLE);//触发转换ADC可以开始进行转换了
//等待一下获取标志位函数 等待转换完成
while (ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);//选择规则组转换完成标志位 返回值1时表示转换完成 这里让他==0等待
//等待完成之后取结果
return ADC_GetConversionValue(ADC1);//获取ADC1转换值
}
主函数代码:
#include "stm32f10x.h"
#include "OLED.h"
#include "AD.h"
uint16_t ADValue;
float Voltage;
int main(void)
{
AD_Init();
OLED_Init();
OLED_ShowString(1,1,"ADValue:");
OLED_ShowString(2,1,"Voltage:0.00V");
while(1)
{
ADValue=AD_GetValue();
Voltage=(float)ADValue/4095 * 3.3;
OLED_ShowNum(1,9,ADValue,4);
OLED_ShowNum(2,9,Voltage,1);
OLED_ShowNum(2,11,(uint16_t)(Voltage*100)%100,2);
}
}