多路ADC实验

adc.c文件:

/*----------------------------------------------------------------
 * 文件名称: 多路ADC采样驱动程序  
 * 主控芯片: STM32F103RBT6        
 * 文件说明: PA0对应ADC_IN0,修改引脚的时候需注意 
 *			  1.GPIO初始化的修改	
 *			  2.Get_Adc(ADC_Channel_x)函数中x的修改
 *			  3.ADC模式设置不用修改
 * 			  4.采样时间设置:设置Get_Adc()中的ADC_SampleTime		  		
 * 创建标识:416实验室  曹毅超
 * 创建时间:2013.5.9   
**----------------------------------------------------------------*/	 
		   
//初始化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_APB2Periph_GPIOx,x=GPIOx
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //AD采样时钟72M/6=12M,不能超过14M,否则精度下降
	//PA0--ADC_IN0  PA1--ADC_IN1  PA2--ADC_IN2  PA3--ADC_IN3  PA4--ADC_IN4  PA5--ADC_IN5  PA6--ADC_IN6  PA7--ADC_IN7  
	//PB0--ADC_IN8  PB1--ADC_IN9  PC0--ADC_IN10  PC1--ADC_IN11  PC2--ADC_IN12  PC3--ADC_IN13  PC4--ADC_IN14  PC5--ADC_IN15                   
	//PA0~3  4路作为模拟通道输入引脚                         
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;		//配置为模拟输入
	GPIO_Init(GPIOA, &GPIO_InitStructure);			  //x=GPIOx

//------------------------------------ADC设置--------------------------------------------------------

	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通道的数目,此处为1个通道
	ADC_Init(ADC1, &ADC_InitStructure);	//根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器   

	ADC_Cmd(ADC1, ENABLE);	//使能指定的ADC1
	ADC_ResetCalibration(ADC1);	//重置指定的ADC1的校准寄存器
	while(ADC_GetResetCalibrationStatus(ADC1));	//获取ADC1重置校准寄存器的状态,直到校准寄存器设置完成
	ADC_StartCalibration(ADC1);		//开始指定ADC1的校准状态
	while(ADC_GetCalibrationStatus(ADC1));		//获取指定ADC1的校准程序,直到校准完成
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);		//使能指定的ADC1的软件转换启动功能

}				  
//获得ADC值
//ch:通道值 0~3
u16 Get_Adc(u8 ch)   
{	unsigned int result=0;
	unsigned char i;

  	//设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
	ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );	//ADC1,ADC通道ch,规则采样顺序值序列为1,采样时间为239.5周期	  			    
  	for(i=0;i<8;i++)
	{
		ADC_SoftwareStartConvCmd(ADC1, ENABLE);		//使能指定的ADC1的软件转换启动功能	 
		while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
		result+=ADC_GetConversionValue(ADC1);
	}
	result=result/8;	 //取8次采样的平均值
	return result;	//返回平均值
}

main.c文件:

