stm32----ADC模数转换

一、ADC介绍

       ADC,即模数转换器,它可以将模拟信号转化为数字信号。在stm32种一般有3个ADC,每个ADC有18个通道。 12位ADC是一种逐次逼近型模拟数字转换器,它有多达18个通道,可测量16个外部和两个内部信号源。各个通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或者右对齐方式存储在16位数据寄存器中。

        模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。 ADC的输入时钟不得超过14MHz,它是由PCLK2(72M的APB2总线)经分频产生。

二、ADC主要特征

●12位分辨率

● 转换结束、注入转换结束和发生模拟看门狗事件时产生中断

● 单次和连续转换模式

● 从通道0到通道n的自动扫描模式

● 自校准

● 带内嵌数据一致性的数据对齐

● 采样间隔可以按通道分别编程

● 规则转换和注入转换均有外部触发选项

● 间断模式

● 双重模式(带2个或以上ADC的器件)

● ADC转换时间: ─ STM32F103xx增强型产品:时钟为56MHz时为1μs(时钟为72MHz为1.17μs) ─ STM32F101xx基本型产品:时钟为28MHz时为1μs(时钟为36MHz为1.55μs) ─ STM32F102xxUSB型产品:时钟为48MHz时为1.2μs ─ STM32F105xx和STM32F107xx产品:时钟为56MHz时为1μs(时钟为72MHz为1.17μs)

● ADC供电要求:2.4V到3.6V

● ADC输入范围:VREF- ≤ VIN ≤ VREF+

● 规则通道转换期间有DMA请求产生

三、STM32F1 ADC结构框图

这里参照的是stm32中文手册中的图:

 在上图中,可以看出,在这3个ADC中,每个都有16个外部通道(0~15),经GPIO端口到达注入通道或者规则通道,规则通道和注入通道的不同就是:在规则通道中,ADC会按顺序依次扫描每个通道,而注入通道有点像中断,如果ADC正在扫描规则通道,但是有个注入通道,此时会优先扫描注入通道中的数据, 注入通道是不按顺序来的。外部的 16 个通道在转换的时候可分为2组通道:规则通道组和注入 通道组,其中规则通道组最多有16路,注入通道组最多有 4 路。

stm32中GPIO端口对应的ADC通道如下图:

 四、stm32ADC配置步骤

具体配置步骤如下:

(1)使能端口时钟和ADC时钟,设置引脚模式为模拟输入
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AN; //模拟输入模式
(2)设置ADC的分频因子
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
(3)初始化ADC参数,包括ADC工作模式、规则序列等

 void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef*

ADC_InitStruct);
typedef struct
{
uint32_t ADC_Mode; // ADC 工作模式选择
FunctionalState ADC_ScanConvMode; /* ADC 扫描(多通道)或者单
次(单通道)模式选择 */
FunctionalState ADC_ContinuousConvMode; // ADC 单次转换或者连
续转换选择
uint32_t ADC_ExternalTrigConv; // ADC 转换触发信号选择
uint32_t ADC_DataAlign; // ADC 数据寄存器对齐格式
uint8_t ADC_NbrOfChannel; // ADC 采集通道数
} ADC_InitTypeDef;

 (4)使能ADC并校准

void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);
ADC_Cmd(ADC1, ENABLE);//开启AD转换器
执行复位校准的方法是:
ADC_ResetCalibration(ADC1);
执行 ADC 校准的方法是:
ADC_StartCalibration(ADC1); //开始指定 ADC1 的校准状态
while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束
(5)读取ADC转换值
设置规则序列通道以及采样周期的库函数是:
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t);
ADC_Channel,uint8_t Rank, uint8_t ADC_SampleTime);
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1,
ADC_SampleTime_239Cycles5 );
设置好规则序列通道及采样周期,接下来就要开启转换,由于我们采
用的是软件触发,库函数
void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx,
FunctionalState NewState);

 开启转换之后,就可以获取ADC 转换结果数据,调用的库函数是:

uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);
获取 AD 转换的状态信息的库函数是:
FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t
ADC_FLAG);
例如我们要判断 ADC1 的转换是否结束,方法是:
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

钜锋王老师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值