⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stm32_adc.c

📁 stm32f103 ADC驱动程序
💻 C
字号:
#include"stm32_adc.h"
#define u8 unsigned char
#define u16 unsigned int
void stm_adc_rcc_cnf(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;						  

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

	GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1; 
	GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AIN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; 
	GPIO_Init(GPIOB,&GPIO_InitStructure); //默认速度为两兆

}

 void ADC_Configuration(void)
 {

	ADC_InitTypeDef ADC_InitStructure; 

	stm_adc_rcc_cnf();

	ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;
	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_InitStructure.ADC_NbrOfChannel=1;							//通道数,改变通道时记得设置

	ADC_Init(ADC1,&ADC_InitStructure);
//	ADC_RegularChannelConfig(ADC1,ADC_Channel_9,1,ADC_SampleTime_239Cycles5);
//	ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_239Cycles5);

		   //规则组						   此时会根据规矩组里的顺序进行切换测,不过准确度下降了很多!!!!!!!
/*	ADC_RegularChannelConfig(ADC1,ADC_Channel_0,2,ADC_SampleTime_239Cycles5);		  
	ADC_DiscModeChannelCountConfig(ADC1,1);
	ADC_DiscModeCmd(ADC1,ENABLE);	*/



//	ADC_InjectedSequencerLengthConfig(ADC1,2);											 //注入组
//	ADC_SetInjectedOffset(ADC1,ADC_InjectedChannel_1,1);
//	ADC_SoftwareStartInjectedConvCmd(ADC1,ENABLE); //试验 



//	ADC_ExternalTrigConvCmd(ADC1,ENABLE);
	ADC_Cmd (ADC1,ENABLE); //使能或者失能指定的ADC 
	ADC_ResetCalibration(ADC1);
	while(ADC_GetCalibrationStatus(ADC1));
	ADC_StartCalibration(ADC1);
//	ADC_SoftwareStartConvCmd(ADC1,ENABLE); 	//此即为软件触发,进入一次扫描一次
 
 }

 u16 TestAdc_averege(u8 ch) 			//10次取平均
{ 
	u8 i;
	u16 adc=0,adc_num1;
	ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );	//ADC1,ADC通道3,规则采样顺序值为1,采样时间为239.5周期	  			    
	for(i=0;i<10;i++)
	{
		ADC_SoftwareStartConvCmd(ADC1,ENABLE); //试验 
		while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)==RESET); //检查制定ADC标志位置1与否 ADC_FLAG_EOC 转换结束标志位 
		adc_num1=ADC_GetConversionValue(ADC1);
	//	adc_num1=1234;
	//	adc_num2=(330*(adc_num1/4096));
		adc_num1=(u16)((3300*adc_num1)/4096);//(u16)adc_num2;
		adc=adc+adc_num1;
	}
	return (u16)(adc/10);//返回最近一次ADCx规则组的转换结果  不知为啥测的值偏小
}


u16 TestAdc(u8 ch) 						  //单次
{ 
	u16 adc=0;
		ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );	//ADC1,ADC通道3,规则采样顺序值为1,采样时间为239.5周期	  			    
		ADC_SoftwareStartConvCmd(ADC1,ENABLE); //试验 
		while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)==RESET); //检查制定ADC标志位置1与否 ADC_FLAG_EOC 转换结束标志位 
		adc=ADC_GetConversionValue(ADC1);
	//	adc_num1=1234;
	//	adc_num2=(330*(adc_num1/4096));
		adc=(u16)((3300*adc)/4096);//(u16)adc_num2;
	return adc;//返回最近一次ADCx规则组的转换结果  不知为啥测的值偏小
	}
	
					

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -