【STM32外设】ADC

声明:上图是STM32产品型号各字段含义,本文基于STM32F103

1、ADC的一些概念

常规通道(常规组)和注入通道(注入组)(regular channels and injected channels)

ADC支持的外部通道总共16个(且被3个ADC共享,ADC123),每个通道只能三种状态取其一:作为常规通道(最多能定义16个)、作为注入通道(最多能定义4个)、未配置。

划进常规组的通道即为最普通、最常用的通道,所有通道都是按程序员指定的顺序依次转换,不争不抢。

划进注入组的通道,优先级高,一旦触发,可以打断常规组中正在执行的A/D转换,并保存常规组的上下文,待注入组都转换完了,再切回常规组执行(可以按中断理解)。

独立模式和并行模式(Independent mode and Dual mode)

独立模式是指各个ADC独立运行,不与其他ADC的运行耦合。当然,一个ADC也可以整出很多模式。

并行模式是指两个ADC协作运行,STM32特指ADC1和ADC2协作运行,这又可以产生很多协作方式,当然,也产生了很多模式。

独立模式

单次转换模式(0)、扫描运行模式、扫描+连续运行模式、间断运行模式。

连续转换模式(1)。

注:单次转换模式和连续运行模式的使能共用一个Bit。0表示单次转换模式,1表示连续转换模式。

并行模式

常规并行模式、常规快速交叉模式、常规慢速交叉模式。

综上所述,独立模式中的单次转换模式最为普通,构建起来最为简单。

2、ADC 寄存器

ADC->SR:ADC status register,开发ADC必用的一个寄存器。

Address offset: 0x00  Reset value: 0x0000 0000

rc_w0含义:Software can read as well as clear this bit by writing 0. Writing '1' has no effect on the bit value.

  • Bit4 STRT:Regular channel Start flag,当规则通道开始转换时由硬件置位,由软件复位。用于查询。
    0:无规则通道启动转换  1:有规则通道启动转换
  • Bit1 EOC:End of conversion,一个或一组通道转换完成时由硬件置位,由软件复位或通过读ADC->DR寄存器复位。用于查询。
    0:转换未完成  1:转换已完成
    ADC->CR1:ADC control register 1,开发ADC必用的一个寄存器。

Address offset: 0x04  Reset value: 0x0000 0000

  • Bits19:16 DUALMOD[3:0]:Dual mode selection,全零就是独立模式。由软件设置。
    0000: Independent mode.
    0001: Combined regular simultaneous + injected simultaneous mode
    0010: Combined regular simultaneous + alternate trigger mode
    0011: Combined injected simultaneous + fast interleaved mode
    0100: Combined injected simultaneous + slow Interleaved mode
    0101: Injected simultaneous mode only
    0110: Regular simultaneous mode only
    0111: Fast interleaved mode only
    1000: Slow interleaved mode only
    1001: Alternate trigger mode only
    ADC->CR2:ADC control register 2,开发ADC必用的一个寄存器。

Address offset: 0x08  Reset value: 0x0000 0000

  • Bit22 SWSTART:Start conversion of regular channels,软件触发通道转换,由软件置位,转换开始后由硬件复位。

    0:复位值  1:启动常规通道转换

  • Bit20 EXTTRIG:External trigger conversion mode for regular channels,外部事件触发常规通道开启转换的使能位,

    由软件设置。0:禁止外部事件触发转换  1:允许外部事件对转换的触发。

  • Bits19:17 EXTSEL[2:0]:External event select for regular group,选择外部事件,由软件设置。

    以下仅给出ADC12的,ADC3不同但未给出,

    000: Timer 1 CC1 event

    001: Timer 1 CC2 event

    010: Timer 1 CC3 event

    011: Timer 2 CC2 event

    100: Timer 3 TRGO event

    101: Timer 4 CC4 event

    110: EXTI line 11/TIM8_TRGO event (TIM8_TRGO is available only in high-density and XLdensity devices)

    111: SWSTART(software start,由软件触发,即置位Bit22)

  • Bit11 ALIGN:Data alignment,由软件设置。

    0:12位数据右对齐  1:12位数据左对齐

  • Bit 1 CONT:Continuous conversion,连续转换或单次转换模式选择位,由软件设置。

    0:开启单次转换模式  1:开启连续转换模式

ADC->SMPR1: ADC sample time register 1,设置每个通道的采样时间,共18个通道,每通道3bit,因此使用了两个寄存器。

Address offset: 0x0C  Reset value: 0x0000 0000

  • 注:ADC1 ch17接内部温度传感器、ch16接内部VREFINT
      ADC2 ch17 ch16都接内部VSS
      ADC3 ch17 ch16 ch15 ch14都接VSS

ADC->SMPR2: ADC sample time register 1,开发ADC必用的寄存器。

