DAC设备
DAC简介
DAC(Digital-to-Analogl Converter) 指数模转换器。是指把二进制数字量形式的离散数字信号转换为连续变化的模拟信号的器件。DAC 主要由数字寄存器、模拟电子开关、位权网络、求和运算放大器和基准电压源(或恒流源)组成。用存于数字寄存器的数字量的各位数码,分别控制对应位的模拟电子开关,使数码为 1 的位在位权网络上产生与其位权成正比的电流值,再由运算放大器对各电流值求和,并转换成电压值。
IOTE板子上与DAC相关的有:AUDIO和AUXDAC两个外部DAC输出脚。
驱动支持
访问DAC设备前,需要保证相关驱动配置已选中。
Windows环境:利用RT-Thread官方env工具直接在代码根目录下执行menuconfig进入配置。
Linux环境:在代码根目录下执行scons --menuconfig进入配置。
DAC驱动所在路径如下:
RT-Thread Components -> Device Drivers -> Using DAC device drivers
访问DAC设备
访问DAC设备,库中提供了以下接口:
函数 | 描述 |
---|---|
rt_device_find() | 根据DAC名称查找设备获取设备句柄 |
rt_dac_enable() | 使能DAC设备 |
rt_dac_write() | DAC输出 |
rt_dac_disable() | 关闭DAC设备 |
查找DAC设备
查找DAC设备,函数原型如下所示:
rt_device_t rt_device_find(const char* name);
-
参数
[IN]name:DAC设备名称,目前注册到的系统中的DAC设备名称为"dac"。
-
返回值
RT_NULL:失败,设备不存在。
非RT_NULL:成功,该返回值是操作DAC设备的句柄,在后续的接口中作为函数入参。
使能DAC设备
使能指定DAC设备,函数原型如下所示:
rt_err_t rt_dac_enable(rt_dac_device_t dev, rt_uint32_t channel);
-
参数
[IN]dev:DAC设备句柄,查找设备函数的返回值。
[IN]channel:DAC通道,支持的通道及引脚对应如下:
0 -> 引脚AUDIO
1 -> 引脚AUXDAC
-
返回值
0:正常。
其他:错误,RT-Thread定义的错误类型。
DAC输出
DAC输出,函数原型如下所示:
rt_uint32_t rt_dac_write(rt_dac_device_t dev,
rt_uint32_t channel,
rt_uint32_t value);
-
参数
[IN]dev:DAC设备句柄,查找设备函数的返回值。
[IN]channel:DAC通道。
注:调用时,需要与前述使能DAC设备的channel保持一致。
[IN]value:DAC输出值。
-
返回值
0:正常。
关闭DAC设备
关闭DAC设备,函数原型如下所示:
rt_err_t rt_dac_disable(rt_dac_device_t dev, rt_uint32_t channel);
-
参数
[IN]dev:DAC设备句柄,查找设备函数的返回值。
[IN]channel:DAC通道。
注:调用时,需要与前述使能DAC设备的channel保持一致。
-
返回值
0:正常。
其他:错误,RT-Thread定义的错误类型。
DAC使用示例
使用示例需要配置menuconfig,使能例程与外设,步骤如下:
- 使能例程
Application Example Config -> Enable DAC Example
- 使能外设驱动
Hardware Drivers Config -> On-chip Peripheral Drivers -> Enable DAC
以下提供DAC测试实例,测试步骤如下:
- 根据DAC设备名称,获取DAC设备句柄。
- 使能DAC设备,指定采样通道。
- DAC输出。
- 关闭DAC设备。
#include <rtthread.h>
#ifdef APP_EXAMPLE_DAC
#ifndef RT_USING_DAC
#error "Please enable rt-thread dac device driver"
#endif
#ifndef BSP_USING_DAC
#error "Please enable on-chip peripheral dac config"
#endif
#include <rtdevice.h>
#define THREAD_STACK_SIZE 512
#define THREAD_PRIORITY 5
#define THREAD_TIMESLICE 5
#define DAC_DEVICE_NAME "dac"
#define DAC_DEV_CHANNEL 1
static rt_dac_device_t dac_dev = NULL;
static int dac_app_set_value(rt_dac_device_t dac_dev, rt_uint32_t value)
{
rt_dac_enable(dac_dev, DAC_DEV_CHANNEL);
rt_dac_write(dac_dev, DAC_DEV_CHANNEL, value);
rt_dac_disable(dac_dev, DAC_DEV_CHANNEL);
return RT_EOK;
}
static void dac_thread_entry(void *parameter)
{
rt_uint32_t value = 0;
while (1)
{
dac_app_set_value(dac_dev, value); // 10bit, 0~1023
value += 10;
if (value > 1023)
{
value = 0;
}
rt_thread_mdelay(100);
}
}
int dac_app_sample(void)
{
rt_thread_t thread = RT_NULL;
rt_kprintf("dac_app_sample\n");
dac_dev = (rt_dac_device_t)rt_device_find(DAC_DEVICE_NAME);
if (dac_dev == RT_NULL)
{
rt_kprintf("find %s failed!\n", DAC_DEVICE_NAME);
return -RT_EEMPTY;
}
/* 创建 serial 线程 */
thread = rt_thread_create("dac_app",
dac_thread_entry,
RT_NULL,
THREAD_STACK_SIZE,
THREAD_PRIORITY,
THREAD_TIMESLICE);
/* 创建成功则启动线程 */
if (RT_NULL == thread)
{
return -RT_ERROR;
}
else
{
rt_thread_startup(thread);
}
return RT_EOK;
}
#endif