本帖最后由 youzizhile 于 2015-9-11 23:39 编辑
结合实际操作经验和瑞萨网站参考例程,简单介绍下R7F0C809的AD转换器操作步骤和注意事项,分享自己的AD操作程序。
1 AD 操作过程 瑞萨网站参考例程介绍了使用 A/D转换器的软件触发、连续转换模式,将输入 ANI0的模拟电压进行 A/D转换,在HALT模式下等待 A/D转换结束,A/D转换结束以后,将 A/D转换结果右移 6位,保存在内部 RAM中。
主要操作过程如下:
(1) 初始化 A/D转换器
• 模拟输入使用 P07/ANI0引脚。
• 使用软件触发开始 A/D转换。
• 使用 A/D转换结束中断(INTAD)。
(2) 将 ADM0寄存器的 ADCS位(开始转换动作)置为“1”,开始 A/D转换。然后执行 HALT指令进入HALT模式且等待 A/D转换结束中断。
(3) 当 ANI0引脚的输入电压 A/D转换完成以后,A/D转换器将结果传送给 ADCR寄存器,并且产生 A/D转换结束中断。
(4) 当参考例程通过 A/D转换结束中断退出 HALT模式时,可以从 ADCR寄存器中读取 A/D转换结果,右移 6位后保存在内部 RAM中。
(5) 再次开始 A/D转换,然后进入 HALT模式,并等待 A/D转换结束中断。
1.1 A/D转换器的初始化设置的流程第1步 向A/D转换器电路提供时钟:ADCEN位 ← 1 : 开始供给输入时钟
第2步 停止A/D转换器:ADM0寄存器 ← 00H
第3步 清除A/D转换结束中断请求标志:ADIF位 ← 0 : 清除中断请求标志位
第4步 设置A/D转换器中断优先级为3级:ADPR0位 ← 1,ADPR1位 ← 1
第5步 初始化A/D转换器,设置转换时间为6.8us: ADM0寄存器 ← 02H
FR1位~FR0位、LV0位 ← 001B : fCLK/8 (fCLK =20MHz)
第6步 选择分辨率、设置转换对象:ADM2寄存器 ← 00H
• 10位分辨率:ADTYP位 ← 0 : 10位分辨率
设置A/D转换对象为ANIx:ADTES1位 ← 0 : ANIx
ADTES寄存器 ← 00H
第7步 指定模拟输入通道:ADS寄存器 ← 00H
设置模拟输入通道为ANI0: ADS2位~ADS0位 ← 000B
第8步 返回
2 寄存器操作介绍2.1 设置用于 A/D转换的通道2.1.1 端口模式寄存器 0(PM0) 功能: 选择各端口的输入/输出模式
符号 7 6 5 4 3 2 1 0
PM0 PM07 PM06 PM05 PM04 PM03 PM02 PM01 PM00
设定值 1 x x x x x x x
位 7 PM07 P07引脚的输入/输出模式选择
0 输出模式(输出缓存 ON)
1 输入模式(输出缓存 OFF)
2.1.2 端口模式控制寄存器 0(PMC0) 功能: 选择各端口的输入/输出模式
符号 7 6 5 4 3 2 1 0
PMC0 PMC07 1 1 1 1 1 1 1
设定值 1 — — — — — — —
位 7
PMC07 P07引脚的数字输入/输出或者模拟输入的选择
0 数字输入/输出(模拟输入以外的复用功能)
1 模拟输入
2.2 允许 A/D转换器的时钟供给2.2.1 外围允许寄存器 0(PER0) 功能: 开始向 A/D转换器提供时钟。
符号 7 6 5 4 3 2 1 0
PER0 TMKAEN RTOEN ADCEN 0 0 SAU0EN 0 TAU0EN
设定值 x x 1 — — x — x
位 5
ADCEN A/D转换器的输入时钟的控制
当ADCEN为0 时,停止提供输入时钟
• 不能写 A/D转换器使用的 SFR
• A/D转换器处于复位状态
当ADCEN为1 时, 提供输入时钟
• 能读写 A/D转换器使用的 SFR
2.3 设置 A/D转换时间和操作模式2.3.1 A/D转换器模式寄存器 0(ADM0) 功能:设置转换时间。
符号 7 6 5 4 3 2 1 0
ADM0 ADCS 0 0 FR1 FR0 0 LV0 ADCE
设定值
— — 0 0 — 1
位 4~位 3功能
位 0 功能
ADCE 控制 A/D电压比较器的运行
0 停止 A/D电压比较器的运行
1 允许 A/D电压比较器的运行
2.4 设置基准电压源 2.4.1 A/D转换器模式寄存器 2(ADM2) 功能: 选择分辨率。
符号 7 6 5 4 3 2 1 0
ADM2 0 0 0 0 0 0 0 ADTYP
设定值 — — — — — — — 0
位 0 功能:ADTYP 选择 A/D转换分辨率
0 10位分辨率
1 8位分辨率
2.5 设置转换对象 2.5.1 A/D测试寄存器(ADTES) 功能: 选择 ANIx。
符号 7 6 5 4 3 2 1 0
ADTES 0 0 0 0 0 0 ADTES1 0
设定值 — — — — — — 0 —
位 1 功能:ADTES1 A/D转换对象的选择
0 ANIx(通过模拟输入通道指定寄存器(ADS)进行设定)
1 Vss(采样电容器的放电转换)
2.6 设置转换对象 2.6.1 • 模拟输入通道指定寄存器(ADS) 选择要进行 A/D转换的模拟电压输入通道。
符号 7 6 5 4 3 2 1 0
ADM2 0 0 0 0 0 ADS2 ADS1 ADS0
设定值 — — — — — 0 0 0
位 2~位 0功能:
ADS2 ADS1 ADS0 模拟输入通道 输入源
0 0 0 ANI0 P07/ANI0引脚
0 0 1 ANI1 P10/ANI1引脚
0 1 0 ANI2 P11/ANI2引脚
0 1 1 ANI3 P12/ANI3引脚
1 0 0 ANI4 P13/ANI4引脚
1 0 1 ANI5 P14/ANI5引脚
1 1 0 ANI6 P15/ANI6引脚
1 1 1 ANI7 P16/ANI7引脚
2.7 设置 A/D转换结束中断2.7.1 • 中断请求标志寄存器(IF0H) 清除中断请求标志。
符号 7 6 5 4 3 2 1 0
IF0H TMIF02 0 TMIF03H PIF3 PIF2 KRIF ADIF TMIF01
设定值 x — x x x x 0 x
IF0H位 1 功能:
ADIF 中断请求标志
0 不产生中断请求信号
1 产生中断请求,处于中断请求状态
2.7.2 中断屏蔽标志寄存器(MK0H) 禁用中断。
符号 7 6 5 4 3 2 1 0
MK0H TMMK02 1 TMMK03H PMK3 PMK2 KRMK ADMK TMMK01
设定值 x — x x x x 1 x
MK0H位 1 功能
ADMK 控制中断处理
0 允许中断处理
1 禁止中断处理
3 AD循环采样在我的程序设计中,需要同时测量两路AD信号,所以需要动态配置AD采样通道等参数,先配置不变的参数,在动态配置通道测量。
3.1 AD初始化void R_ADC_Create(void)
{
ADCEN = 1U; /* supply AD clock */
ADM0 = 0x00U; /* disable AD conversion and clear ADM0 register */
ADMK = 1U; /* disable INTAD interrupt */
ADIF = 0U; /* clear INTAD interrupt flag */
/* Set INTAD low priority */
ADPR1 = 1U;
ADPR0 = 1U;
ADM0 = 0x00U; /* fCLK/8 *///2 to 0 2015.9.10
ADM2 = 0x00U; /* 10 bits */
}
3.2 获取AD数据采用调用通道来实现对应AD数据输出的方式获取AD数据。
uint16_t Read_Self_AD(unsigned char ANx)
{
unsigned int i;
uint16_t ADValue;
switch(ANx)
{
case 1:
{ ADS=1; break; }
case 2:
{ ADS=2; break; }
default:break;
}
ADIF = 0; /* clear INTAD interrupt flag */
ADMK = 0; /* enable INTAD interrupt */
ADCE = 1;
for(i = 0; i < 10; i++); /* 0.1us waiting is needed */
ADCS = 1;
for(i = 0; i < 3; i++);
/*Waiting A/D conversion */
while(ADCS != 0); /* A/D conversion completed? */
ADValue =(((uint16_t)(ADCRL >> 6)) |((uint16_t)ADCRH << 2));
return ADValue;
}
我的其他帖子: