24. 模拟数字转换器 (ADC)

24.1. 概述

SWM221内置2个12位高精度SAR ADC,采样率高达1MSPS,每个ADC支持10通道。

24.2. 特性

  • 支持单次模式和连续模式

  • 灵活的转换启动方式,支持软件、PWM、TIMER启动

  • 每个通道都有自己独立的转换结果数据寄存器和转换完成、数据溢出状态寄存器

  • 支持DMA传输

  • 内嵌1路温度传感器 (TEMPSENSE)

24.3. 功能描述

24.3.1. 模块结构

图 87 为ADC结构框图。

../../_images/%E7%BB%93%E6%9E%84%E6%A1%86%E5%9B%BE.svg

图 87 ADC结构框图

24.3.1.1. 功能描述

24.3.2. 序列

序列用于为一组通道设定转换配置,例如SEQ0CHN 设定序列SEQ0中包含哪些通道、这些通道的转换顺序,SMPTIM设定这组通道的采样时间,SMPNUM设定这组通道的转换次数(序列中所有通道全部完成转换算一次),SEQTRG设定这组通道的触发信号。

SEQTRG选中的触发信号出现时,SEQxCHN中选中的通道依次完成转换,所有选中通道全部完成转换后,若SMPNUM=1,则序列转换停止,等待下一个触发信号;若SMPNUM>1,则自动再次执行一遍SEQxCHN中选中的通道的转换,此过程一直重复SMPNUM次。

使用序列为一组通道设定转换配置,避免了为这组通道中每个通道单独设定一遍转换配置(触发信号、采样时间、转换次数等),简化了繁琐、重复的配置步骤。

24.3.3. 转换通道选择

通过寄存器SEQ0CHN、SEQ1CHN可以分别为序列0和序列1指定最多8个通道,当序列被启动后,8个通道依次转换。

例如,想要指定序列0启动后,依次转换通道0、2、1,可如下设置寄存器SEQ0CHN:

../../_images/%E9%80%9A%E9%81%93%E9%80%89%E6%8B%A9_1.svg

寄存器SEQ0CHN的最低4位(SEQ0CHN[3:0])写入0,SEQ0CHN[7:4]写入2,SEQ0CHN[11:8]写入1,SEQ0CHN[15:12]写入15。通道号15是序列转换通道终止标记,用于当需要转换的通道个数少于8个时,标记需转换通道的个数。

通过此示例可以发现,通道的转换顺序不受物理通道号的限制,可以先转换通道2、后转换通道1。不仅如此,在一次序列启动中,单个通道可以转换不止一次。如下配置所示:

../../_images/%E9%80%9A%E9%81%93%E9%80%89%E6%8B%A9_2.svg

此配置中,通道0转换一次,然后通道2转换两次,最后通道1转换一次。

24.3.4. 硬件取平均

SAR ADC 支持针对采样数据硬件自动完成平均值计算。通过配置 CR 寄存器中 AVG 位设置为结果取平均。支持 2 到 8 次取平均。设置 N 次平均,则采集完成 N 次后 EOC 标志有效,同时取平均值的结果被送至对应通道数据寄存器。

24.3.5. 转换结果比较

ADC支持序列转换结果与指定值比较,当SEQ0中通道的转换结果大于SEQ0CHK.MAX设定值,或小于SEQ0CHK.MIN设定值时,可分别产生IF.SEQ0MAX和IF.SEQ0MIN中断请求。此功能可用于监控指定通道的转换结果,实现类似模拟比较器的功能。

24.3.6. 中断处理

ADC中每个序列均支持EOC、MAX、MIN三个中断,三个中断在均可独立使能、关闭、查询和清除。三个中断相或向内核产生中断请求:

../../_images/%E4%B8%AD%E6%96%AD%E8%AF%B7%E6%B1%82.svg

图 88 ADC 中断请求

24.4. 寄存器映射

名称

偏移

复位值

ADC0 BASE:0x40044800

ADC1 BASE:0x40044900

CR

0x00

0x00000303

IE

0x04

0x00000000

IF

0x08

0x00000000

SMPNUM

0x0C

0x00000000

SMPTIM

0x10

0x00000000

SEQTRG

0x14

0x00000000

SEQ0CHN

0x18

0x00000000

SEQ1CHN

0x1C

0x00000000

SEQ0CHK

0x20

0x00000FFF

SEQ1CHK

0x24

0x00000FFF

DATAx (x = 0 .. 9)

0x30 + (x * 0x4)

0x00000000

SEQ0DMA

0x70

0x00000000

SEQ1DMA

0x74

0x00000000

START

0x200

0x00000000

24.5. 寄存器描述

24.5.1. CR

偏移: 0x00

复位值: 0x00000303

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

15

14

13

12

11

10

9

8

CLKDIV

7

6

5

4

3

2

1

0

AVG

SEQ1DMAEN

SEQ0DMAEN

BITS

RESET

PWDN

位域

名称

类型

描述

31:13

12:8

CLKDIV

R/W

ADC转换时钟 = core_clk / (CLKDIV + 1)

7:6

AVG

R/W

0:关闭多次转换、硬件取平均功能

