PY32的ADC模块探讨
ADC模块介绍
ADC 主要特性
高性能
- 12bit、10bit、8bit 和 6bit 分辨率可配置
- ADC 转换时间:1us@12bit(1MHz)
- 自校准
- 可编程的采样时间
- 可编程的数据对齐模式
- 支持 DMA
低功耗
- 为低功耗操作,降低 PCLK 频率,而仍然维持合适的 ADC 性能
- 等待模式:防止以低频 PCLK 运行产生溢出
模拟输入通道
- 10 个外部模拟输入通道:PA[7:0]和 PB[1:0]
- 1 个内部 temperature sensor 通道
- 1 个内部参考电压通道(V REFINT )
转换操作启动可以通过
- 软件启动
- 可配置极性的硬件启动(TIM1、TIM3 或者 GPIO)
转换模式
- 单次模式(single mode):可以转换 1 个单通道或者可以扫描一系列通道
- 连续模式(continuous mode):连续转换被选择的通道
- 不连续模式(discontinuous mode):每次触发,转换被选择的通道 1 次
中断产生
- 在采样结束
- 在转换结束
- 在连续转换结束
- 模拟看门狗事件
- 溢出事件
模拟看门狗
- 在电压跌落到设定的阈值范围时会触发看门狗事件
ADC软件步骤
ADC使用注意事项
校准-ADCAL
- 每次上电后,使能ADC模块前校准。
- 校准前打开时钟,不要打开使能,ADCAL=1开始校准,等待到 ADCAL=0。
- VCC电压变化或温度变化较大需重新校准
ADC使能控制-开关控制-ADEN
- 用来控制ADC模块的开关
- 写1清除ADRDY
- ADEN写1打开
- 关闭过程
- 检查ADSTART为0,即没在转换
- ADEN写0,关闭模块
ADC时钟
有两组时钟和分频可供选择
ADC的配置
通道选择
- 共12路通道,10路GPIO+2路内部电压AIN-11,温度AIN-10.
- 可以单个通道或一组通道,通道由ADC_CHSELR选择
- SCANDIR决定通道扫描方向
采样时间可编程
EOSMP标志位表明采样结束
三种转换模式
单次转换模式 CONT=0,DISCEN=0
- 单次转换模式下,ADC 执行一次序列转换,转换所有被选的通道。当 ADC_CFGR1 寄存器中的
CONT=0
,DISCEN=0
时,ADC 为单次转换模式。 - 转换可以由两种方式:
- 软件开始-ADSTART位;
- 硬件触发-定时器等
- 序列转换过程
在序列通道的转换期间,序列中每个通道转换完成后:
- 转换的数据结果存放到 16 位寄存器 ADC_DR 中。
- EOC(转换结束标志)标志置位
- 若 EOCIE 位置位则产生一个中断。 整个通道序列转换完成后:
- EOSEQ(序列结束) 标志置位
- 若 EOSIE 位置位则产生一个中断 转换结束后,ADC 停止直到新的触发事件或 ADSTART 重新置位。
注:若转换单一通道,则可编程一个长度为 1 的一个转换序列。
连续转换模式 CONT=1
- 在连续转换模式中,当软件或硬件触发事件产生,ADC 执行一个序列转换。转换所有的通道一次且自动重 新开始执行相同的序列转换。
- 当寄存器 ADC_CFGR1 中的 CONT=1 时, ADC 选择为连续转换模式。ADC 转换可由下述两种方法启动:
- 软件开始-ADSTART位;
- 硬件触发-定时器等
-
序列转换过程 在序列通道的转换期间,序列中每个通道转换完成后:
- 转换的数据结果存放到 16 位寄存器 ADC_DR 中。
- EOC(转换结束标志)标志置位
- 若 EOCIE 位置位则产生一个中断。 整个通道序列转换完成后:
- EOSEQ(序列结束) 标志置位
- 若 EOSIE 位置位则产生一个中断
一次序列转换结束后,ADC 立即重新转换相同的序列通道
ADC 不能同时处于 discontinuous 转换模式和 continuous 转换模式,在这种情况下 (DISCEN=1, CONT=1),其表现为单次转换模式。
非连续转换模式 DISCEN=1
该模式由设置 ADC_CFGR1 寄存器中的 DISCEN 位来开启。 在这个模式 (DISCEN=1)下,需要硬件或软件的触发事件去启动定义在一个序列中的每个通道的转换。 相反,DISCEN=0 时,一个硬件或软件的触发事件,就可以启动定义在一个序列中的所有转换。
启动ADC转换(ADSTART)
软件用设置 ADSTART=1 启动 ADC 转换。 1. 当 ADSTART 设置,则转换: ◼ 当 EXTEN=0x0(软件触发) 时,立即开始 ◼ 当 if EXTEN ≠ 0x0 时,在下一个所选择的硬件触发有效边沿开始 ADSTART 位也用于说明目前 ADC 转换操作是否正在进行。当 ADSTART=0 时,可重新配置 ADC, 说明此时 ADC 处于空闲。 2. ADSTART 位可由硬件清除。 ◼ 单次转换模式由软件触发 (CONT=0,EXTSEL=0x0) - 在序列转换结束后 (EOSEQ=1) ◼ Discontinuous 转换模式由软件触发 (CONT=0,DISCEN=1, EXTSEL=0x0) - 在转换结束后(EOC=1) ◼ 在所有的情况下( CONT=X,EXTSEL=X ) - 在软件调用并执行 ADSTP 过程后 注:在连续模式 (CONT=1) 下,ADSTART 位不能由 EOSEQ 引发的硬件清除,其原因是自动重新开始序列转 换,需要先调用ADSTP停止。当硬件触发选择为单次转换模式 (CONT=0 and EXTSEL =0x01), 则当 EOSEQ 标志设置后,ADSTART 不 会被硬件清 0。这就避免了需要软件重新设置 ADSTART 位且要确保无硬件触发事件错过。
停止进行中的转换(ADSTP)
用软件设置 ADC_CR 寄存器中的 ADSTP=1 可以停上当前正在进行的转换,复位 ADC 的操作并让 ADC 进 入空闲状态,为下次转换作好准备。 1. 当 ADSTP 由软件设置为 1,任何当前的转换中止且转换结果丢弃(ADC_DR 寄存器不用当前的转换值进行 更新 )。 2. 扫描序列也被中止并复位 (即重新启动 ADC 时会用新的序列进行转换) 3. 一旦结束该过程 ADSTP 和 ADSTART 位都由硬件清 0。
外部触发转换和触发极性(EXTSEL, EXTEN)
一次转换或一个序列的转换可由软件或外部事件(例如:定时器捕、输入引脚) 触发。 若 EXTEN[1:0] ≠ “00”,则外部事件在其所选择的极性上可以用于触发转换。当软件设置 ADSTART=1 时,触发选择有效。 当正在进行 ADC 转换时,任何硬件触发都会被忽略。 当 ADSTART=0 时,任何硬件触发都会忽略。
转换结束
- 每个通道转换结束会置位标志:EOC和EOCMP,软件写1清除
- 整个序列转换结束会置位:EOSEQ ,软件写1清除
转换结果的读取ADC_DR
- 转换结果在ADC_DR寄存器中,可以通过EOC中断读取。建议打开过冲覆盖设置.
- 快速转换的时候建议使用DMA读取,可以减少读取次数,防止读取过冲
DMA的使用
当 DMA 模式开启时 (ADC_CFGR1 寄存器中的 DMAEN =1), 每次转换结束时都会产生一个 DMA 请求。 这样就允许把在 ADC_DR 寄存器中的转换数据传送
到软件指定的目标地址中。
尽管如此,因 DMA 不能够及时响应 DMA 请求从而产生过载 (OVR=1) 时, ADC 就会停止产生 DMA 请求且新的转换数据也不会再由 DMA 进行传输(当 OVR=0 时, 会继续传输)。 这意味着所有传输到 RAM 中的数据都是有效的(因无效的数据再也不传输了)。
根据 OVRMOD 位的配置,ADC_DR 寄存器中的数据可选择为:保持或覆盖。
DMA 传输请求会被阻止直到软件清除 OVR 位
。
有两种不同的 DMA 模式,其取决于 ADC_CFGR1 寄存器中的 DMACFG 位的配置: ● DMA 一次模式 (one shot mode)(DMACFG=0) 当 DMA 编程用于传输固定长度的数据时,可选用该模式。 ● DMA 循环模式 (DMACFG=1) 当 DMA 编程为循环模式时,可选用该模式。
DMA 一次模式(DMACFG=0)
在这种模式下,ADC 在每次转换的数据有效时产生一次 DMA 请求。一旦 DMA 已达到最后一个 DMA 传输 时,即使 ADC 转换已再次启动,ADC 停止产生 DMA 请求。( 产生 DMA_EOT 中断时,下一次的 ADC 转换有 可能已开始 ) 当 DMA 传输完成 ( 配置在 DMA 控制器中的所有传输已经完成 ): ● ADC 数据寄存器的内容冻结 ● 任何进行中的转换终止。且结果值丢弃 ● 不给 DMA 控制器发出新的 DMA 请求。假如仍有 ADC 转换启动,这种方式可避免产生一个 ADC 过冲错 误 ● ADC 扫描序列停止并复位 ● DMA 停止
DMA 循环模式(DMACFG=1)
在这种模式下,即使 DMA 达到最后一个 DMA 的传输,ADC 也会在每次转换的数据有效时产生一次 DMA 请求。这允许 DMA 配置为循环模式来处理连续模拟输入数据流。