通过我们的 DAC 解决方案,体验精度与转化的协同效应。
A
A
硬件概览
它是如何工作的?
DAC 8 Click 基于德州仪器(Texas Instruments)出品的 DAC8554IPWR,这是一款 16 位、四通道、超低毛刺、输出电压型数字-模拟转换器(DAC)。该器件具有出色的线性度和极低的毛刺,同时还集成了高精度输出放大器,可在宽电源电压范围内实现轨到轨(rail-to-rail)输出摆幅。DAC8554IPWR 还具备上电复位功能,确保 DAC 输出在上电时维持在零电平,直到进行有效写入操作。此外,它还提供掉电模式,在该模式下,每个通道的电流消耗可降至仅 175nA。 为实现 DAC8554IPWR 的全范围可编程参考电压,DAC 8 Click 板搭配了另一颗 DAC——
DAC60501MDGSR,这是一款 12 位 DAC,同样来自德州仪器。该 DAC 的输出连接至 DAC8554IPWR 的 VREF 引脚,从而可将参考电压设置在 0V 到 5V 之间,既能提供高精度,又能保持低功耗,使得 DAC 8 Click 成为适用于需要高精度 16 位 DAC 输出的应用的完全可定制化解决方案。DAC60501MDGSR 通过 I2C 接口与主控 MCU 通信,支持最高 100kHz 时钟频率,并通过板载 ADDR SEL 跳线选择 I2C 地址。 DAC8554IPWR 则通过 3 线 SPI 接口与 MCU 通信,兼容标准 SPI、QSPI™、MICROWIRE™,并支持高达 50MHz 的时钟速率。该器件还具备软件同
时更新功能,可通过 mikroBUS™ 的 PWM 引脚触发——新数据写入后,所有 DAC 通道可同时同步更新。 此外,板载 CS 引脚用于启用 SPI 接口连接到串口,控制 DAC8554IPWR 的数据传输。DAC 8 Click 支持 3.3V 和 5V 逻辑电平,用户可通过板载 VCC SEL 跳线选择适配目标系统的工作电压。 更多关于 DAC8554IPWR 的功能、电气规格和典型性能,请参考其数据手册。该 Click 板还配备了驱动库,包含易于使用的函数和使用示例,可作为开发时的参考。
功能概述
开发板
Nucleo-64 搭载 STM32F410RB MCU 提供了一种经济高效且灵活的平台,供开发者探索新想法并原型设计他们的项目。该板利用 STM32 微控制器的多功能性,使用户能够为他们的项目选择最佳的性能与功耗平衡。它配备了 LQFP64 封装的 STM32 微控制器,并包含了如用户 LED(同时作为 ARDUINO® 信号)、用户和复位按钮,以及 32.768kHz 晶体振荡器用于精确的计时操作等基本组件。Nucleo-64 板设计考虑到扩展性和灵活性,它特有的 ARDUINO® Uno
V3 扩展连接器和 ST morpho 扩展引脚头,提供了对 STM32 I/O 的完全访问,以实现全面的项目整合。电源供应选项灵活,支持 ST-LINK USB VBUS 或外部电源,确保在各种开发环境中的适应性。该板还配备了一个具有 USB 重枚举功能的板载 ST-LINK 调试器/编程器,简化了编程和调试过程。此外,该板设计旨在简化高级开发,它的外部 SMPS 为 Vcore 逻辑供电提供高效支持,支持 USB 设备全速或 USB SNK/UFP 全速,并内置加密功能,提升了项目的功效
和安全性。通过外部 SMPS 实验的专用连接器、 用于 ST-LINK 的 USB 连接器以及 MIPI® 调试连接器,提供了更多的硬件接口和实验可能性。开发者将通过 STM32Cube MCU Package 提供的全面免费软件库和示例得到广泛支持。这些,加上与多种集成开发环境(IDE)的兼容性,包括 IAR Embedded Workbench®、MDK-ARM 和 STM32CubeIDE,确保了流畅且高效的开发体验,使用户能够充分利用 Nucleo-64 板在他们的项目中的能力。
微控制器概述
MCU卡片 / MCU

