#include "stm32f10x.h"
#include "delay.h"
#include "usart.h"
#include "MQ135.h"
#include "Serial.h"
int main(void)
{
uint16_t AD0,AD1,AD2;
uart_init(115200);
printf("初始化完成\r\n");
AD_Init();
while(1)
{
AD0 = ADC_Trans(ADC_Channel_0);
// printf("电压为:%f\r\n",3.3/4095*AD);
printf("PA0口烟雾浓度为:%.2f\r\n",AD0 * 99 / 4096.0);
delay_ms(1000);
if(AD0==0)
{
Serial_Printf("PA0口数据异常!\t");
}
AD1 = ADC_Trans(ADC_Channel_1);
printf("PA1口烟雾浓度为:%.2f\r\n",AD1 * 99 / 4096.0);
delay_ms(1000);
if(AD1==0)
{
Serial_Printf("PA1口数据异常!\t");
}
AD2 = ADC_Trans(ADC_Channel_2);
printf("PA2口烟雾浓度为:%.2f\r\n",AD2 * 99 / 4096.0);
delay_ms(1000);
if(AD2==0)
{
Serial_Printf("PA2口数据异常!\t");
}
}
}
上面是main.c的程序!
这是MQ135.c和MQ135.h的程序
#include "stm32f10x.h" // Device header
#include "MQ135.h"
void AD_Init(void) //初始化PA0,PA1,PA2口作为ADC检测端,并且初始化ADC通道1
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;
GPIO_Init(GPIOA,&GPIO_InitStruct);
ADC_InitTypeDef ADC_InitStruct;
ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;
ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;
ADC_InitStruct.ADC_NbrOfChannel = 1;
ADC_InitStruct.ADC_ScanConvMode = DISABLE;
ADC_Init(ADC1,&ADC_InitStruct);
ADC_Cmd(ADC1,ENABLE);
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1)==SET);
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1)==SET);
}
uint16_t ADC_Trans(uint8_t ADC_Channel) //数据处理,求电压值的平均数
{
uint16_t ADC_Value = 0;
uint8_t i = 0;
ADC_RegularChannelConfig(ADC1,ADC_Channel,1,ADC_SampleTime_55Cycles5);
for(i = 0; i < 50; i++)
{
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);
ADC_Value = ADC_Value + ADC_GetConversionValue(ADC1);
}
return ADC_Value / 50;
}
#ifndef __MQ135_H
#define __MQ135_H
void AD_Init(void);
uint16_t ADC_Trans(uint8_t ADC_Channel);
#endif
本来想通过这个程序来依次检测PA0,PA1,PA2三个io口的数据,但是嘞数据总是出现错误。理论上将MQ135连接在PA0口上的时候,PA1和PA2口将不会有数据的产生,但是最后三个口都有数据显示在串口上了,而且拔掉电源也会有数据的显示。萌新想请问一下各位大佬是哪里出错了吗!谢谢!