Address offset: 0x10  Reset value: 0x0000 0000

  • Bits29:0 SMPx[2:0]: Channel x Sample time selection,由软件设置。
    000: 1.5 cycles
    001: 7.5 cycles
    010: 13.5 cycles
    011: 28.5 cycles
    100: 41.5 cycles
    101: 55.5 cycles
    110: 71.5 cycles
    111: 239.5 cycles
  • 注:ADC3 ch9接到了VSS
    ADC->JOFRx(x=1...4):ADC injected channel data offset register x,用不到,暂不作说明。

Address offset: 0x14-0x20  Reset value: 0x0000 0000
ADC->HTR:ADC watchdog High Threshold register,用不到,暂不作说明。

Address offset: 0x24  Reset value: 0x0000 0FFF

ADC->LTR:ADC watchdog low threshold register,用不到,暂不作说明。

Address offset: 0x28  Reset value: 0x0000 0000
ADC->SQR1:ADC regular sequence register 1,用于扫描模式下确认先后顺序,用不到,暂不作说明。

Address offset: 0x2C  Reset value: 0x0000 0000

ADC->SQR2:ADC regular sequence register 2,每通道占5bit,因此用3个寄存器。

Address offset: 0x30  Reset value: 0x0000 0000

ADC->SQR3:ADC regular sequence register 3,

Address offset: 0x34  Reset value: 0x0000 0000
ADC->JSQR:ADC injected sequence register,注入通道在扫描模式下也要有先后顺序。用不到,暂不作说明。

Address offset: 0x38  Reset value: 0x0000 0000
ADC->JDRx(x=1...4):ADC injected data register x,划进注入组的每个通道独享数据寄存器。用不到,暂不作说明。

Address offset: 0x3C - 0x48  Reset value: 0x0000 0000
ADC->DR:ADC regular data register,常规通道共享一个数据寄存器,开发ADC必用的一个寄存器。

Address offset: 0x4C  Reset value: 0x0000 0000

  • Bits31:16 ADC2DATA[15:0]:ADC2 data
    In ADC1:在并行模式下,存放ADC2的数据
  • Bits15:0 DATA[15:0]:Regular data,只读,

右对齐(ADC->CR2:ALIGN = 0):

左对齐(ADC->CR2:ALIGN = 1):

3、ADC 独立模式 常规通道 单次转换 配置步骤

  1. 设置ADC->CR1寄存器,Bit19:16(DUALMOD[3:0])为 0000,确保ADC处于独立模式;
    其他位保持复位值。
  2. 向ADC->CR2的 Bit20(EXTTRIG)写1,以允许外部事件触发转换;
    再设置ADC->CR2的 Bit19:17(EXTSEL[2:0])为111,选定触发事件为软件触发(即稍后通过向ADC->CR2的 Bit22(SWSTART)写1触发 );
    向ADC->CR2的 Bit11 (ALIGN)写0,以设置12位采样数据的对齐方式为右对齐;
    最后向ADC->CR2的 Bit 1 (CONT)写0,以开启单次转换模式。
    其他位保持复位值。
  3. 向ADC->SMPR2的 Bits5:3(SMP1[2:0])写 111,以设置通道1的采样时间为239.5 个周期。
    其他位保持复位值。
  4. 向ADC->CR2的 Bit22(SWSTART)写1触发通道1的单次转换。
  5. 阻塞式查询ADC->SR的 Bit1(EOC)是否为1,为1则表明转换完成。
  6. 读取(uint16_t)ADC->DR寄存器。
  7. 重复 3~6
相关推荐
2006yu6 小时前
从零开始学习单片机18
单片机·嵌入式硬件·学习
意法半导体STM328 小时前
STM32 USBx Device MSC standalone 移植示例 LAT1488
单片机·嵌入式硬件·device·msc·standalone·usbx
MThinker8 小时前
k230 按键拍照后,将摄像头拍照的1920*1080分辨率的图片以jpg文件格式,保存到板载TF存储卡的指定文件夹目录中
python·嵌入式硬件·智能硬件·micropython·canmv·k230
清风66666610 小时前
基于STM32单片机的OneNet物联网云平台农业土壤湿度控制系统
stm32·单片机·物联网·毕业设计·课程设计
学不动CV了13 小时前
嵌入式硬件电路分析---AD采集电路
arm开发·stm32·单片机·嵌入式硬件·51单片机
leo__52017 小时前
STM32的RTC模块及其应用场景
stm32·嵌入式硬件·实时音视频
GoodG_study19 小时前
Matlab函数转C语言供Keil使用
stm32·matlab·c
滴滴滴嘟嘟嘟.21 小时前
嵌入式Linux驱动开发:i.MX6ULL中断处理
linux·驱动开发·嵌入式硬件
hateregiste1 天前
国产数据库FlashDB移植到国产MCU GD32F103RC上的几点经验总结
单片机·嵌入式硬件