STM32f103c8t6关于用两个ADC采集光强,和土壤温湿度的。

开始的时候打算用一个ADC不同的两个通道对这两个传感器进行数据采集。但是,看了一会别人的博客照着写也还是没有解决,收到的数据就只有一个有用(或者说是一个传感器的数值会被另一个影响) 。最后没办法直接用两个adc非DMA来进行操作

这个ADC1的配置代码引脚是PA1通道也是1。

#include "adc.h"
#include "delay.h"

//static float shidu1;
static float temp_avg;
void Adc_Init(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	ADC_InitTypeDef		ADC_InitStruct;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);
/*PA_1设置为模拟输入*/
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;				 // 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; 		 //模拟输入
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
	GPIO_Init(GPIOA, &GPIO_InitStructure);	

	RCC_ADCCLKConfig(RCC_PCLK2_Div6);//设置ADC分频因子
	
	ADC_DeInit(ADC1);//复位ADC
	
	//初始化ADC参数
	ADC_InitStruct.ADC_ContinuousConvMode=DISABLE;
	ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;
	ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
	ADC_InitStruct.ADC_Mode=ADC_Mode_Independent;
	ADC_InitStruct.ADC_NbrOfChannel=1;
	ADC_InitStruct.ADC_ScanConvMode=DISABLE;
	
	ADC_Init(ADC1, &ADC_InitStruct);
		ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239Cycles5);
	ADC_Cmd(ADC1,ENABLE);//使能ADC1
	
	ADC_ResetCalibration(ADC1);	//使能复位校准  
	 
	while(ADC_GetResetCalibrationStatus(ADC1));	//等待复位校准结束
	
	ADC_StartCalibration(ADC1);	 //开启AD校准
 
	while(ADC_GetCalibrationStatus(ADC1));	 //等待校准结束


		

}

这个ADC2的配置代码。

void Adc_Init2(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	ADC_InitTypeDef		ADC_InitStruct;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_ADC2,ENABLE);
/*PA_1设置为模拟输入*/
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;				 // 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; 		 //模拟输入
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
	GPIO_Init(GPIOB, &GPIO_InitStructure);	

	RCC_ADCCLKConfig(RCC_PCLK2_Div6);//设置ADC分频因子
	
	ADC_DeInit(ADC2);//复位ADC
	
	//初始化ADC参数
	ADC_InitStruct.ADC_ContinuousConvMode=DISABLE;
	ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;
	ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
	ADC_InitStruct.ADC_Mode=ADC_Mode_Independent;
	ADC_InitStruct.ADC_NbrOfChannel=1;
	ADC_InitStruct.ADC_ScanConvMode=DISABLE;
	
	ADC_Init(ADC2, &ADC_InitStruct);
	  ADC_RegularChannelConfig(ADC2,ADC_Channel_9,1,ADC_SampleTime_239Cycles5);
	ADC_Cmd(ADC2,ENABLE);//使能ADC1
	
	ADC_ResetCalibration(ADC2);	//使能复位校准  
	 
	while(ADC_GetResetCalibrationStatus(ADC2));	//等待复位校准结束
	
	ADC_StartCalibration(ADC2);	 //开启AD校准
 
 
	while(ADC_GetCalibrationStatus(ADC2));	 //等待校准结束
		

}

二者大同小异。在配置完成后进行数据的转换。

u16  Get_Light_Adc(u8 ch)
{
	
	ADC_RegularChannelConfig(ADC2,ch,2, ADC_SampleTime_239Cycles5);
	ADC_SoftwareStartConvCmd(ADC2,ENABLE);
	
	while(!ADC_GetFlagStatus(ADC2,ADC_FLAG_EOC));
	
	return ADC_GetConversionValue(ADC2);
}

u16 Get_Light_Adc_Average(u8 ch,u8 times){
	
	u32 temp_val=0;
	u8 t;
	for(t=0;t<times;t++)
	{
		temp_val+=Get_Light_Adc(ch);
		delay_ms(1);
	}
	temp_avg=temp_val/times;
	return (10240000/(1.1*temp_avg)-2500)/1000;
	//return temp_avg;
}
  
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(1);
	}
	temp_avg=temp_val/times;
	return (4092-temp_avg)/3300*100;
}

应为是两个人不同的ADC转换数据,所以这四个函数是两两成对的。(内附的公式是土壤湿度和光强的,个人觉得光强有点不准,我也是和队友一起查了一些关于光强单位写出来的。)

接下来是main.c

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "stdio.h"
#include "dht11.h"
#include "adc.h"

unsigned short int shidu;
unsigned short int light;

float temp_avrg=0;
u8 buff[30];                //参数显示缓存数组
u8 DHT11_Temp,DHT11_Hum;		//温湿度

int main(void)
{	
	delay_init();	    //延时函数初始化
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
	DHT11_Init();
    Adc_Init();
	Adc_Init2();
	uart_init(115200);
while(1)
		{   
			

          shidu=Get_Adc_Average(ADC_Channel_1,10);
				light = Get_Light_Adc_Average(ADC_Channel_9,10);
		   //DHT11_Read_Data(&DHT11_Temp,&DHT11_Hum);
           printf("当前温度:%d度  当前湿度:%d  土壤湿度:%d  光强:%d\r\n",DHT11_Temp,DHT11_Hum,shidu,light);
		
			delay_ms(1000);		
		}
	}

有小伙伴给我解释一下单ADC多通道为什么数据采集有问题,或者说是写了两个通道就一个通道有用。爱你

  • 9
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值