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结构框图。
图 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:
寄存器SEQ0CHN的最低4位(SEQ0CHN[3:0])写入0,SEQ0CHN[7:4]写入2,SEQ0CHN[11:8]写入1,SEQ0CHN[15:12]写入15。通道号15是序列转换通道终止标记,用于当需要转换的通道个数少于8个时,标记需转换通道的个数。
通过此示例可以发现,通道的转换顺序不受物理通道号的限制,可以先转换通道2、后转换通道1。不仅如此,在一次序列启动中,单个通道可以转换不止一次。如下配置所示:
此配置中,通道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三个中断,三个中断在均可独立使能、关闭、查询和清除。三个中断相或向内核产生中断请求:
图 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转换,自动清零 |