废话少说,开始干起来吧:
*附上实物连接图:
白线两端是MQ135的Vcc和开发板的5V;黑线两端都是地;红线两端是MQ135的AO端和你所倾向的GPIO口。
(之所以出这么保姆级别的教程,是因为我知道大量的人线都不会连,当初我就是,太惨了。哭唧唧)
接线结束:
讲一下重点吧:
1.正点原子的AD采集程序中:
u16 Get_Adc(u8 ch) ;
* 我想说很明显它想说明ch是u8数据
* 但是我们看他的实例里面的采集AD数据代码:
adcx=Get_Adc_Average(ADC_Channel_1,10);
*其中点开ADC_Channel_1;发现它的宏定义如下:
#define ADC_Channel_1 (uint8_t)0x01
*到这儿我的机器便一直死机,但是将(u8 ch)改成(uint8_t ch)检测成功了
a.如图为采集ad函数。查看里面形参的定理
b.发现数据类型uint8_t
你可知道,这一点我用了四个小时才判断出来。把ad的寄存器学了一遍。直至最后才开始怀疑这里。基础不牢啊!!
2.
上代码:
main函数:
#include "delay.h"
#include "sys.h"
#include "tftlcd.h"
#include "mq135.h"
#include "stdio.h"
int main(void)
{
u8 t=0;
u16 adcx;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
LCD_Init(); //初始化LCD
LCD_Clear(MAGENTA);
Adc_Init();
POINT_COLOR = RED;
BACK_COLOR = WHITE;
LCD_ShowString(0, 100, 240, 32, 32, "adc");
LCD_ShowString(0, 140, 240, 24, 24, "vol");
POINT_COLOR = WHITE;
BACK_COLOR = BLUE;
while(1)
{
if(t%10==0) //每100ms读取一次
{
adcx=Get_Adc(ADC_Channel_1);
LCD_ShowNum(0,200,adcx,4,16);
}
delay_ms(100);
t++;
delay_ms(1000);
}
}
MQ135程序:
#include "mq135.h"
#include "stm32f10x_adc.h"
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
//初始化ADC
//这里我们仅以规则通道为例
//我们默认将开启通道0~3
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
//PB0 作为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_DeInit(ADC1); //复位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(uint8_t ch)
{
//设置指定ADC的规则组通道,一个序列,采样时间
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道1,采样时间为239.5周期
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果
}
mq135头文件:
#include "sys.h"
void Adc_Init(void);
u16 Get_Adc(u8 ch);
tftlcd.c:
自己去下载你那个型号尺寸的代码原封不动的放进你的点儿C(mq135.c/spi.c/tftlcd.c)目录下.头文件一样,放在这个目录下。