概述
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;
}
最后
以上就是烂漫指甲油为你收集整理的STM32F303--ADC简单应用电压检测例程的全部内容,希望文章能够帮你解决STM32F303--ADC简单应用电压检测例程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复