建筑
ARM Cortex-M4
MCU 内存 (KB)
128
硅供应商
STMicroelectronics
引脚数
64
RAM (字节)
32768
你完善了我!
配件
Click Shield for Nucleo-64 配备了两个专有的 mikroBUS™ 插座,使得所有的 Click board™ 设备都可以轻松地与 STM32 Nucleo-64 开发板连接。这样,Mikroe 允许其用户从不断增长的 Click boards™ 范围中添加任何功能,如 WiFi、GSM、GPS、蓝牙、ZigBee、环境传感器、LED、语音识别、电机控制、运动传感器等。您可以使用超过 1537 个 Click boards™,这些 Click boards™ 可以堆叠和集成。STM32 Nucleo-64 开发板基于 64 引脚封装的微控制器,采用 32 位 MCU,配备 ARM Cortex M4 处理器,运行速度为 84MHz,具有 512Kb Flash 和 96KB SRAM,分为两个区域,顶部区域代表 ST-Link/V2 调试器和编程器,而底部区域是一个实际的开发板。通过 USB 连接方便地控制和供电这些板子,以便直接对 Nucleo-64 开发板进行编程和高效调试,其中还需要额外的 USB 线连接到板子上的 USB 迷你接口。大多数 STM32 微控制器引脚都连接到了板子左右边缘的 IO 引脚上,然后连接到两个现有的 mikroBUS™ 插座上。该 Click Shield 还有几个开关,用于选择 mikroBUS™ 插座上模拟信号的逻辑电平和 mikroBUS™ 插座本身的逻辑电压电平。此外,用户还可以通过现有的双向电平转换器,使用任何 Click board™,无论 Click board™ 是否在 3.3V 或 5V 逻辑电压电平下运行。一旦将 STM32 Nucleo-64 开发板与我们的 Click Shield for Nucleo-64 连接,您就可以访问数百个工作于 3.3V 或 5V 逻辑电压电平的 Click boards™。
使用的MCU引脚
mikroBUS™映射器
“仔细看看!”
Click board™ 原理图

