室内环境检测系统
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

86 lines
3.3 KiB

/*
* @Author: your name
* @Date: 2022-04-23 14:47:47
* @LastEditTime: 2022-04-26 21:25:14
* @LastEditors: your name
* @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
* @FilePath: \USERe:\项目\兼职项目\20220423-IndoorEnvSystem\stm32\HARDWARE\ADC\adc.c
*/
#include "ADC.h"
u32 ADC_SUM_BUF = 0;
u16 ADC_AVG = 0;
void ADC_Init_MY(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO | RCC_APB2Periph_ADC1,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//模拟输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_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_InitStructure.ADC_ContinuousConvMode = DISABLE;//连续模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//配置规则组触发模式软件出发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//数据对其方式16位寄存器12位数据左对齐右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1;//规则通道序列长度
ADC_InjectedChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_239Cycles5);
ADC_InjectedChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239Cycles5);
ADC_Init(ADC1, &ADC_InitStructure);
ADC_Cmd(ADC1,ENABLE);
//下面四个校准函数
ADC_ResetCalibration(ADC1);//重置ADC校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1));//等待重置结束
ADC_StartCalibration(ADC1);//开始校准ADC
while(ADC_GetCalibrationStatus(ADC1));//等待校准结束
}
u16 ADC_Get_Data(void)//获取adc某一通道一次转换结果
{
ADC_ExternalTrigInjectedConvConfig(ADC1,ADC_ExternalTrigInjecConv_None);//配置注入组触发模式
ADC_InjectedSequencerLengthConfig(ADC1, 1);//注入组长度
ADC_InjectedChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_239Cycles5);//配置规则通道
ADC_SoftwareStartInjectedConvCmd(ADC1, ENABLE);//开启软件转换
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_JEOC)); // 清除转换结束标志位等待转换结束
return(ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_1));//得到转换结果
}
u16 ADC_Get_AVG_Data(void)
{
u16 i = 0;
for(i = 0;i < 500;i++)
{
ADC_SUM_BUF = ADC_SUM_BUF + ADC_Get_Data();
}
ADC_AVG = ADC_SUM_BUF /500;
ADC_SUM_BUF = 0;
return(ADC_AVG);
}
u16 ADC_Get_Data1(void)//获取adc某一通道一次转换结果
{
ADC_ExternalTrigInjectedConvConfig(ADC1,ADC_ExternalTrigInjecConv_None);//配置注入组触发模式
ADC_InjectedSequencerLengthConfig(ADC1, 1);//注入组长度
ADC_InjectedChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239Cycles5);//配置规则通道
ADC_SoftwareStartInjectedConvCmd(ADC1, ENABLE);//开启软件转换
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_JEOC)); // 清除转换结束标志位等待转换结束
return(ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_1));//得到转换结果
}