STM32F1自带ADC初始化

本文介绍了STM32 ADC的初始化过程,包括ADC框图、ADC初始化结构体的各个参数设置,如模式、扫描模式、连续转换模式等,并提供了ADC时钟分频、通道初始化、软件触发转换等功能的库函数。通过示例代码展示了如何配置ADC1进行单通道、单次转换,并使用软件触发功能进行ADC转换。
摘要由CSDN通过智能技术生成

ADC框图

ADC框图很重要看明白可以节约很多时间
在这里插入图片描述

ADCx引脚

可以初始化ADC通道的引脚,ADC1和ADC2都是一样的通道,ADC3与ADC1和ADC2的Channel4-Channel8是不一样的其他都是一样的。
ADC1-ADC3

ADC初始化结构体

定义的ADC初始化结构体,写对应的寄存器。

//ADC结构体
typedef struct
{
  uint32_t ADC_Mode;                      /* 配置ADC模式 */

  FunctionalState ADC_ScanConvMode;       /*多通道扫描模式或者单通道模式 */

  FunctionalState ADC_ContinuousConvMode; /* 连续转化模式还是单次转换模式*/

  uint32_t ADC_ExternalTrigConv;          /*定义规则通道的外部触发方式*/

  uint32_t ADC_DataAlign;                 /*设置数据对齐方式*/

  uint8_t ADC_NbrOfChannel;               /*设置ADC模拟通道个数*/
}ADC_InitTypeDef;

ADC_Mode ADC的模式

在结构体ADC_InitTypeDef中ADC_Mode可以设置的值:

ADC_Mode_Independent                      //独立模式
ADC_Mode_RegInjecSimult                   //混合的同步规则+注入同步模式
ADC_Mode_RegSimult_AlterTrig              //混合的同步规则+交替出发模式
ADC_Mode_InjecSimult_FastInterl           //混合同步注入+快速交叉模式
ADC_Mode_InjecSimult_SlowInterl           //混合同步注入+慢速交叉模式
ADC_Mode_InjecSimult                      //注入同步模式
ADC_Mode_RegSimult                        //规则同步模式
ADC_Mode_FastInterl                       //快速交叉模式
ADC_Mode_SlowInterl                       //慢速交叉模式
ADC_Mode_AlterTrig  					  //交替触发模式

ADC_ScanConvMode

**在结构体ADC_InitTypeDef中ADC_ScanConvMode可以设置的值: **
DISABLE 不开启扫描模式(单通道采集)
ENABLE 开启扫描模式

ADC_ContinuousConvMode

在结构体ADC_InitTypeDef中ADC_ContinuousConvMode可以设置的值:
DISABLE 单次转换
ENABLE 连续转换
注:在固件库中只要变量类型为FunctionalState一般就只有2个值DISABLE和ENABLE

ADC_ExternalTrigConv

在结构体ADC_InitTypeDef中ADC_ExternalTrigConv可以设置的值:
在这里插入图片描述
在这里插入图片描述

ADC_DataAlign

在这里插入图片描述
在结构体ADC_InitTypeDef中ADC_DataAlign可以设置的值:
ADC_DataAlign_Right 右对齐
ADC_DataAlign_Left 左对齐

ADC_NbrOfChannel

在这里插入图片描述
在结构体ADC_InitTypeDef中ADC_NbrOfChannel可以设置的值:
1-16

固件库中ADC的常用函数

//ADC时钟分频函数
void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);//RCC_PCLK2的值为2、4、6、8
//注:一般不要超过14MHZ,对于不熟悉时钟树的正常情况下只能配置12MHZ

//ADC通道初始化函数
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
//恢复指定ADC的外部寄存器初始值
void ADC_DeInit(ADC_TypeDef* ADCx);
//为ADCx的通道使能采集等级和采集时间
//ADC模拟通道采集时间=12.5+ADC_SampleTime/ADC时钟(us)

//ADC模拟通道最小采集时间是1us (12.5+1.5)/14MHZ=1us
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
//ADC外部设备使能函数
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);
//使能软件触发
void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
//使能外部触发
void ADC_ExternalTrigConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
//使能DMA转化
void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState);

uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx); //返回单通道ADC采集的值
//注:此函数可以准确返回单通道ADC采集的值,但是双通道需要使用中断或者DMA带回ADC采集的值

规则通道软件触发

从上面的ADC框图可以看出好像没有软件触发的方式也没有软件触发的寄存器配置,只有外部触发。看库函数的底层就可以知道软件触发是配置ADC_CR2寄存器的第20位和第22位,开启外部中断和开始转换规则通道(SWSTART)。

void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState)
{
  /* Check the parameters */
  assert_param(IS_ADC_ALL_PERIPH(ADCx));
  assert_param(IS_FUNCTIONAL_STATE(NewState));
  if (NewState != DISABLE)
  {
    /* Enable the selected ADC conversion on external event and start the selected
       ADC conversion */
    ADCx->CR2 |= CR2_EXTTRIG_SWSTART_Set;   //((uint32_t)0x0050 0000)
  }
  else
  {
    /* Disable the selected ADC conversion on external event and stop the selected
       ADC conversion */
    ADCx->CR2 &= CR2_EXTTRIG_SWSTART_Reset;  // ((uint32_t)0xFFAFFFFF)
  }  
}


在这里插入图片描述

ADC初始化(代码)


    ADC_InitTypeDef ADC_InitStructure; 
	GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1, ENABLE );	  //使能ADC1通道时钟
 

	RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //ADC分频因子6,ADC最大时间不能超过14M

	                         
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;		//模拟输入引脚
	GPIO_Init(GPIOA, &GPIO_InitStructure);	

	ADC_DeInit(ADC1);  //复位ADC1 

	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数据右对齐
	ADC_InitStructure.ADC_NbrOfChannel = 1;							    //顺序进行规则转换的ADC通道的数目
	ADC_Init(ADC1, &ADC_InitStructure);	

  
	ADC_Cmd(ADC1, ENABLE);	//使能指定的ADC1
	
	ADC_ResetCalibration(ADC1);	                          //使能复位校准  
	 
	while(ADC_GetResetCalibrationStatus(ADC1));	          //等待复位校准结束
	
	ADC_StartCalibration(ADC1);	                       	  //开启AD校准
 
	while(ADC_GetCalibrationStatus(ADC1));	              //等待校准结束

	ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5 );	//采样时间为239.5周期
	
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);		          //使能指定的ADC1的软件转换启动功能

uint16_t  ADC_ConvertedValueLocal;
ADC_ConvertedValueLocal=ADC_GetConversionValue(ADC1);
printf("%d",ADC_ConvertedValueLocal);
  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嘉鑫的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值