1:一次启动连续采样、转换2次,并计算两次结果的平均值作为转换结果

2:一次启动连续采样、转换4次,并计算四次结果的平均值作为转换结果

3:一次启动连续采样、转换8次,并计算八次结果的平均值作为转换结果

5

SEQ1DMAEN

R/W

0:转换结果通过对应通道的数据寄存器读取

1:转换结果通过SEQ1DMA读取

4

SEQ0DMAEN

R/W

0:转换结果通过对应通道的数据寄存器读取

1:转换结果通过SEQ0DMA读取

3:2

BITS

R/W

输出位宽配置

00:12 bit

01:10 bit

10:8 bit

11:6 bit

非12 bit输出模式下,有效数据高位对齐,低位输出为0

1

RESET

R/W

ADCx模拟电路内部逻辑复位,高电平复位有效, 软件置1,硬件自动清零。

退出powerdown模式后(ADCx_PWD由1写为0),硬件会自动执行一次复位操作。ADCx_PWD为1时,写ADCx_RESET为1后不会自动清零。

此位写0无效

0

PWDN

R/W

1 :Power Down

0 :正常工作模式,写 0 后需等待 32 个采样周期

24.5.2. IE

偏移: 0x04

复位值: 0x00000000

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

15

14

13

12

11

10

9

8

SEQ1MIN

SEQ1MAX

SEQ1EOC

7

6

5

4

3

2

1

0

SEQ0MIN

SEQ0MAX

SEQ0EOC

位域

名称

类型

描述

10

SEQ1MIN

R/W

序列1转换结果小于MIN中断

9

SEQ1MAX

R/W

序列1转换结果大于MAX中断

8

SEQ1EOC

R/W

序列1转换完成中断

2

SEQ0MIN

R/W

序列0转换结果小于MIN中断

1

SEQ0MAX

R/W

序列0转换结果大于MAX中断

0

SEQ0EOC

R/W

序列0转换完成中断

24.5.3. IF

偏移: 0x08

复位值: 0x00000000

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

15

14

13

12

11

10

9

8

SEQ1BRK

SEQ1MIN

SEQ1MAX

SEQ1EOC

7

6

5

4

3

2

1

0

SEQ0BRK

SEQ0MIN

SEQ0MAX

SEQ0EOC

位域

名称

类型

描述

11

SEQ1BRK

R/W1C

序列1 CPU启动采样被PWM触发打断,状态位,不产生中断

10

SEQ1MIN

R/W1C

序列1转换结果小于MIN中断

9

SEQ1MAX

R/W1C

序列1转换结果大于MAX中断

8

SEQ1EOC

R/W1C

序列1转换完成中断

3

SEQ0BRK

R/W1C

序列0 CPU启动采样被PWM触发打断,状态位,不产生中断

2

SEQ0MIN

R/W1C

序列0转换结果小于MIN中断

1

SEQ0MAX

R/W1C

序列0转换结果大于MAX中断

0

SEQ0EOC

R/W1C

序列0转换完成中断

24.5.4. SMPNUM

偏移: 0x0C

复位值: 0x00000000

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

15

14

13

12

11

10

9

8

SEQ1

7

6

5

4

3

2

1

0

SEQ0

位域

名称

类型

描述

15:8

SEQ1

R/W

一次启动后,序列1连续转换次数,0表示1次,1表示2次,

7:0

SEQ0

R/W

一次启动后,序列0连续转换次数,0表示1次,1表示2次,

24.5.5. SMPTIM

偏移: 0x10

复位值: 0x00000000

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

15

14

13

12

11

10

9

8

SEQ1

7

6

5

4

3

2

1

0

SEQ0

位域

名称

类型

描述

15:8

SEQ1

R/W

ADC转换前对信号的采样时间,0表示4个时钟周期,1表示5个时钟周期,

7:0

SEQ0

R/W

ADC转换前对信号的采样时间,0表示4个时钟周期,1表示5个时钟周期,

24.5.6. SEQTRG

偏移: 0x14

复位值: 0x00000000

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

15

14

13

12

11

10

9

8

SEQ1

7

6

5

4

3

2

1

0

SEQ0

位域

名称

类型

描述

15:8

SEQ1

R/W

序列1触发信号

7:0

SEQ0

R/W

序列0触发信号

0:无触发

1:CPU触发

2-4:timer0~timer2触发

16-17:pwm0~pwm1触发

24.5.7. SEQ0CHN

偏移: 0x18

复位值: 0x00000000

31

30

29

28

27

26

25

24

CH7

CH6

23

22

21

20

19

18

17

16

CH5

CH4

15

14

13

12

11

10

9

8

CH3

CH2

7

6

5

4

3

2

1

0

CH1

CH0

位域

名称

类型

描述

31:28

CH7

R/W

序列0中第八个转换通道的通道号,取值0-9,0xF表示通道号查询终止

27:24

CH6

R/W

序列0中第七个转换通道的通道号,取值0-9,0xF表示通道号查询终止

23:20

CH5

R/W

序列0中第六个转换通道的通道号,取值0-9,0xF表示通道号查询终止

19:16

CH4

R/W

