2ac9943bbc76d810df71aa05ae175012
DAC模块介绍
参考<<Renesas RA2L1 Group User’s Manual: Hardware>>的章节<<31. 12-Bit D/A Converter (DAC12)>>
特征
- 12位带运放,1通道。
- 可ELC控制启动。
- 可 ADC12控制DA转换时机,减少AD和DA之间的干扰。控制DA涌入电流产生时间,减小对AD采集精度的影响。
DAC参数如下
框图
相关引脚
AVCC0和AVSS0分别通过E4和E7连接到VCC_MCU 3.3V和GND。
DA0对应P014
位于J2的21号引脚
寄存器
DADR0: 转换值,根据(DADPR.DPSEL左对齐还是右对齐选用高位还是低位。
DACR:控制使能转换
DADPR:选择DADR0的值是左对齐还是右对齐。
DAADSCR:控制是否同步ADC和DA的启动转换。
DAVREFCR:选择参考电压。
要配置ASEL和PCR的对应位选择引脚功能。
操作过程
- 使能模块时钟 MSTPCRD.MSTPD20 b20置0, 默认是1模块时钟是未使能的。
- 配置 P014PFS.ASEL设置为1 使能模拟模式
P014PFS.PMR设置为0
P014PFS.PDR 设置为0 输入 注意这里一定要设置为输入,不能设置为输出。
P014PFS.PCR设置为0 无上下拉
注意PFS寄存器操作需要解锁 PWPR
- 设置数据格式DADPR 设置参考电压DAVREFCR 设置是否同步ADC,DAADSCR
- 写值DADR0
- 启动转换DACR
直接基于寄存器进行操作
\ra_cfg\fsp_cfg\bsp\bsp_mcu_family_cfg.h中定义了
#define BSP_MCU_GROUP_RA2L1 (1)
\ra\fsp\src\bsp\cmsis\Device\RENESAS\Include\renesas.h中
#elif BSP_MCU_GROUP_RA2L1
#include "R7FA2L1AB.h"
包含了 #include "R7FA2L1AB.h"
该头文件定义了各外设寄存器基地址
DAC寄存器组结构体是R_DAC
#define R_DAC ((R_DAC_Type *) R_DAC_BASE)
所以直接寄存器操作包含renesas.h即可。
代码如下
void dac_init(void)
{
R_MSTP->MSTPCRD_b.MSTPD20 = 0;
R_PMISC->PWPR_b.B0WI = 0;
R_PMISC->PWPR_b.PFSWE = 1;
R_PFS->PORT[0].PIN[14].PmnPFS_b.ASEL = 1;
R_PFS->PORT[0].PIN[14].PmnPFS_b.PCR = 0;
R_PFS->PORT[0].PIN[14].PmnPFS_b.PMR = 0;
R_PFS->PORT[0].PIN[14].PmnPFS_b.PDR = 0;
R_PMISC->PWPR_b.PFSWE = 0;
R_PMISC->PWPR_b.B0WI = 1;
R_DAC->DADPR_b.DPSEL = 0;
R_DAC->DAADSCR_b.DAADST = 0;
R_DAC->DAVREFCR_b.REF = 1;
//R_DAC->DADR[0] = 0x00;
//R_DAC->DACR_b.DAOE0 = 1;
}
void dac_out(uint16_t val)
{
R_DAC->DADR[0] = val;
R_DAC->DACR_b.DAOE0 = 1;
}
测试
dac_init();
while (1)
{
dac_out(0);
rt_thread_mdelay(5000);
dac_out(2048);
rt_thread_mdelay(5000);
dac_out(4095);
rt_thread_mdelay(5000);
}
分别输出三个电压等级实测电压值。
参考电压3.39,可以看到误差不到2%, 且线性度不错,如果做校正精度会更高。
DAC值
|
实测电压值
|
理论值
|
偏差
|
0
|
0.01
|
0
|
|
2048
|
1.67
|
1.695
|
1.47%
|
4095
|
3.34
|
3.39
|
1.47%
|
问题
DAC引脚一定要设置为模拟输入,无上下拉。
注意虽然是DAC输出,也不能设置为输出,要设置为输入。