前言:
上文完成了RH850的TAUJ定时器配置,此章我们将讲解RH850的ADC功能。
AD转换就是将时间连续和幅值连续的模拟量转换为时间离散、伏值也离散的数字量。使输出的数字量与输入的模拟量成正比。AD转换的过程有四个阶段,即采样、保持、量化和编码。
采样是将连续模拟信号转换成数字信号的过程。经过采样,时间连续、数值连续的模拟信号就变成了时间离散、数值连续的信号,称为采样信号。采样电路相当于一个模拟开关,模拟开关周期性地工作。理论上,每个周期内,模拟开关的闭合时间趋近于0。在模拟开关闭合的时刻(采样时刻),我们就“采”到模拟信号的一个“样本”。
ADCA0框图如下
AD转换关键技术参数
(1)分辨率(Resolution)
分辨率又称精度,通常以数字信号的位数来表示。定义满刻度于2^n的比值(n为AD器件位数)。分辨率表示输出数字量变化一个相邻数码所需要输入模拟电压的变化量。位数越多,分辨率就越高。
(2)转换时间(Conversion Rate)
转换时间是指完成一次从模拟转换到数字的AD转换所需的时间。积分型AD的转换时间是毫秒级属低速AD,逐次比较型AD是微秒级属中速AD,全并行/串并行型AD可达到纳秒级。采样时间则是另外一个概念,是指两次转换的间隔。为了保证转换的正确完成,采样速率(Sample Rate)必须小于或等于转换速率。因此习惯上将转换速率在数值上等同于采样速率也是可以接受的。常用单位是Ksps和Msps,表示每秒采样千/百万次(Kilo / Million Samples Per Second)。
(3)量化误差(Quantizing Error)
由于AD的有限分辨率而引起的误差,即有限分辨率AD的阶梯状转移特性曲线与无限分辨率AD(理想AD)的转移特性曲线(直线)之间的最大偏差。通常是1个或半个最小数字量的模拟变化量,表示为1LSB、1/2LSB。
(4)偏移误差(Offset Error)
输人信号为雷时输出信号不为零的值,可外接电位器调至最小。
(5)满刻度误差(Full Scale Error)
满刻度输出时对应的输人信号与理想输人信号值之差。
(6)线性度(Lineafity)
实际转换器的转移函数与理想直线的最大偏移,不包括以上3种误差AD的其他指标还有绝对精度(Absolute Accuracy)、相对精度(Relative Accuracy)、微分非线性、单调性和无错码、总谐波失真(THD,Total Harmonic Distotortion)和积分非线性等。
外部模拟多路复用连接图如下
外部模拟多路复用器(MPX)可以连接到任何输入信号引脚ADCA0I0 ~ ADCA0I19S。
1.1、ADCAnVCRj — 虚拟通道寄存器
ADCA0的虚拟通道0链接到物理通道ADCA0I0。
Bit position | Bit Name | Function |
15 | MPXE | MPX启用 0:禁止使用MPX,A/D转换前没有插入等待。 1:允许使用MPX。MPXV[2:0]位从虚拟通道启动时ADCAnSEL0到ADCAnSEL2,等待时间为 A/D转换前插入1个A/D转换时间。 |
14 - 12 | MPXV | 这些位用于设置传输到外部模拟的MPX多路复用器。 |
9 | CNVCLS | A/D转换类型自诊断选择 0:自诊断保持值A/D转换。 1:表示自诊断时正常A/D转换。 自诊断时A/D转换正常,MPX为在使用时(MPXE已设置),插入一个A/D转换时间的等待才能进行A/D转换。另一方面,不能使用MPX当自诊断时进行保持值A/D转换。 |
8 | ADIE | A/D转换结束中断使能 0: A/D时不生成扫描组x结束中断(INT_SGx) 虚拟通道j的转换在SGx结束。 1: A/D转换时生成扫描组x结束中断(INT_SGx) 对于结束于SGx的虚拟通道j。 |
7 - 6 | ULS | 上下限表选择 00:不检查上下限。 01:检查ADCAnULLMTBR0的上下限。 10:检查ADCAnULLMTBR1的上下限。 11:检查ADCAnULLMTBR2的上下限。 |
5 - 0 | GCTRL | 物理信道选择 0H ~ 23H:选择对应的ANInm。 24H:选择A/D转换器诊断通道。 其他:设置禁止。 |
1.2、ADCAnADCR — A/D控制寄存器
Bit position | Bit Name | Function |
7 | DGON | 自诊断电压备用控制 0:关闭自诊断电压电路。 1:自诊断电压电路打开,或参考电压。 |
5 | CRAC | 对齐控制 0:转换到PWDDR和ADCAnDRj的结果存储为右对齐。 1:转换到PWDDR和ADCAnDRj的结果存储为左对齐。 |
4 | CTYP | 12/10位选择模式 0: 12位模式 1: 10位模式 |
1 - 0 | SUSMTD | 暂停模式选择 这些位用于在高优先级扫描时选择暂停方法 组中断低优先级扫描组。 00:高优先级SG或SVSTOP中断时同步挂起。 01:当高优先级SG (SG2, SG3, SG4)和SVSTOP中断SG1,同步挂起时优先级更高。SG (SG3, SG4)和SVSTOP中断SG2,或者优先级更高的SG (SG4)和SVSTOP中断SG3。 10:高优先级SG或SVSTOP中断时,异步挂起。 11:设置禁止 |
1.3、ADCAnSMPCR — 采样控制寄存器
Bit position | Bit Name | Function |
7 - 0 | SMPT | 这些位用于设置采样时间(循环数)。 12H: 18个周期(ADCLK = 8兆赫到32兆赫) 18H: 24个周期(ADCLK = 8兆赫到40兆赫) 禁止进行上述以外的设置。 |
1.4、ADCAnSFTCR — 安全控制寄存器
Bit position | Bit Name | Function |
4 | RDCLRE | 读取和清除启用 当读取A/D转换结果时,该位选择A/D转换结果由硬件清除。 0:ADCAnPWDTSNDR/ADCAnDRj和ADCAnPWDDIR/ ADCAnDRj是不可读的。 1:ADCAnPWDTSNDR/ADCAnDRj/ADCAnPWDDIR/ ADCAnDR/ADCAnPWDTSNDR/ADCAnDRj/ADCAnPWDDIR/ADCAnDIRj是可读的。 |
3 | ULEIE | A/D错误中断(INT_ADE)上下限错误检测使能 0:禁用 1:启用 |
2 | OWEIE | A/D错误中断(INT_ADE)使能覆盖错误检测功能 0:禁用 1:启用 |
1.5、ADCAnSGCRx — 扫描控制寄存器
Bit position | Bit Name | Function |
5 | SCANMD | 扫描模式 0:多循环扫描模式 1:连续扫描模式 对于SG2和SG3,在这个位上写0。 |
4 | ADIE | 扫描结束中断启用 0:扫描结束时不输出INT_SGx。 1:扫描结束时输出INT_SGx。 |
3 - 2 | SCT | 通道重复次数选择 00:选择的通道重复次数为1。 01:选择的通道重复次数为2。 10:选择通道重复次数为4次。 11:设置禁止 |
0 | TRGMD | 触发模式 0:禁用SGx_TRG的触发器输入(禁用硬件触发器)。 1: SGx_TRG启动触发器或保持完成触发器A/B触发输入到SGx。 |
1.6、ADCAnSGVCSPx — 扫描组x启动虚拟通道指针
Bit position | Bit Name | Function |
5 - 0 | VCSP | 启动虚拟通道指针 这些位用于指定开始SGx扫描的虚拟通道。 |
1.71.7、ADCAnSGVCSPx — 扫描组x结束虚拟通道指针
Bit position | Bit Name | Function |
5 - 0 | VCEP | 虚拟通道指针 这些位用于结束指定SGx扫描所处的虚拟通道。 |
例:例程:
void ADC_Init(void)
{
AP_init(); //Gpio init
/* ADCA0 */
ADCA0VCR00 = 0x00u; /* Virtual Channel 0 of ADCA0 is linked to physical channel ADCA0I0 */
/* Upper/lower limit not checked / No scan group interrupt is output */
ADCA0VCR01 = 0x01u;
ADCA0ADCR = 0x00u; /* Asynchronous suspend / 12bit mode */
/* The self-diagnostic voltage circuit is turned off */
ADCA0SMPCR = 0x12u; /* Set sampling time to 18*1/40MHz = 0.45us */
ADCA0SFTCR = 0x00u; /* Upper/Lower limit error disabled / DR/DIR registers are not cleared when read */
ADCA0SGCR1 = 0x11u; /* ScanGroup interrupt is output when scan ends */
/* SGx_TRG start trigger or hold complete trigger A/B is selected for
the trigger input to SGx. Set to 1'b. */
/* ScanGroup start/end registers */
ADCA0SGVCSP1 = 0x00u; /* ScanGroup starts at virtual channel 0 */
ADCA0SGVCEP1 = 0x07u; /* ScanGroup ends at virtual channel 7 */
}