int main(void){
   	u16 adcx0,adcx1,adcx2,adcx3,adcx4,adcx5,adcx6;
	float temp0,temp1,temp2,temp3,temp4,temp5,temp6;
	SystemInit();
	delay_init(72);	     //延时初始化
	NVIC_Configuration();
 	uart_init(9600);
 	LCD_Init();		  //PE.ALL,PD1~5
 	Adc_Init();		  //PA0~3
 	LCD_ShowString(60,20,"ADC_CH0_VAL:");	      
	LCD_ShowString(60,40,"ADC_CH0_VOL:0.000V");
	LCD_ShowString(60,60,"ADC_CH1_VAL:");	      
	LCD_ShowString(60,80,"ADC_CH1_VOL:0.000V");
	LCD_ShowString(60,100,"ADC_CH2_VAL:");	      
	LCD_ShowString(60,120,"ADC_CH2_VOL:0.000V");
	LCD_ShowString(60,140,"ADC_CH3_VAL:");	      
	LCD_ShowString(60,160,"ADC_CH3_VOL:0.000V");
	LCD_ShowString(60,180,"ADC_CH4_VAL:");	      
	LCD_ShowString(60,200,"ADC_CH4_VOL:0.000V");
	LCD_ShowString(60,220,"ADC_CH5_VAL:");	      
	LCD_ShowString(60,240,"ADC_CH5_VOL:0.000V");
	LCD_ShowString(60,260,"ADC_CH6_VAL:");	      
	LCD_ShowString(60,280,"ADC_CH6_VOL:0.000V");
 	while(1)
	{
	    /第一路采样程序///
		adcx0=Get_Adc(ADC_Channel_0);//ADC_Channel_x=ADC_INx,0~4096
		LCD_ShowNum(156,20,adcx0,4,16);//显示ADC的值
		temp0=(float)adcx0*(3.3/4096);
		adcx0=temp0;
		LCD_ShowNum(156,40,adcx0,1,16);//显示电压值
		temp0-=adcx0;
		temp0*=1000;
		LCD_ShowNum(172,40,temp0,3,16);
	//	LED0=!LED0;
		///第二路采样程序//
		adcx1=Get_Adc(ADC_Channel_1); //ADC_Channel_x=ADC_INx,0~4096
		LCD_ShowNum(156,60,adcx1,4,16);//显示ADC的值
		temp1=(float)adcx1*(3.3/4096);
		adcx1=temp1;
		LCD_ShowNum(156,80,adcx1,1,16);//显示电压值
		temp1-=adcx1;
		temp1*=1000;
		LCD_ShowNum(172,80,temp1,3,16);
		///第三路采样程序//
		adcx2=Get_Adc(ADC_Channel_2);	//ADC_Channel_x=ADC_INx,0~4096
		LCD_ShowNum(156,100,adcx2,4,16);//显示ADC的值
		temp2=(float)adcx2*(3.3/4096);
		adcx2=temp2;
		LCD_ShowNum(156,120,adcx2,1,16);//显示电压值
		temp2-=adcx2;
		temp2*=1000;
		LCD_ShowNum(172,120,temp2,3,16);
		///第四路采样程序//
		adcx3=Get_Adc(ADC_Channel_3);	//ADC_Channel_x=ADC_INx,0~4096
		LCD_ShowNum(156,140,adcx3,4,16);//显示ADC的值
		temp3=(float)adcx3*(3.3/4096);
		adcx3=temp3;
		LCD_ShowNum(156,160,adcx3,1,16);//显示电压值
		temp3-=adcx3;
		temp3*=1000;
		LCD_ShowNum(172,160,temp3,3,16);
		///第五路采样程序//
		adcx4=Get_Adc(ADC_Channel_4);	//ADC_Channel_x=ADC_INx,0~4096
		LCD_ShowNum(156,180,adcx4,4,16);//显示ADC的值
		temp4=(float)adcx4*(3.3/4096);
		adcx4=temp4;
		LCD_ShowNum(156,200,adcx4,1,16);//显示电压值
		temp4-=adcx4;
		temp4*=1000;
		LCD_ShowNum(172,200,temp4,3,16);
		///第六路采样程序//
		adcx5=Get_Adc(ADC_Channel_5);	//ADC_Channel_x=ADC_INx,0~4096
		LCD_ShowNum(156,220,adcx5,4,16);//显示ADC的值
		temp5=(float)adcx5*(3.3/4096);
		adcx5=temp5;
		LCD_ShowNum(156,240,adcx5,1,16);//显示电压值
		temp5-=adcx5;
		temp5*=1000;
		LCD_ShowNum(172,240,temp5,3,16);
		///第七路采样程序//
		adcx6=Get_Adc(ADC_Channel_6);	//ADC_Channel_x=ADC_INx,0~4096
		LCD_ShowNum(156,260,adcx6,4,16);//显示ADC的值
		temp6=(float)adcx6*(3.3/4096);
		adcx6=temp6;
		LCD_ShowNum(156,280,adcx6,1,16);//显示电压值
		temp6-=adcx6;
		temp6*=1000;
		LCD_ShowNum(172,280,temp6,3,16);
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值