目录
一、前言
学校:合肥工业大学
作者:覃祉禄
MCU:STM32F103C8T6
IDE:Keil u Vision 5
通信模式:ADC模数转换
使用器件:STM32F103C8T6单片机、AO-03 氧气浓度传感器、0.96寸OLED显示屏、电源模块、面包板、杜邦线、跳线等
二、项目简介
AO-03 氧气浓度传感器是一款应用电化学原理测定氧气浓度的传感器。采用模制主体设计,具有响应速度快、准确可靠等特点。AO-03 氧气浓度传感器体积较小,便于安装在便携式仪表上,且与同类型的传感器相比性价比更高。
三、电路设计
1、设计说明
本项目使用的氧气浓度传感器AO-03原理非常简单,如上图所示,其本体已经集成为了一个小模块,该模块仅有3个引脚,及正负电源引脚和AO电压输出引脚,也就是说我们仅需通过将单片机的引脚配置为模拟输入模式,检测传感器AO电压输出引脚的电压,然后再根据电压与氧气浓度的关系转换,即可测量出当前的氧气浓度,通过OLED显示屏显示,从而实现氧气浓度的实时监测。其中电源模块为其提供+5V电压和3.3V电压。
2、接线设计
STM32----------AO-03
PA0-----------AO
+5V----------VCC
GND----------GND
STM32----------OLED
PB8----------SCL
PB9----------SDA
VCC----------VCC
GND----------GND
3、接线说明
STM单片机与AO-03的接线中我们通过配置单片机的PA0为模拟输入模式检测传感器AO端口的氧气浓度。OLED显示屏的接线中用到的是单片机的PA8与PA9,这两个接口使用的是软件读写I2C,可以配置任意引脚,相对比较灵活。我是用的OLED代码是B站up主江协科技STM32教学视频里边OLED模块的代码,大家可以用自己的OLED显示代码或是通过串口的形式在电脑上显示。相应的代码我也会放在我的博客主页中。
4、氧气浓度公式转化
四、代码设计
以下为ADC模拟电压输入的代码设计以及主函数代码,OLED代码沉长这里不在显示,相应的源文件代码和工程文件可以到我的主页下载。
main.c(主函数)
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "AD.h"
uint16_t ADValue;
float Voltage;
float O2;
int main(void)
{
OLED_Init();
AD_Init();
OLED_ShowString(1, 1, "ADValue:");
OLED_ShowString(2, 1, "Voltage:0.00V");
OLED_ShowString(3,1,"O2:00.0%");
while (1)
{
ADValue = AD_GetValue();
Voltage = (float)ADValue / 4095 * 5;
O2 = (float)ADValue * 0.434 - 32; //32是偏差调整
OLED_ShowNum(1, 9, ADValue, 3);
OLED_ShowNum(2, 9, Voltage, 1);
OLED_ShowNum(2, 11,(uint16_t)(Voltage * 100) % 100, 2);
OLED_ShowNum(3, 4, (uint16_t)O2 / 10, 2);
OLED_ShowNum(3, 7, (uint16_t)O2 % 10, 1);
Delay_ms(100);
}
}
delay.c(延时函数源文件)
#include "stm32f10x.h"
/**
* @brief 微秒级延时
* @param xus 延时时长,范围:0~233015
* @retval 无
*/
void Delay_us(uint32_t xus)
{
SysTick->LOAD = 72 * xus; //设置定时器重装值
SysTick->VAL = 0x00; //清空当前计数值
SysTick->CTRL = 0x00000005; //设置时钟源为HCLK,启动定时器
while(!(SysTick->CTRL & 0x00010000)); //等待计数到0
SysTick->CTRL = 0x00000004; //关闭定时器
}
/**
* @brief 毫秒级延时
* @param xms 延时时长,范围:0~4294967295
* @retval 无
*/
void Delay_ms(uint32_t xms)
{
while(xms--)
{
Delay_us(1000);
}
}
/**
* @brief 秒级延时
* @param xs 延时时长,范围:0~4294967295
* @retval 无
*/
void Delay_s(uint32_t xs)
{
while(xs--)
{
Delay_ms(1000);
}
}
delay.h
#ifndef __DELAY_H
#define __DELAY_H
void Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);
#endif
AD.c(模式转换代码)
#include "stm32f10x.h" // Device header
void AD_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
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);
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
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);
ADC_Cmd(ADC1, ENABLE);
ADC_ResetCalibration(ADC1);
while (ADC_GetResetCalibrationStatus(ADC1) == SET);
ADC_StartCalibration(ADC1);
while (ADC_GetCalibrationStatus(ADC1) == SET);
}
uint16_t AD_GetValue(void)
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
return ADC_GetConversionValue(ADC1);
}
AD.h
#ifndef __AD_H
#define __AD_H
#include "stm32f10x.h" // Device header
void AD_Init(void);
uint16_t AD_GetValue(void);
#endif
(以上便是氧气浓度传感器AO-03模块的全部说明,如有不足望指正)