STM32中的ADC

打印 上一主题 下一主题

主题 986|帖子 986|积分 2958

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
目次
一:什么是ADC
二:ADC的用途
三:STM32F103ZET6的ADC
3.1ADC对应的引脚
 3.2ADC时钟
3.3ADC的工作模式
​编辑3.4ADC校准
3.5ADC转换布局和实际电压的换算
四:ADC配置步调
五:两个重要的函数


 
一:什么是ADC


  • ADC(Analog-Digital Converter)模拟-数字转换器,ADC可以将引脚连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁(STM32重要是数字电路,只有高低电平,没有几V的概念,所以如果想读取电压值,就需要借助ADC模数转换器来实现。ADC读取引脚上的模拟电压,转换为一个数据,存在寄存器里,再把数据读取到变量里,就可以举行显示、判断、记录等。)
  • 12位逐次迫近型ADC,1us转换时间
  • 输入电压范围:0-3.3v,转换结果范围:0-4095
  • 18个输入通道,可丈量16个外部和2个内部信号源
  • 规则组和注入组两个转换单元
二:ADC的用途

ADC可以将模拟信号转换成数字信号,比如将模拟的电压转换成数字信号,单片机举行处理。可以用作温度监测或者电流监测等方面,用途极广。
三:STM32F103ZET6的ADC

3.1ADC对应的引脚

STM32F103ZET6的ADC各通道对应IO如下

 3.2ADC时钟

ADC输入时钟ADC_CLK由APB2分频产生,最大值是14MHz。库函数提供了设置分频因子的函数
  1.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  2.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  3.         RCC_ADCCLKConfig(RCC_PCLK2_Div6);//分频
复制代码
可选择的分频因子有

APB2总线时钟为72MHz,而ADC的最大工作频率为14MHz,所以,分频因子一样平常设置为6,这样ADC的输入时钟频率为12MHz。
3.3ADC的工作模式


3.4ADC校准


使能ADC后,需要对ADC举行校准。使用库函数开发时,提供了ADC校准的函数
  1.     //校准
  2.         ADC_ResetCalibration(ADC1);
  3.         while(ADC_GetResetCalibrationStatus(ADC1) == SET);//判断条件是否为SET,是则为真
  4.         ADC_StartCalibration(ADC1);
  5.         while(ADC_GetCalibrationStatus(ADC1) == SET);
复制代码
3.5ADC转换布局和实际电压的换算

获取到的AD转换结果并不是实际电压,如果想要得到实际电压,需要颠末换算。上面介绍了,STM32的ADC为12位,也就是AD值取值范围为0~4095。采集电压范围为0到3.3V。AD值与实际电压之间存在比例关系。
实际电压 = (AD值 / 4095) * 3.3。单元为伏特(V)
四:ADC配置步调



  • 使能GPIO时钟和ADC时钟,设置引脚为模拟输入
  • 设置ADC的分频因子
  • 初始化ADC参数,包括ADC工作模式,规则序列等
  • 使能ADC并校准
  • 触发AD转换,读取AD转换值
    1.         //开启时钟
    2.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    3.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    4.         RCC_ADCCLKConfig(RCC_PCLK2_Div6);//分频
    5.        
    6.         //配置GPIO
    7.         GPIO_InitTypeDef GPIO_InitStructure;
    8.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //配置通道一
    9.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    10.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //在AIN的模式下,GPIO是无效的,模拟电路
    11.         GPIO_Init(GPIOA, &GPIO_InitStructure);
    12.        
    13.         //选择输入通道
    14.         ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);//在规则组菜单列表的第一个位置,写入通道0这个通道
    15.        
    16.         //用结构体初始化ADC
    17.         ADC_InitTypeDef ADC_InitStructure;
    18.         ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式
    19.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐
    20.         ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //禁止触发
    21.         ADC_InitStructure.ADC_ScanConvMode = DISABLE; //非扫描模式
    22.         ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //关闭连续转换
    23.         ADC_InitStructure.ADC_NbrOfChannel = 1;
    24.         ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化
    25.        
    26.         //开启电源
    27.         ADC_Cmd(ADC1, ENABLE);
    28.        
    29.         //校准
    30.         ADC_ResetCalibration(ADC1);
    31.         while(ADC_GetResetCalibrationStatus(ADC1) == SET);//判断条件是否为SET,是则为真
    32.         ADC_StartCalibration(ADC1);
    33.         while(ADC_GetCalibrationStatus(ADC1) == SET);
    复制代码
    五:两个重要的函数

  • void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);ADC_规则组通道配置,它的作用就是给序列的每个位置填写指定的通道第一个参数是ADCx,第二个是你想指定的通道,,第三个是序列几的位置,第四个是指定通道的采样时间
  • uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);获取AD转换的数据寄存器,读取转换结果就用这个函数

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我爱普洱茶

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表