跳到主要内容

10 DAC 模拟电压实验

在这里插入图片描述

开发板官网https://www.edevkit.com/)

本系列教程目录:


DAC 模拟电压实验

本章目标:

  • 了解 DAC 基本概念和 RA6M5 处理器的 DAC 外设;
  • 学会使用 RASC 配置 DAC 输出指定电压和正弦波形;

硬件设计

本实验使用开发板的 DAC 模块,通过 DAC 通道输出模拟电压信号,可使用示波器观察波形。

软件设计

新建工程

复制一份“09 ADC”修改文件夹名“10 DAC”,双击打开 EBF_RA6M5.uvprojx 工程,通过 Keil 的新建文件新建 dac.cdac.h,保存到目录下的 \src 文件夹下。

FSP 配置

在 RASC 中配置 DAC 时,先配置 DAC 的通道的引脚,再去添加 DAC 的 Stack 模块并进行配置。

Keil 界面选择“Tools”→“RA Smart Configurator”打开 RASC 界面。

首先配置 DAC 通道。

插图01

在 RASC 的“Pins”中的“Peripherals”选择“Analog:DAC”,选择 DAC 通道 DAC0 在右侧配置中将“Operation Mode”设置为“Enabled”,引脚只有一个 P014。如果是 DAC1,引脚是 P015。

配置 DAC Stack 模块,在 FSP 的“Stacks”界面点击“New Stack”,选择“Analog”中的“DAC(r_dac)”。

插图02

打开 DAC Stack 属性界面,配置 DAC0 参数,这些属性基本都不需要配置,按照默认值即可。

插图03

DAC属性描述
Name模块实例名,默认设置为“g_dac0”即可
Channel通道。选择通道 0
Synchronize with ADC与 ADC 同步
Date Format数据格式:右对齐/左对齐
Output Amplifer使能 DAC 输出放大器
Charge Pump (Requires MOCO active)使能 DAC 充电泵
Internal Output内部输出
ELC Trigger Source选择 ELC 触发源
Pins > DA0选择 P014 引脚

配置完成之后可以按下快捷键“Ctrl + S”保存,最后点击 “Generate Project Content” 按钮,让软件自动生成配置代码即可。

  1. 引脚配置信息

引脚配置在 pin_data.c 文件里生成。

const ioport_pin_cfg_t g_bsp_pin_cfg_data[] = {
{
.pin = BSP_IO_PORT_00_PIN_14,
.pin_cfg = ((uint32_t) IOPORT_CFG_ANALOG_ENABLE)
},
}

将 P014 复用为 IOPORT_CFG_ANALOG_ENABLE,也就是使能了 P014 的模拟量输入功能。

  1. DAC配置信息

DAC 设备对象会在 hal_data.c 中生成,是 dac_cfg_t 类型的结构体常量,名为 g_dac0_cfg

const dac_cfg_t g_dac0_cfg =
{
.channel = 0,
.ad_da_synchronized = false,
.p_extend = &g_dac0_ext_cfg
};

channel:DAC 通道

ad_da_synchronized:是否和 ADC 同步转换

p_extend:扩展的配置信息

g_dac0_ext_cfg,它被用来描述 DAC 的扩展配置参数,比如是否使用放大器、数据存放格式、是否使能内部输出等。

const adc_extended_cfg_t g_adc0_cfg_extend =
{
.add_average_count = ADC_ADD_OFF,
.clearing = ADC_CLEAR_AFTER_READ_ON,
.trigger = ADC_START_SOURCE_DISABLED,
.trigger_group_b = ADC_START_SOURCE_DISABLED,
.double_trigger_mode = ADC_DOUBLE_TRIGGER_DISABLED,
.adc_vref_control = ADC_VREF_CONTROL_VREFH,
.enable_adbuf = 0,
...
}

程序设计

实现 DAC0 通道输出模拟电压值,通过生成的正弦波数据数组,在循环中实现输出正弦波电压信号,在示波器查看正弦波波形。

  1. 打开 DAC 设备
R_DAC_Open(dac_ctrl_t * const p_ctrl, dac_cfg_t const * const p_cfg);
  1. 开启转换
R_DAC_Start(dac_ctrl_t * const p_ctrl);
  1. 设置转换值
R_DAC_Write(dac_ctrl_t * const p_ctrl, uint16_t value);

此函数会将 value 写入到 DAC 的 DADR 寄存器中,如果开启了 DAC 转换,会立刻进行 DAC 转换,并把模拟信号输出到 DAC 引脚上。

  1. 停止转换
R_DAC_Stop(dac_ctrl_t * const p_ctrl);
  1. 换算转换值
dac_data = (uint16_t)(4095*((voltage)/3.3f));

DAC 量程 04095,对应电压 03.3V,设置电压值需要换算成 DAC 值。

程序编写

dac.h 头文件里定义初始化函数,设置转换值函数,正弦波生成函数。

#ifndef _BSP_DAC_H_
#define _BSP_DAC_H_

#include "hal_data.h"

void dac_Init();
void dac_SetVoltage(float voltage);
void dac_SinWave_Cycle(uint32_t time_interval);

#endif

dac.c 里实现初始化函数、设置转换值函数,正弦波生成函数。

#include "dac.h"

//正弦波数据数组变量
uint16_t var[] = {
2048, 2460, 2856, 3218, 3532, 3786, 3969, 4072, 4093, 4031, 3887, 3668,
3382, 3042, 2661, 2255, 1841, 1435, 1054, 714, 428, 209, 65, 3, 24, 127,
310, 564, 878, 1240, 1636, 2048
};

//初始化DAC
void dac_Init()
{
R_DAC_Open(&g_dac0_ctrl, &g_dac0_cfg);
R_DAC_Start(&g_dac0_ctrl);
}

//设置当前的电压
void dac_SetVoltage(float voltage)
{
uint16_t dac_data;
dac_data = (uint16_t)(4095*((voltage)/3.3f));
R_DAC_Write(&g_dac0_ctrl, dac_data);
}

//生成正弦波波形
void dac_SinWave_Cycle(uint32_t time_interval)
{
for(uint32_t i = 0 ; i < (sizeof(var)/sizeof(var[0])); i++)
{
R_DAC_Write(&g_dac0_ctrl, var[i]);
R_BSP_SoftwareDelay(time_interval, BSP_DELAY_UNITS_MILLISECONDS);
}
}

hal_entry.c 文件中添加头文件 dac.h,在 hal_entry 入口函数初始化 dac,在循环中执行正弦波生成函数。

void hal_entry(void)
{
/* TODO: add your own code here */

led_Init(); // LED 初始化
uart0_Init();
dac_Init();

printf("start DAC test\r\n");

while(1)
{
//生成正弦波波形
dac_SinWave_Cycle(1);
}


#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}

下载验证

首先使用示波器探头连接 P014 引脚和开发板的 GND 引脚。

连接下载器,将程序编译并下载到开发板之后,按下复位按键来复位开发板,程序启动初始化完。

按下示波器“AUTO”键自动检测波形,可以看到示波器有正弦波形。

插图04