嵌出式005

本文详细介绍了如何在嵌入式系统中进行AD单通道和多通道初始化配置,包括开启RCC时钟、设置GPIO为模拟输入、配置多路开关、调整ADC参数、使用DMA以及ADC值获取方法。
摘要由CSDN通过智能技术生成

一蓑烟雨任平生!

AD单通道
AD初始化配置
1.开启RCC时钟包括ADC和GPIO时钟,此外ADC CLK的分频器也需要配置一下
2.配置GPIO,把需要的GPIO配置成模拟输入的模式
3.配置多路开关,把左边的通道接入到右边的规则组列表里
4.配置ADC转换器,在库函数中使用的是结构体配置,可以配置一大块电路的参数
5.调用ADC_Cmd函数开启ADC

RCC_ADCCLKConfig(RCC_PCLK2_Div6);//此函数是配置ADC的CLK的,可以对APB2的72M时钟选择2,4,6,8分频,输入到ADCCLK

ADC_Cmd()用于给ADC上电的也就是开关控制
ADC_DMACmd();用于开启DMA输出信号,如果使用DMA转运数据,就得调用这个函数

void AD_Init(void)
{
  
  //1.开启时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  
  RCC_ADCCLKConfig(RCC_PCLK2_Div6);//选择6分配  72/6=12MHZ
  
  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模拟输入模式 ,Ain模式下GPIO是无效,断开GPIO防止GPIO的输入输出对模拟电压产生干扰 也就是说AIN模式是ADC的专属模式
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOA,&GPIO_InitStructure);
  
  //以上GPIOA就被配置成模拟输入的引脚
  
  //选择规则组的输入通道
  ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);//55个ADC的采样周期
  
  //使用结构体初始化  ADC
  
  ADC_InitTypeDef ADC_InitStructure;
  ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;//连续转换模式,可以选择连续或者非连续
  ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//数据对齐,选择左对齐还是右对齐
  ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//触发源使用软件触发,也就是不选择外部触发
  ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//选择ADC独立模式
  ADC_InitStructure.ADC_NbrOfChannel=1;//在扫描模式下指定会使用到几个通道
  ADC_InitStructure.ADC_ScanConvMode=DISABLE;//扫描模式
  
  
  ADC_Init(ADC1,&ADC_InitStructure);
  
  
  //若需要中断或者看门狗可以接着在下面配置,若不需要可以直接开启ADC电源开启使用
  ADC_Cmd(ADC1,ENABLE);
  
  //adc校准
  ADC_ResetCalibration(ADC1);
  while(ADC_GetResetCalibrationStatus(ADC1)==SET);
  ADC_StartCalibration(ADC1);//启动校准
  while(ADC_GetCalibrationStatus(ADC1)==SET);}

/**
  * 函    数:获取AD转换的值
  * 参    数:无
  * 返 回 值:AD转换的值,范围:0~4095
  */
uint16_t AD_GetValue(void)
{
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);					//软件触发AD转换一次
	while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);	//等待EOC标志位,即等待AD转换结束   EOC规则组转换单位
	return ADC_GetConversionValue(ADC1);					//读数据寄存器,得到AD转换的结果
}
   
   
   
   
   
   
  

AD多通道只需要对单通道模式做一个简单修改即可
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
ADC_RegularChannelConfig(ADC1,ADC_Channel,1,ADC_SampleTime_55Cycles5);
uint16_t AD_GetValue(uint ADC_Channel)
{
ADC_SoftwareStartConvCmd(ADC_Channel, ENABLE); //软件触发AD转换一次
while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); //等待EOC标志位,即等待AD转换结束 EOC规则组转换单位
return ADC_GetConversionValue(ADC1); //读数据寄存器,得到AD转换的结果
}

最后只需要在Main函数中调用此函数,把参数改成通道1,通道2。。。等依次调用即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值