#include "adc.h"
#include "delay.h"
#include "oled.h"
//////////////////////////////////////////////////////////////////////////////////
//
//文 件 名 : ADC采集驱动代码 包含 光强显示
// 版 本 号 :
// 作 者 : 辰风
// 生成日期 : 2020-5-25
// 最近修改 :
// 功能描述 :
// 引脚说明:
// ----------------------------------------------------------------
// GND 电源地
// VCC 接5V或3.3v电源
// DATA 接PA1
//
// ----------------------------------------------------------------
//////////////////////////////////////////////////////////////////////////////////
//初始化ADC
//这里我们仅以规则通道为例
//我们默认将开启通道0~3
#define LSENS_READ_TIMES 10 //定义光敏传感器读取次数,读这么多次,然后取平均值
#define LSENS_ADC_CHX ADC_Channel_6 //定义光敏传感器所在的ADC通道编号
u32 temp_val=0;
////////////////////////////////////////////////////////////////////////////////////////
//得到光照强度
int Get_Light(void)
{
int t,DATA;
for(t=0;t<LSENS_READ_TIMES;t++)
{
temp_val+=Get_Adc_Average(ADC_Channel_0,10); ; //读取ADC值ADC_Channel_0-ADC_Channel_3
delay_ms(5);
}
temp_val/=LSENS_READ_TIMES;//得到平均值
if(temp_val>4000)
temp_val=4000;
DATA=99-(temp_val/40);
if(DATA<0)
DATA=0;
return DATA;
}
////////////////////////////////////////////////////////////////////////////////////////
//得到液位
int Get_YeWei(void)
{
int t,DATA;
for(t=0;t<LSENS_READ_TIMES;t++)
{
temp_val+=Get_Adc_Average(ADC_Channel_1,10); ; //读取ADC值ADC_Channel_0-ADC_Channel_3
delay_ms(5);
}
temp_val/=LSENS_READ_TIMES;//得到平均值
if(temp_val>4200)
temp_val=4200;
if(temp_val<2200)
temp_val=2200;
DATA=(temp_val-2200)/20;
if(DATA<0)
DATA=0;
if(DATA>=100)
DATA=99;
return DATA;
}
////////////////////////////////////////////////////////////////////////////////////////
//得到气体
int Get_GAS(void)
{
int t,DATA;
for(t=0;t<LSENS_READ_TIMES;t++)
{
temp_val+=Get_Adc_Average(ADC_Channel_2,10); ; //读取ADC值ADC_Channel_0-ADC_Channel_3
delay_ms(5);
}
temp_val/=LSENS_READ_TIMES;//得到平均值
if(temp_val>4500)
temp_val=4500;
if(temp_val<1500)
temp_val=1500;
DATA=(temp_val-1500)/30;
if(DATA<0)
DATA=0;
if(DATA>=100)
DATA=99;
return DATA;
}
void Light_OLED_DISPLAY(void) // 将光照强度的数据显示在OLED上
{
/////////////////////////////////////////////////////////////////////////////////
int DATA;
unsigned char data[16];
DATA=Get_Light(); //得到光照强度
sprintf(data,":%d",DATA); //转换成字符串
OLED_ShowCHinese(0,4,5);//光
OLED_ShowCHinese(18,4,6);//照
OLED_ShowCHinese(36,4,7);//强
OLED_ShowCHinese(54,4,1);//度
OLED_ShowString(72,4,data,16); //显示光强
///////////////////////////////////////////////////////////////////////////////////////
}
void YeWei_OLED_DISPLAY(void) // 将光照强度的数据显示在OLED上
{
/////////////////////////////////////////////////////////////////////////////////
int DATA;
unsigned char data[16];
DATA=Get_YeWei(); //得到液位
sprintf(data,":%d",DATA); //转换成字符串
OLED_ShowCHinese(0,6,9);//光
OLED_ShowCHinese(18,6,10);//照
OLED_ShowCHinese(36,6,11);//强
OLED_ShowCHinese(54,6,8);//度
OLED_ShowString(72,6,data,16); //显示光强
///////////////////////////////////////////////////////////////////////////////////////
}
void GAS_OLED_DISPLAY(void) // 将光照强度的数据显示在OLED上
{
/////////////////////////////////////////////////////////////////////////////////
int DATA;
unsigned char data[16];
DATA=Get_GAS(); //得到气体
sprintf(data,":%d",DATA); //转换成字符串
OLED_ShowCHinese(0,6,5);//光
OLED_ShowCHinese(18,6,6);//照
OLED_ShowCHinese(36,6,7);//强
OLED_ShowCHinese(54,6,1);//度
OLED_ShowString(72,6,data,16); //显示光强
///////////////////////////////////////////////////////////////////////////////////////
}
///////////////////////////////////////////////////////////////////////////////////////////
void Adc_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE ); //使能ADC1通道时钟
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M
//PA1 作为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
GPIO_Init(GPIOA, &GPIO_InitStructure);
//PA1 作为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
GPIO_Init(GPIOA, &GPIO_InitStructure);
//PA1 作为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
GPIO_Init(GPIOA, &GPIO_InitStructure);
//PA1 作为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_DeInit(ADC1); //复位ADC1
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //模数转换工作在单通道模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模数转换工作在单次转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1
ADC_ResetCalibration(ADC1); //使能复位校准
while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
ADC_StartCalibration(ADC1); //开启AD校准
while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束
// ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
}
//获得ADC值
//ch:通道值 0~3
u16 Get_Adc(u8 ch)
{
//设置指定ADC的规则组通道,一个序列,采样时间
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道,采样时间为239.5周期
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果
}
u16 Get_Adc_Average(u8 ch,u8 times)
{
u32 temp_val=0;
u8 t;
for(t=0;t<times;t++)
{
temp_val+=Get_Adc(ch);
delay_ms(5);
}
return temp_val/times;
}
评论0