江协科技初始化ADC的步骤(基于标准库)

一.首先介绍一些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);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值