TA的每日心情 | 无聊 1-7-2015 18:46 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
汽车零部件采购、销售通信录 填写你的培训需求,我们帮你找 招募汽车专业培训老师
一、VADC概述
添加图片注释,不超过 140 字(可选)
模数转换器VADC使用逐次逼近原理将模拟电压信号转换为数字信号,并将转换完成的结果存入特定的结果寄存器,以供用户读取。如上图所示为VADC架构原理图:VADC模块具有两个转换器组,每个转换器组都有属于自身的仲裁器以及转换器。其中,仲裁器用于对扫描请求源、队列请求源以及背景请求源提出的转换请求进行仲裁,当三个请求源同时发生时,只对优先级最高的请求源进行响应。而对于转换器,顾名思义,使用逐次逼近原理将模拟电压信号转换为数字信号值,并将结果放入响应的结果寄存器。
1.清除ENDINIT保护,然后使能VADC模块时钟,最后打开ENDINIT保护。
2.配置VADC模块,由于VADC模块中包含有多个转换器组,所以本步骤对所有转换器组有效。
3.配置模数转换器组G0以及相应的转换通道,并启用同步采样,选择转换器组G0作为从机。
4.配置模数转换器组G1,启用同步采样,选择转换器组G1作为主机。
二、VADC示例
本节提供了 VADC 模块的代码示例,以概述核心功能。 代码示例实现了事件触发的模数转换。 结果存储为 12 位数字值并触发结果服务请求。VADC 包含多个 ADC 组 (G0 … G3)。 每组通过一个多路复用器连接到多达 8 个模拟输入通道。 以下代码示例初始化其中一组并使用一个静态分配的模拟通道作为输入。
代码示例通过使用后台源实现模数转换。 转换可以在自动扫描模式下连续运行,也可以由事件触发,如下例所示。 如果需要在特定时间执行转换,这很有用。 最近一次转换的结果在全局结果寄存器 GLOBRES 中是可接受的。 每次转换后都会激活结果服务请求。 初始化按以下顺序进行: 1. 加载全局 VADC 模块寄存器 2. 使能模数转换器 0 (G0) 3. 选择 G0 的通道 0 作为模拟输入 4. 初始化转换结果服务请求 5. 启动 第一次转换
初始化 VADC 模块的步骤描述:
(第 1 行)重置 ENDINIT 以访问受 ENDINIT 保护的寄存器。 (另请参阅 SCU 一章中的 ENDINIT 保护)。
(第 2 行)模块的使能控制,在时钟控制寄存器 CLC 中。
(第 3 行)读回(必须定义虚拟变量)。 读取过程确保完成第 2 行的写入过程。
(第 4 行)设置 ENDINIT 以再次锁定受保护的寄存器。
(第 5 行)将组 0 设置为正常操作模式。 这将激活组 0 的转换器。
(第 6 行)将模拟内部时钟的分频因子加载到全局配置寄存器 GLOBCFG 中(另请参见图 27-7)。 设置 DIVWC[15] 以启用写访问并通过设置 SUCAL[31] 启动启动校准。 校准是获得精确转换所必需的。
(第 7 行)该行启用仲裁槽 2,即示例使用的后台扫描源槽。 (另请参阅仲裁优先级寄存器 GxARBPR (x = 0 - 3) )
(第 8 行)此行设置 RESTBS[20],因此组 0 输入通道 0 的每个转换结果现在都存储在全局结果寄存器 GLOBRES 中。 (另见 GxCHCTRy)
(第 9 行)该行选择组 0 的输入通道 0 作为背景扫描序列的一部分。 (另见 BRSSELx (x = 0 - 3) )。
(第 10 行)通过设置 ENGT[0..1]=01,可以为第 10 行中启用的每个通道发出转换请求。这里只有通道 0。(另见 BRSMR)(第 11 行)此行启用组 0 服务请求控制寄存器 SRC_VADCG0SR0 中的服务请求并将中断优先级设置为 VADC0INT (1...255) (第 12 行) 调用interruptHandlerInstall 函数(必须先编写该函数,请参阅IR 章节中的中断处理程序示例) 更多细节)。 该函数将中断服务程序 (ISR) 入口地址安装在优先级为 VADC0INT 的中断向量数组中。
(第 13 行)此命令启用结果中断。 它发生在结果事件之后。
(第 14 行)等到启动校准(第 6 行开始)完成。
(第 15 行)设置 LDEV=1 会生成启动转换的加载事件。
注意:转换结果 ISR 函数原型为: void VADC_SCAN_irq (void); 这可能是您的 ISR 代码;
Basic Initialization of the VADC: //=========================> Load global module registers
(1) SCU_vResetENDINIT (0); // Access to ENDINIT-prot. reg.
(2) VADC_CLC = 0x0000; // Enable module clock and ctrl.
(3) dummy = VADC_CLC; // Read back ensures write oper.
(4) SCU_vSetENDINIT (0); // Lock ENDINIT-protected reg.
//=========================> Enable converter for group 0
(5) VADC_G0ARBCFG = 0x3; // ANONC = 11, analog converter ON
(6) VADC_GLOBCFG = (1<<31) /* SUCAL = 1, start-up calib. */ \ |(1<<15) /* DIVWC = 1, enable write */ \ | 0x9; // DIVA = 9 (clock prescaler)
(7) VADC_G0ARBPR = (1<<26); // AREN2 = 1, enable arb. slot 2 // (= background source)
(8) VADC_G0CHCTR0 = (1<<20); // RESTBS = 1, global result reg.
(9) VADC_BRSSEL0 = 0x1; // Select CH0 of group 0 for scan
(10) VADC_BRSMR = 0x1; // ENGT = 10B, enable conv. req.
//=========================> Init and install service request
(11) SRC_VADCCG0SR0 = (1<<10) /* Enable SR node 0, group 0 */ \ |VADC0INT; // Set prio to <VADC0INT>(1..255)
(12) interruptHandlerInstall (VADC0INT, & VADC_SCAN_irq);
(13) VADC_GLOBRCR = (1<<31); // SRGEN = 1, result service requ.
//=========================> Wait for completion of startup cal.
(14) while((VADC_G0ARBCFG.U & 0x30000000) != 0x20000000); // CALS = 1, CAL = 0: calibr. done //=========================> Start a conversion
(15) VADC_BRSMR |= (1<<9); // LDEV = 1, generate a load event |
|