序列0中第五个转换通道的通道号,取值0-9,0xF表示通道号查询终止

15:12

CH3

R/W

序列0中第四个转换通道的通道号,取值0-9,0xF表示通道号查询终止

11:8

CH2

R/W

序列0中第三个转换通道的通道号,取值0-9,0xF表示通道号查询终止

7:4

CH1

R/W

序列0中第二个转换通道的通道号,取值0-9,0xF表示通道号查询终止

3:0

CH0

R/W

序列0中第一个转换通道的通道号,取值0-9,0xF表示通道号查询终止

24.5.8. SEQ1CHN

偏移: 0x1C

复位值: 0x00000000

31

30

29

28

27

26

25

24

CH7

CH6

23

22

21

20

19

18

17

16

CH5

CH4

15

14

13

12

11

10

9

8

CH3

CH2

7

6

5

4

3

2

1

0

CH1

CH0

位域

名称

类型

描述

31:28

CH7

R/W

序列1中第八个转换通道的通道号,取值0-9,0xF表示通道号查询终止

27:24

CH6

R/W

序列1中第七个转换通道的通道号,取值0-9,0xF表示通道号查询终止

23:20

CH5

R/W

序列1中第六个转换通道的通道号,取值0-9,0xF表示通道号查询终止

19:16

CH4

R/W

序列1中第五个转换通道的通道号,取值0-9,0xF表示通道号查询终止

15:12

CH3

R/W

序列1中第四个转换通道的通道号,取值0-9,0xF表示通道号查询终止

11:8

CH2

R/W

序列1中第三个转换通道的通道号,取值0-9,0xF表示通道号查询终止

7:4

CH1

R/W

序列1中第二个转换通道的通道号,取值0-9,0xF表示通道号查询终止

3:0

CH0

R/W

序列1中第一个转换通道的通道号,取值0-9,0xF表示通道号查询终止

24.5.9. SEQ0CHK

偏移: 0x20

复位值: 0x00000FFF

31

30

29

28

27

26

25

24

MIN

23

22

21

20

19

18

17

16

MIN

15

14

13

12

11

10

9

8

MAX

7

6

5

4

3

2

1

0

MAX

位域

名称

类型

描述

27:16

MIN

R/W

当转换结果小于此值时,可触发中断

11:0

MAX

R/W

当转换结果大于此值时,可触发中断

24.5.10. SEQ1CHK

偏移: 0x24

复位值: 0x00000FFF

31

30

29

28

27

26

25

24

MIN

23

22

21

20

19

18

17

16

MIN

15

14

13

12

11

10

9

8

MAX

7

6

5

4

3

2

1

0

MAX

位域

名称

类型

描述

27:16

MIN

R/W

当转换结果小于此值时,可触发中断

11:0

MAX

R/W

当转换结果大于此值时,可触发中断

24.5.11. DATAx (x = 0 .. 9)

偏移: 0x30 + (x * 0x4)

复位值: 0x00000000

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

FLAG

15

14

13

12

11

10

9

8

DATA

7

6

5

4

3

2

1

0

DATA

位域

名称

类型

描述

17:16

FLAG

RO

0 自上次读取无新数据 1 有新数据 2 发生过数据覆盖

11:0

DATA

RO

通道转换结果

24.5.12. SEQ0DMA

偏移: 0x70

复位值: 0x00000000

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

FLAG

15

14

13

12

11

10

9

8

CHNUM

DATA

7

6

5

4

3

2

1

0

DATA

位域

名称

类型

描述

17:16

FLAG

RO

0 自上次读取无新数据 1 有新数据 2 发生过数据覆盖

15:12

CHNUM

RO

转换结果来自哪个通道

11:0

DATA

RO

通道转换结果

24.5.13. SEQ1DMA

偏移: 0x74

复位值: 0x00000000

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

FLAG

15

14

13

12

11

10

9

8

CHNUM

DATA

7

6

5

4

3

2

1

0

DATA

位域

名称

类型

描述

17:16

FLAG

RO

0 自上次读取无新数据 1 有新数据 2 发生过数据覆盖

15:12

CHNUM

RO

转换结果来自哪个通道

11:0

DATA

RO

通道转换结果

24.5.14. START

偏移: 0x200

复位值: 0x00000000

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

15

14

13

12

11

10

9

8

ADC1BUSY

ADC1SEQ1

ADC1SEQ0

7

6

5

4

3

2

1

0

ADC0BUSY

ADC0SEQ1

ADC0SEQ0

位域

名称

类型

描述

10

ADC1BUSY

RO

ADC1 busy flag

9

ADC1SEQ1

R/WAC

ADC1 SEQ1 启动位,写1启动ADC1 SEQ1转换,自动清零

8

ADC1SEQ0

R/WAC

ADC1 SEQ0 启动位,写1启动ADC1 SEQ0转换,自动清零

2

ADC0BUSY

RO

ADC0 busy flag

1

ADC0SEQ1

R/WAC

ADC0 SEQ1 启动位,写1启动ADC0 SEQ1转换,自动清零

0

ADC0SEQ0

R/WAC

ADC0 SEQ0 启动位,写1启动ADC0 SEQ0转换,自动清零