喂什么玩意
发表于 2022-7-30 23:26
喂什么玩意
发表于 2022-7-30 23:28
喂什么玩意
发表于 2022-7-30 23:29
根据这些数据表,可以知道参考电压来自电源脚 VDDA 和 VSSA ,且内部 VSSA 与 VSS 是连接在一起的,如果将 VDDA 与 VDD 分开供电,那么 VDDA 不能超过 VDD 电压且压差保持在 100mV 以内。有效分辨率位数达到 10.7 位,在工程值可接受范围内。需要避免在任何标准的模拟输入引脚上注入反向电 流,因为这样会显著地降低另一个模拟输入引脚上正在进行的转换精度。可在可能产生反向注入电流的标准模拟引脚上(引脚与地之间)增加一个肖特基二极管。静态线性误差几乎都在 8 个 LSB 以内,精度比较高。
喂什么玩意
发表于 2022-7-30 23:30
三、功能描述和寄存器
1. 中断
当配置中断使能后,中断事件发生后将产生相应的中断请求,不同工作序列和工作模式中涉及到不同的中断标志,具体有以下状态标志位:
喂什么玩意
发表于 2022-7-30 23:32
喂什么玩意
发表于 2022-7-30 23:32
每个状态标志位都会在相应事件发生后置位,同时发出中断请求给到 CPU ,如果正确配置并且开启 ADC 的 NVIC 通道那么就会产生中断响应,然后在响应服务函数中根据不同的标志位置位情况分别进行处理。这些标志位中,标注为 rc_w1 的表示可以写 “1” 清除。
喂什么玩意
发表于 2022-7-30 23:33
2. DMA 响应
A/D 转换结果存储在数据寄存器 ADC_ADDATA 中,当多个通道连续转换时可以使用 DMA 访问保存数据,避免转换数据丢失,当然一个通道转换也是可以用 DMA的 ;
DMA 使能开启后,当通道转换结束后将产生 DMA 请求,将转换数据从 ADC_ADDATA 寄存器传输到软件指定的目的地址;
喂什么玩意
发表于 2022-7-30 23:34
每个通道有对应的数据寄存器 ADC_ADDRn,可访问这些寄存器获取各通道转换结果,当然也可以将 ADC DMA 通道的源地址设置为 ADC_ADDRn ;
ADC DMA 通道重映射(ADC DMA remap) 在 SYSCFG_CFGR Bit 8 中配置
0:ADC 的 DMA 功能映射到 DMA channel1
1:ADC 的 DMA 功能重映射到 DMA channel2
喂什么玩意
发表于 2022-7-30 23:42
3. 时钟、分频、分辨率以及采样转换时间
输入时钟与 APB2_CLK 同步,在使用 ADC 之前,需要先使能 RCC 控制器中的时钟使能控制位(RCC_APB2ENR 的 Bit 9);
喂什么玩意
发表于 2022-7-30 23:43
ADC 预分频相关寄存器为 ADC_ADCFG 的 ADCPREH 和 ADCPREL,分频值为 (ADC_ADCFG +2) ,分频后作为 ADC 工作时钟;
ADC 转换分辨率可通过 ADC_ADCFG.RSLTCTL 位配置,有效数据位默认是 12 位数据右对齐,也可以配成左对齐, 通过配置低分辨率可加快数据转换速率;
采样转换频率计算公式 : Fsample = Fadc_clk /(m+n+0.5) ,Fadc_clk 为 ADC 的工作时钟频率,m 为每个通道采样保持周期,不同通道可以有不同的采样保持周期,n 为分辨率,二者皆可通过相关寄存器改变配置。另外可通过该公式计算每个通道转换一次需要的时间 : Tconv = (m+n+0.5) clk,取 n=12 bit,m = 3.5 clk ,Fadc_clk = 16 MHz ,则 1 clk = 1/16 us ,该通道转换一次的时间为 1/16 us * 16 = 1us 。
喂什么玩意
发表于 2022-7-30 23:44
4. 采样方式以及通道序列模式
单次采样方式,只对一个指定通道进行 A/D 转换,此时一个通道也称之为一个普通序列,对应 ST 的就是不使能连续模式且通道数为 1;
喂什么玩意
发表于 2022-7-30 23:45
单周期扫描采样方式,将使能的通道按顺序(方向可正反改变)进行一次 A/D 转换,对应 ST 的就是不使能连续模式且通道数为 N;
连续扫描采样方式,循环单周期扫描采样的转换动作,对应 ST 的就是使能连续模式且通道数为 N;
普通规则通道序列,一个通道也可以自己组成一个序列;
喂什么玩意
发表于 2022-7-30 23:45
任意通道序列,可以是同一个通道多次放置于一个任意序列中;
注入通道序列,前 2 种序列模式包含上述 3 种采样方式,而注入序列模式只包含自动注入,且只能与任意通道工作模式搭配工作。
喂什么玩意
发表于 2022-7-30 23:46
任意通道工作模式搭配工作。
下面是用户手册中描述的一些转换时序图,对于理解该模块工作的具体逻辑实现非常有帮助,里面告诉了我们在每个 ADC 时钟 clk 驱动下,什么时候开始采样,转换后的结果在什么时候被 DMA 搬运走,每个通道完成转换后 ADC 相关的标志位置位的具体时刻,等等一些有用信息:
喂什么玩意
发表于 2022-7-30 23:46
喂什么玩意
发表于 2022-7-30 23:47
5. 通道选择和触发源选择
ADC 有 13 路外部输入通道 0~12、内部温度传感器通道 14 和内部 1.2V 参考电压通道 15;
可根据对应工作模式去配置通道选择寄存器从而进行不同方式的 A/D 转换,正常转换过程中也是可以进行切换通道的,只是不同模式下对切换通道的响应是不同的,这里就牵扯到一个影子寄存器的说法了,具体可以通过用户手册中查看详细描述;
喂什么玩意
发表于 2022-7-30 23:48
ADC 触发源可以是软件开关位,也还包括了定时器和外部事件,具体罗列在以下表中,不同源头的选择需要在初始化时进行不同配置,除软件触发外都需要额外开启外部触发位。
喂什么玩意
发表于 2022-7-30 23:49
喂什么玩意
发表于 2022-7-30 23:49
6. 数据获取方式以及数据寄存器
可以通过以下几种方式进行转换结果的数据获取:
轮询,开启转换后等待转换完成标志位置位
中断,使能转换完成中断标志并且开启转换后等待自动触发中断
DMA,使能对应 A/D 通道并且开启转换后等待每个通道转换完成后发出的 DMA 请求,转换数据自动搬运到 RAM 中
喂什么玩意
发表于 2022-7-30 23:50
A/D 转换完成后,非注入通道转换结果存储在寄存器 ADC_ADDATA 中,CHANNELSEL 表示当前数据对应的非注入通道号,同步地还会单独保存在对应的ADC_ADDR0~15 通道数据寄存器中;
注入通道转换结果存储在寄存器 ADC_JADDATA 中,JCHANNELSEL 表示当前数据对应的注入通道号,同步地还会单独保存在对应的 ADC_JDR0~3注入通道数据寄存器中。