M_adc.c
#include <M_all.h>
//------------------------------------------ADC校准函数(嵌在ADC_init函数内)-----------------------------------------------------//
void ADC_Reset(ADC_TypeDef* ADCx)
{
ADC_ResetCalibration(ADCx);
//复位校准寄存器 寄存器置1
while(ADC_GetResetCalibrationStatus(ADCx));
//等待校准寄存器复位完成 寄存器置0
ADC_StartCalibration(ADCx);
//ADC校准 寄存器置1
while(ADC_GetCalibrationStatus(ADCx));
//等待校准完成 寄存器置0
}
//------------------------------------------ADC初始化函数-----------------------------------------------------//
void adc_init(void)
{
ADC_InitTypeDef ADC_InitStructure;
//结构体_ADC基础-声明
GPIO_InitTypeDef GPIO_InitStructure;
//结构体_引脚基础-声明
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE);
//时钟开启_GPIOA,ADC1
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
//结构体_引脚-PA1
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//结构体_引脚-引脚频率_50Mhz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
//结构体_引脚-引脚模式_模拟输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
//结构体_引脚_结束配置
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
//结构体_ADC-总模式_独立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
//结构体_ADC-是否扫描_单通道
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
//结构体_ADC-是否连续_单次
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
//结构体_ADC-触发方式_软件触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
//结构体_ADC-对齐方式_右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1;
//结构体_ADC-通道个数_单通道
ADC_Init(ADC1, &ADC_InitStructure);
//结构体_ADC_结束配置
// RCC_ADCCLKConfig(RCC_PCLK2_Div2);
//ADC1-时钟分频配置 PS:原始输入的ADC输入时钟是1/2的系统时钟
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_1Cycles5);
//配置内容和ADC外设的具体对接函数 (ADC端口 ,ADC通道 ,转换序号-第几个转换 ,转换的周期)
ADC_Cmd(ADC1,ENABLE);
//开关_ADC-总开关
ADC_Reset(ADC1);
//ADC校准函数
}
//------------------------------------------ADC运算读取数值函数-----------------------------------------------------//
float Read_ADC_data(ADC_TypeDef* ADCx)
{
float kk=0;
ADC_SoftwareStartConvCmd(ADCx,ENABLE);
//开关_ADC软件触发-开关 状态寄存器为0
while(!ADC_GetFlagStatus(ADCx,ADC_FLAG_EOC));
//等待转换结束 寄存器置1
kk=(3.3*(((float)ADC_GetConversionValue(ADCx)/4096)));
//百分比值转化成电压值, 因为读取了数据寄存器,状态寄存器自动清0
return kk;
//返回电压值
}
|