15. 模数转换器ADC
15.1 ADC简介
CH559芯片提供10位或11可选的逐次逼近型模拟数字转换器。该转换器具有8个模拟信号输入通道,可以分时采集。
ADC主要特性:
- 可选10位或11位分辨率;
- ADC模拟输入电压范围:0到VDD33;
- 最高1MSPS采样速率;
- 支持自动交替通道模式,用于在两个输入通道之间进行自动交替转换;
- 内置2级FIFO,支持自动采样和DMA。
15.2 ADC寄存器
| 名称 | 地址 | 描述 | 复位值 |
| ADC_EX_SW | F7h | ADC扩展模拟开关控制寄存器 | 00h |
| ADC_SETUP | F6h | ADC设置寄存器 | 08h |
| ADC_FIFO_H | F5h | ADC的FIFO高字节(只读) | 0xh |
| ADC_FIFO_L | F4h | ADC的FIFO低字节(只读) | xxh |
| ADC_FIFO | F4h | ADC_FIFO_L和ADC_FIFO_H组成16位SFR | 0xxxh |
| ADC_CHANN | F3h | ADC通道选择寄存器 | 00h |
| ADC_CTRL | F2h | ADC控制寄存器 | 00h |
| ADC_STAT | F1h | ADC状态寄存器 | 04h |
| ADC_CK_SE | EFh | ADC时钟分频设置寄存器 | 10h |
| ADC_DMA_CN | EEh | DMA剩余计数寄存器 | 00h |
| ADC_DMA_AH | EDh | DMA当前缓冲区地址高字节 | 0xh |
| ADC_DMA_AL | ECh | DMA当前缓冲区地址低字节 | xxh |
| ADC_DMA | ECh | ADC_DMA_AL和ADC_DMA_AH组成16位SFR | 0xxxh |
DMA当前缓冲区地址(ADC_DMA):
| 位 | 名称 | 访问 | 描述 | 复位值 |
| [7:0] | ADC_DMA_AH | RW | 当前DMA地址高字节,可预置初值,DMA后自动增加,仅低4位有效,高4位固定为0,仅支持xRAM前4K | 0xh |
| [7:0] | ADC_DMA_AL | RW | 当前DMA地址低字节,可预置初值,DMA后自动增加,仅高7位有效,最低位固定为0,仅支持偶地址 | xxh |
DMA剩余计数寄存器(ADC_DMA_CN):
| 位 | 名称 | 访问 | 描述 | 复位值 |
| [7:0] | ADC_DMA_CN | RW | 当前DMA剩余计数,可预置初值,DMA操作后自动减少 | 00h |
时钟分频设置寄存器(ADC_CK_SE):
| 位 | 名称 | 访问 | 描述 | 复位值 |
| 7 | bADC_CHK_CLK_SEL | RW | AIN7电平检测延时时钟频率选择,该位为0则低速1x时钟频率;该位为1则高速4x时钟频率 | 0 |
| [6:0] | MASK_ADC_CK_SE | RW | ADC时钟分频系数,设置内部ADC工作时钟 | 10h |
ADC状态寄存器(ADC_STAT):
| 位 | 名称 | 访问 | 描述 | 复位值 |
| 7 | bADC_IF_DMA_END | RW | DMA完成中断标志位,该位为1表示有中断;该位为0则无中断。写1清零或写ADC_DMA_CN时清零 | 0 |
| 6 | bADC_IF_FIFO_OV | RW | 该位为1表示FIFO溢出中断;该位为0则无中断。写1清零 | 0 |
| 5 | bADC_IF_AIN7_LOW | RW | 该位为1表示检测到AIN7低电平中断,写1清零 | 0 |
| 4 | bADC_IF_ACT | RW | 该位为1表示一次ADC转换完成中断,写1清零 | 0 |
| 3 | bADC_AIN7_INT | R0 | 该位为1表示AIN7输入低电平的延时状态 | 0 |
| 2 | bADC_CHANN_ID | R0 | 在自动交替通道模式下是当前通道识别标志,为0表示AIN0或AIN6;为1表示AIN1或AIN4或AIN7 | 0 |
| 2 | bADC_DATA_OK | RO | 在手工选择通道模式下是ADC转换完成和结果就绪标志,为1表示ADC数据已准备好,且ADC转换器空闲;为0表示ADC正在进行中,数据尚未就绪 | 1 |
| [1:0] | MASK_ADC_FIFO_CNT | R0 | ADC的FIFO当前计数 | 00b |
MASK_ADC_FIFO_CNT由bADC_FIFO_CNT1和bADC_FIFO_CNT0组成,用于显示ADC的FIFO计数。
| MASK_ADC_FIFO_CNT | 描述 |
| 00b | FIFO空,如果读FIFO,将直接返回当前ADC结果数值 |
| 01b | FIFO中有1个数据 |
| 10b | FIFO满,FIFO中有2个数据 |
| 11b | 未知错误 |
ADC控制寄存器(ADC_CTRL):
| 位 | 名称 | 访问 | 描述 | 复位值 |
| 7 | bADC_SAMPLE | RW | 在手动采样模式下是采样控制位,先置1稍后再清0产生高电平脉冲启动一次ADC;在自动采样模式下是自动采样的采样脉冲状态 | 0 |
| 6 | bADC_SAMP_WIDTH | RW | 自动采样模式下的采样脉冲的宽度控制位,为0则1个ADC时钟宽度;为1时则2个ADC时钟宽度 | 0 |
| 5 | bADC_CHANN_MOD1 | RW | ADC通道模式高位 | 0 |
| 4 | bADC_CHANN_MOD0 | RW | ADC通道模式低位 | 0 |
| [3:0] | MASK_ADC_CYCLE | RW | ADC运行周期数,为0表示手动采样;非0值表示设置自动采样的运行周期(以ADC时钟计数) | 0000b |
由bADC_CHANN_MOD1和bADC_CHANN_MOD0组成的MASK_ADC_CHANN是ADC通道控制模式标志位。
| MASK_ADC_CHANN | 描述 |
| 00b | 手工选择通道模式,设置ADC_CHANN选择当前输入通道 |
| 01b | 自动交替通道模式,在AIN0和AIN1之间自动交替切换 |
| 10b | 自动交替通道模式,在AIN6和AIN4之间自动交替切换 |
| 11b | 自动交替通道模式,在AIN6和AIN7之间自动交替切换 |
ADC通道选择寄存器(ADC_CHANN):
| 位 | 名称 | 访问 | 描述 | 复位值 |
| [7:0] | ADC_CHANN | RW | 选择当前ADC模拟输入通道,从8个通道中选择1个,位0~位7分别对应AIN0~AIN7 | 00h |
ADC的FIFO端口(ADC_FIFO):
| 位 | 名称 | 访问 | 描述 | 复位值 |
| [7:0] | ADC_FIFO_H | RO | ADC的FIFO高字节,仅低4位有效,高4位固定为0 | 0xh |
| [7:0] | ADC_FIFO_L | RO | ADC的FIFO低字节 | xxh |
ADC设置寄存器(ADC_SETUP):
| 位 | 名称 | 访问 | 描述 | 复位值 |
| 7 | bADC_DMA_EN | RW | 该位为1使能ADC的DMA和DMA中断;为0关闭使能 | 0 |
| 6 | bADC_IE_FIFO_OV | RW | 该位为1使能FIFO溢出中断;该位为0关闭使能 | 0 |
| 5 | bADC_IE_AIN7_LOW | RW | 该位为1使能检测AIN7低电平中断 | 0 |
| 4 | bADC_IE_ACT | RW | 该位为1使能ADC转换完成中断;该位为0关闭使能 | 0 |
| 3 | bADC_CLOCK | RO | 内部ADC时钟信号的当前电平 | 0 |
| 2 | bADC_POWER_EN | RW | ADC采样转换模块的电源控制位,该位为0表示关闭ADC模块的电源,进入睡眠状态;该位为1表示开启 | 0 |
| 1 | bADC_EXT_SW_EN | RW | 扩展模拟开关模块的电源控制位,该位为0表示关闭扩展模拟开关模块;该位为1表示开启 | 0 |
| 0 | bADC_AIN7_CHK_EN | RW | 检测AIN7低电平模块的电源控制位,该位为0表示关闭检测AIN7低电平模块;该位为1表示开启 | 0 |
ADC扩展模拟开关控制寄存器(ADC_EX_SW):
| 位 | 名称 | 访问 | 描述 | 复位值 |
| 7 | bADC_SW_AIN7_H | RW | AIN7通道内部模拟开关连接控制,该位为1内部连接AIN7到VDD33;该位为0断开AIN7与VDD33 | 0 |
| 6 | bADC_SW_AIN6_L | RW | AIN6通道内部模拟开关连接控制,该位为1内部连接AIN6到GND;该位为0断开AIN6与GND | 0 |
| 5 | bADC_SW_AIN5_H | RW | AIN5通道内部模拟开关连接控制,该位为1内部连接AIN5到VDD33;该位为0断开AIN5与VDD33 | 0 |
| 4 | bADC_SW_AIN4_L | RW | AIN4通道内部模拟开关连接控制,该位为1内部连接AIN4到GND;该位为0断开AIN4与GND | 0 |
| 3 | bADC_EXT_SW_SEL | RW | 内部模拟开关的导通电阻值选择位,该位为0选择高阻,约800Ω;该位为1选择低阻,约300Ω | 0 |
| 2 | bADC_RESOLUTION | RW | ADC分辨率选择位,该位为0选择10位分辨率;该位为1选择11位分辨率 | 0 |
| 1 | bADC_AIN7_DLY1 | RW | 检测AIN7低电平的延时控制位1 | 0 |
| 0 | bADC_AIN7_DLY0 | RW | 检测AIN7低电平的延时控制位0 | 0 |
bADC_AIN7_DLY1和bADC_AIN7_DLY0组成MASK_ADC_AIN7_DLY,用于选择检测AIN7电平变化后的延时:00则无延时,01则最长延时,10则较长延时,11则较短延时。
15.3 ADC功能
ADC采样模式配置步骤:
- 设置ADC设置寄存器ADC_SETUP中的bADC_POWER_EN位为1,开启ADC模块。
- 设置时钟分频设置寄存器ADC_CK_SE,选择时钟频率,频率最高12MHz,建议不低于1MHz。
- 清空FIFO中的已有数据;如果需要用到中断或者DMA,那么在此处进行相关设置。
- 对于自动采样模式,那么应该先设置ADC通道选择寄存器ADC_CHANN。
- 设置ADC控制寄存器ADC_CTRL中的bADC_SAMPLE和MASK_ADC_CYCLE,如果MASK_ADC_CYCLE设置为0,则为手动采样模式;如果MASK_ADC_CYCLE设置为非0值,则为自动采样模式,此时MASK_ADC_CYCLE就是连续不断自动采样的时钟周期。
- 对于手工采样模式,设置ADC通道选择寄存器ADC_CHANN,选择ADC模拟信号输入通道。
- 如果是手动采样模式,那么需要通过设置bADC_SAMPLE位为1并延时至少一个ADC时钟周期后再清0,完成一次模拟信号采样并启动一次ADC转换。
- 等待ADC状态寄存器ADC_STAT的bADC_IF_ACT位为1,表示ADC转换结束,可通过ADC_FIFO读取结果数据。
- 或读取ADC状态寄存器ADC_STAT的MASK_ADC_FIFO_CNT获得FIFO计数,再通过ADC_FIFO读取若干数据,建议丢弃第一个ADC结果数据,因为有可能采样不完全。
- 如需DMA步骤:设置ADC_DMA为用户定义的数据缓冲区的起始地址值,设置ADC_DMA_CN为用户定义的DMA剩余计数,并设置ADC_SETUP中的bADC_DMA_EN位为1,即开启DMA功能。
- ADC结果数据共12位,其中位0~位10为ADC数值,位11是标志位,位12~位15始终为0。对于手工选择通道模式,位11始终为0;对于自动交替通道模式,位11表示该ADC数值的通道识别标志,参考bADC_CHANN_ID说明。