STM32F303--ADC简单应用电压检测例程

ADC 作为模拟量检测有很多应用场合,最近用来做一个电压检测。

比较麻烦的是网上好像没有STM32F303这方面的详细资料,官方例程也不全面,只好自己研究做个简单的应用。

PC2作为输入检测脚,对应的ADC通道是PC2----ADC12_IN8。

直接来代码吧,测试完全OK:

void sysTick_delayUs_F303(__IO uint32_t nCount)
{
	for(; nCount != 0; nCount--);
}

void ADC_InitPC2_PC3(void) //OKK
{
	GPIO_InitTypeDef        GPIO_InitStructure;
	ADC_InitTypeDef         ADC_InitStructure;
	ADC_CommonInitTypeDef   ADC_CommonInitSt;
	   
	//初始化时钟和使能GPIO
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ADC12|RCC_AHBPeriph_GPIOC, ENABLE);
	// RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
	
	 /*-------------------------GPIO---------------------------*/
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOC, &GPIO_InitStructure);
	
	/* ADC 时钟配置为 72M/8 */
	RCC_ADCCLKConfig(RCC_ADC12PLLCLK_Div8);

	/* ADC1 DeInit */  
	ADC_DeInit(ADC1);
	
	ADC_StructInit(&ADC_InitStructure);
	/* Calibration procedure */
	ADC_VoltageRegulatorCmd(ADC1, ENABLE);	
	sysTick_delayUs_F303(10);//Insert delay equal to 10
	
	ADC_SelectCalibrationMode(ADC1, ADC_CalibrationMode_Single);
	ADC_StartCalibration(ADC1);
	while(ADC_GetCalibrationStatus(ADC1) != RESET);
	calibration_value = ADC_GetCalibrationValue(ADC1);

/* ADC1 configuration ------------------------------------------------*/
	ADC_CommonInitSt.ADC_Mode = ADC_Mode_Independent;
	ADC_CommonInitSt.ADC_Clock = ADC_Clock_AsynClkMode;
	ADC_CommonInitSt.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
	ADC_CommonInitSt.ADC_DMAMode = ADC_DMAMode_OneShot;//
	ADC_CommonInitSt.ADC_TwoSamplingDelay = 0;//10
	ADC_CommonInit(ADC1, &ADC_CommonInitSt);
	
	//指定是否在中执行转换连续或单模式。
	ADC_InitStructure.ADC_ContinuousConvMode = ADC_ContinuousConvMode_Disable;
	ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
	ADC_InitStructure.ADC_ExternalTrigConvEvent = ADC_ExternalTrigConvEvent_0;
	ADC_InitStructure.ADC_ExternalTrigEventEdge = ADC_ExternalTrigEventEdge_None;
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
	ADC_InitStructure.ADC_OverrunMode = ADC_OverrunMode_Disable;//ADC_OverrunMode_Enable
	ADC_InitStructure.ADC_AutoInjMode = ADC_AutoInjec_Disable;//ADC_AutoInjec_Enable
	ADC_InitStructure.ADC_NbrOfRegChannel = 1;
	ADC_Init(ADC1, &ADC_InitStructure);

	ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_181Cycles5);

	ADC_Cmd(ADC1, ENABLE); //使能ADC1
	/* wait for ADRDY */
	while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_RDY)){;}
	
    /* Start ADC1 Software Conversion */
	ADC_StartConversion(ADC1); //开启AD校准
	while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束		
}

//获得ADC值
//ADC 1~4
//ch:通道值 0~12
unsigned short int Get_Adc(ADC_TypeDef* ADCx,unsigned char ch)   
{
	ADC_StartConversion(ADCx); //不能缺少	
	while(ADC_GetFlagStatus(ADCx, ADC_FLAG_EOC) == RESET);  //等待转换完成
	ADC_ClearFlag(ADCx, ADC_FLAG_EOC);   //清除标志
	return ADC_GetConversionValue(ADCx); //返回最近一次ADC1规则组的转换结果
}

unsigned short int Get_Adc_Average(ADC_TypeDef* ADCx,unsigned char ch,unsigned char times)
{
	unsigned short int temp_val=0,__temp;
	
	ADC_RegularChannelConfig(ADCx, ch, 1, ADC_SampleTime_61Cycles5 );	//ADC1,ADC通道,采样时间为61.5 cycles */
	/* wait for ADRDY */
	while(!ADC_GetFlagStatus(ADCx, ADC_FLAG_RDY));  //等待数据就绪
	/* Start ADC1 Software Conversion */ 
	ADC_StartConversion(ADCx);  //开始转换
	
	sysTick_delayUs_F303(10);

	__temp=Get_Adc(ADCx,ch); 
	temp_val = (__temp*3300)/0xFFF;
	return temp_val;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值