一步一步来
项目组装
软件支持
库描述
DAC 8 Click 演示应用程序使用 NECTO Studio开发,确保与 mikroSDK 的开源库和工具兼容。该演示设计为即插即用,可与所有具有 mikroBUS™ 插座的 开发板、入门板和 mikromedia 板完全兼容,用于快速实现和测试。
示例描述
该 Click 板搭载一个 12 位缓冲数字转模拟转换器(DAC),通过外部电压参考将数字值转换为相应的电压电平。
关键功能:
dac8_cfg_setup- 配置对象初始化函数。dac8_init- 初始化函数。dac8_device_config- 配置 DAC 8 Click 板上的数字转模拟输出。dac8_load_dac- 所有通道的缓冲器需先加载期望数据,然后调用此函数加载至 DAC 输出。dac8_set_vref- 设置 DAC 8 Click 板的精密内部参考电压。
应用初始化
初始化驱动以启用 I2C 接口,配置 DAC60501:执行软件复位、禁用同步和内部参考电压、关闭掉电模式,并将设定参考电压内部除以 2,同时为对应 DAC 通道配置放大器增益为 2。初始化驱动以启用 SPI 接口,启用 DAC8554,并输出初始化日志信息。
应用任务
此示例展示了 DAC 8 Click 板的使用方式。DAC 8 板将依次更改各通道的输出电压值:通道 A ~ 2500 mV,通道 B ~ 1250 mV,通道 C ~ 625 mV,通道 D ~ 312 mV。所有变化通过 USB UART 进行日志记录,每 5 秒更新一次。
开源
代码示例
完整的应用程序代码和一个现成的项目可以通过NECTO Studio包管理器直接安装到NECTO Studio。 应用程序代码也可以在MIKROE的GitHub账户中找到。
/*!
* \file
* \brief Dac8 Click example
*
* # Description
* This Click carries 12-bit buffered Digital-to-Analog Converter. It converts digital value to
* the corresponding voltage level using external voltage reference.
*
* The demo application is composed of two sections :
*
* ## Application Init
* Initialization driver enables - I2C.
* Configure DAC60501: executes call software reset, disable sync and internal reference and
* disable Power-down mode, the set reference voltage is internally divided by a factor of 2,
* amplifier for corresponding DAC has a gain of 2.
* Initialization driver enables - SPI, enable DAC8554, also write log.
*
* ## Application Task
* This is an example that demonstrates the use of the DAC 8 Click board.
* DAC 8 board changeing output values:
* Channel A ~ 2500 mV, Channel B ~ 1250 mV,
* Channel C ~ 625 mV, Channel D ~ 312 mV.
* All data logs write on USB uart changes every 5 sec.
*
*
* \author MikroE Team
*
*/
// ------------------------------------------------------------------- INCLUDES
#include "board.h"
#include "log.h"
#include "dac8.h"
// ------------------------------------------------------------------ VARIABLES
static dac8_t dac8;
static log_t logger;
dac8_cfg_data_t cfg_dac;
// ------------------------------------------------------ APPLICATION FUNCTIONS
void application_init ( void )
{
log_cfg_t log_cfg;
dac8_cfg_t cfg;
/**
* Logger initialization.
* Default baud rate: 115200
* Default log level: LOG_LEVEL_DEBUG
* @note If USB_UART_RX and USB_UART_TX
* are defined as HAL_PIN_NC, you will
* need to define them manually for log to work.
* See @b LOG_MAP_USB_UART macro definition for detailed explanation.
*/
LOG_MAP_USB_UART( log_cfg );
log_init( &logger, &log_cfg );
log_info( &logger, "---- Application Init ----" );
// Click initialization.
dac8_cfg_setup( &cfg );
DAC8_MAP_MIKROBUS( cfg, MIKROBUS_1 );
dac8_init( &dac8, &cfg, DAC8_MASTER_I2C );
log_printf( &logger, "---------------------\r\n" );
log_printf( &logger, " I2C driver init. \r\n" );
Delay_ms ( 100 );
log_printf( &logger, "---------------------\r\n" );
log_printf( &logger, " DAC60501 \r\n" );
log_printf( &logger, "---------------------\r\n" );
log_printf( &logger, " Soft reset \r\n" );
dac8_soft_reset( &dac8 );
Delay_ms ( 100 );
log_printf( &logger, "---------------------\r\n" );
log_printf( &logger, " Disable sync. mode \r\n" );
dac8_enable_sync( &dac8, DAC8_SYNC_DISABLE );
Delay_ms ( 100 );
log_printf( &logger, "---------------------\r\n" );
log_printf( &logger, " Set config.: \r\n" );
log_printf( &logger, " Enable: \r\n" );
log_printf( &logger, " Internal reference \r\n" );
log_printf( &logger, " Disable: \r\n" );
log_printf( &logger, " Power-down mode \r\n" );
dac8_set_config( &dac8, DAC8_CONFIG_REF_PWDWN_ENABLE, DAC8_CONFIG_DAC_PWDWN_DISABLE );
Delay_ms ( 100 );
log_printf( &logger, "---------------------\r\n" );
log_printf( &logger, " Vref divided by 2 \r\n" );
log_printf( &logger, " Set DAC gain of 2 \r\n" );
dac8_set_gain( &dac8, DAC8_GAIN_REF_DIV_2, DAC8_GAIN_BUFF_GAIN_1 );
Delay_ms ( 100 );
log_printf( &logger, "---------------------\r\n" );
log_printf( &logger, " Set Vref ~ 2500 mV \r\n" );
dac8_set_vref( &dac8, 2500 );
Delay_ms ( 1000 );
dac8_init( &dac8, &cfg, DAC8_MASTER_SPI );
log_printf( &logger, "---------------------\r\n" );
log_printf( &logger, " SPI driver init. \r\n" );
Delay_ms ( 1000 );
log_printf( &logger, "---------------------\r\n" );
log_printf( &logger, " DAC8554 \r\n" );
log_printf( &logger, "---------------------\r\n" );
log_printf( &logger, " Enable DAC8554 \r\n" );
dac8_device_enable( &dac8, DAC8_DAC8554_ENABLE );
Delay_ms ( 100 );
}
void application_task ( void )
{
log_printf( &logger, "---------------------\r\n" );
cfg_dac.addr = DAC8_ADDR_DEFAULT;
cfg_dac.ctrl_upd_an_out = DAC8_CTRL_UPD_AN_OUT_SINGLE_CH_STORE;
cfg_dac.dac_sel = DAC8_DAC_SEL_CH_A;
cfg_dac.pwr_mode = DAC8_PWR_MODE_POWER_UP;
cfg_dac.dac_val = 0xFFFF;
log_printf( &logger, " Channel A ~ 2500 mV \r\n" );
dac8_device_config( &dac8, cfg_dac );
dac8_load_dac( &dac8 );
Delay_ms ( 1000 );
Delay_ms ( 1000 );
Delay_ms ( 1000 );
Delay_ms ( 1000 );
Delay_ms ( 1000 );
log_printf( &logger, "---------------------\r\n" );
cfg_dac.addr = DAC8_ADDR_DEFAULT;
cfg_dac.ctrl_upd_an_out = DAC8_CTRL_UPD_AN_OUT_SINGLE_CH_STORE;
cfg_dac.dac_sel = DAC8_DAC_SEL_CH_B;
cfg_dac.pwr_mode = DAC8_PWR_MODE_POWER_UP;
cfg_dac.dac_val = 0x7FFF;
log_printf( &logger, " Channel B ~ 1250 mV \r\n" );
dac8_device_config( &dac8, cfg_dac );
dac8_load_dac( &dac8 );
Delay_ms ( 1000 );
Delay_ms ( 1000 );
Delay_ms ( 1000 );
Delay_ms ( 1000 );
Delay_ms ( 1000 );
log_printf( &logger, "---------------------\r\n" );
cfg_dac.addr = DAC8_ADDR_DEFAULT;
cfg_dac.ctrl_upd_an_out = DAC8_CTRL_UPD_AN_OUT_SINGLE_CH_STORE;
cfg_dac.dac_sel = DAC8_DAC_SEL_CH_C;
cfg_dac.pwr_mode = DAC8_PWR_MODE_POWER_UP;
cfg_dac.dac_val = 0x3FFF;
log_printf( &logger, " Channel C ~ 625 mV \r\n" );
dac8_device_config( &dac8, cfg_dac );
dac8_load_dac( &dac8 );
Delay_ms ( 1000 );
Delay_ms ( 1000 );
Delay_ms ( 1000 );
Delay_ms ( 1000 );
Delay_ms ( 1000 );
log_printf( &logger, "---------------------\r\n" );
cfg_dac.addr = DAC8_ADDR_DEFAULT;
cfg_dac.ctrl_upd_an_out = DAC8_CTRL_UPD_AN_OUT_SINGLE_CH_STORE;
cfg_dac.dac_sel = DAC8_DAC_SEL_CH_D;
cfg_dac.pwr_mode = DAC8_PWR_MODE_POWER_UP;
cfg_dac.dac_val = 0x1FFF;
log_printf( &logger, " Channel D ~ 312 mV\r\n" );
dac8_device_config( &dac8, cfg_dac );
dac8_load_dac( &dac8 );
Delay_ms ( 1000 );
Delay_ms ( 1000 );
Delay_ms ( 1000 );
Delay_ms ( 1000 );
Delay_ms ( 1000 );
}
int main ( void )
{
/* Do not remove this line or clock might not be set correctly. */
#ifdef PREINIT_SUPPORTED
preinit();
#endif
application_init( );
for ( ; ; )
{
application_task( );
}
return 0;
}
// ------------------------------------------------------------------------ END
额外支持
资源
类别:数模转换器

































