中级
30 分钟

使用MCP4728和PIC18F57Q43在各种应用中解码、表达和放大数据

赋能数据表达

DAC 4 Click with Curiosity Nano with PIC18F57Q43

已发布 6月 25, 2024

点击板

DAC 4 Click

开发板

Curiosity Nano with PIC18F57Q43

编译器

NECTO Studio

微控制器单元

PIC18F57Q43

专为精确设计,它将数字洞察转化为模拟现实,实现无缝通信和决策。

A

A

硬件概览

它是如何工作的?

DAC 4 Click 基于 MCP4728,这是一款来自 Microchip 的四通道 12 位电压输出数模转换器 (DAC),具有非易失性存储器 (EEPROM)。其板载精密输出放大器使其能够实现轨到轨的模拟输出摆幅。 DAC 输入代码、设备配置位和 I2C 地址位可使用 I2C 串行接口命令编程到非易失性存储器 (EEPROM) 中。非易失性存储器功能使 DAC 设备能够在断电期间保存 DAC 输入代码,从而使 DAC 输出在上电后立即可用,具有保存的设置。 MCP4728 设备具有高精度内部电压参考 (VREF = 2.048V)。用户可以选择内部参考,也可以为每个

通道单独使用外部参考(VDD)。这使得 ADC 4-click 在各种应用中具有良好的灵活性。通过设置配置寄存器位,每个通道可以单独在正常模式或掉电模式下操作。在掉电模式下,掉电通道中的大多数内部电路都关闭以节省功耗,输出放大器可以配置为呈现已知的低、中或高电阻输出负载。该设备还包括一个上电复位 (POR) 电路,以确保可靠的上电,并具有用于 EEPROM 编程电压的板载电荷泵。 MCP4728 具有四个输出引脚,连接到输出端子块 (TB1 和 TB2)。 DAC 的输出范围为 0V 至 VREF 或 0V至 2×VREF。 与主 MCU 的通信通过

两线 I2C 兼容串行接口建立,支持标准 (100 kHz)、快速 (400 kHz) 或高速 (3.4 MHz) 模式。 I2C 线路 (SCL 和 SDA) 被引导到专用的 mikroBUS™ 引脚。 LDA 引脚是多用途 GPIO:它可以用作同步输入或设备 I2C 地址选择。 RDY 引脚还可以可选地用于监控 EEPROM 编程活动的状态。 此 Click board™ 可以选择 3.3V 或 5V 逻辑电压电平,通过 VCC SEL 跳线选择。 这样,3.3V 和 5V 的 MCU 都可以正确使用通信线路。 此外,该 Click board™ 配备了包含易于使用的功能和示例代码的库,可用作进一步开发的参考。

DAC 4 Click top side image
DAC 4 Click bottom side image

功能概述

开发板

PIC18F57Q43 Curiosity Nano 评估套件是一款尖端的硬件平台,旨在评估 PIC18-Q43 系列内的微控制器。其设计的核心是包含了功能强大的 PIC18F57Q43 微控制器(MCU),提供先进的功能和稳健的性能。这个评估套件的关键特点包括一个黄 色用户 LED 和一个响应灵敏的机械用户开关,提供无

缝的交互和测试。为一个 32.768kHz 水晶振荡器足迹提供支持,确保精准的定时能力。套件内置的调试器拥有一个绿色电源和状态 LED,使编程和调试变得直观高效。此外,增强其实用性的还有虚拟串行端口 (CDC)和一个调试 GPIO 通道(DGI GPIO),提供广泛的连接选项。该套件通过 USB 供电,拥有由

 MIC5353 LDO 调节器提供支持的可调目标电压功能,确保在 1.8V 至 5.1V 的输出电压范围内稳定运行,最大输出电流为 500mA,受环境温度和电压限制。

PIC18F57Q43 Curiosity Nano double side image

微控制器概述 

MCU卡片 / MCU

default

建筑

PIC

MCU 内存 (KB)

128

硅供应商

Microchip

引脚数

48

RAM (字节)

8196

你完善了我!

配件

Curiosity Nano Base for Click boards 是一款多功能硬件扩展平台,专为简化 Curiosity Nano 套件与扩展板之间的集成而设计,特别针对符合 mikroBUS™ 标准的 Click 板和 Xplained Pro 扩展板。这款创新的基板(屏蔽板)提供了无缝的连接和扩展可能性,简化了实验和开发过程。主要特点包括从 Curiosity Nano 套件提供 USB 电源兼容性,以及为增强灵活性而提供的另一种外部电源输入选项。板载锂离子/锂聚合物充电器和管理电路确保电池供电应用的平稳运行,简化了使用和管理。此外,基板内置了一个固定的 3.3V 电源供应单元,专用于目标和 mikroBUS™ 电源轨,以及一个固定的 5.0V 升压转换器,专供 mikroBUS™ 插座的 5V 电源轨,为各种连接设备提供稳定的电力供应。

Curiosity Nano Base for Click boards accessories 1 image

使用的MCU引脚

mikroBUS™映射器

NC
NC
AN
NC
NC
RST
NC
NC
CS
NC
NC
SCK
NC
NC
MISO
NC
NC
MOSI
Power Supply
3.3V
3.3V
Ground
GND
GND
Multipurpose Pin
PB0
PWM
Data Ready
PA6
INT
NC
NC
TX
NC
NC
RX
I2C Clock
PB2
SCL
I2C Data
PB1
SDA
Power Supply
5V
5V
Ground
GND
GND
1

“仔细看看!”

Click board™ 原理图

DAC 4 Click Schematic schematic

一步一步来

项目组装

Curiosity Nano Base for Click boards front image hardware assembly

从选择您的开发板和Click板™开始。以Curiosity Nano with PIC18F57Q43作为您的开发板开始。

Curiosity Nano Base for Click boards front image hardware assembly
Charger 27 Click front image hardware assembly
PIC18F47Q10 Curiosity Nano front image hardware assembly
Prog-cut hardware assembly
Charger 27 Click complete accessories setup image hardware assembly
Board mapper by product8 hardware assembly
Necto image step 2 hardware assembly
Necto image step 3 hardware assembly
Necto image step 4 hardware assembly
Necto image step 5 hardware assembly
Necto image step 6 hardware assembly
PIC18F57Q43 Curiosity MCU Step hardware assembly
Necto No Display image step 8 hardware assembly
Necto image step 9 hardware assembly
Necto image step 10 hardware assembly
Debug Image Necto Step hardware assembly

软件支持

库描述

该库包含 这个库包含了DAC 4 Click 驱动程序的 API。

关键函数:

  • dac4_voltage_reference_set - 设置通道电压参考值

  • dac4_gain_set - 写入通道增益值

  • dac4_data_report - 读取通道数据并形成报告

开源

代码示例

完整的应用程序代码和一个现成的项目可以通过NECTO Studio包管理器直接安装到NECTO Studio 应用程序代码也可以在MIKROE的GitHub账户中找到。

/*!
 * \file 
 * \brief Dac4 Click example
 * 
 * # Description
 * This application enables usage of digital to analog converter.
 *
 * The demo application is composed of two sections :
 * 
 * ## Application Init 
 * Initializes I2C driver, executes general call reset and wake up commands.
 * 
 * ## Application Task  
 * Changes the output voltage of channels every 3 seconds, and displays
 * the channels status on the USB UART.
 * 
 * \author MikroE Team
 *
 */
// ------------------------------------------------------------------- INCLUDES

#include "board.h"
#include "log.h"
#include "dac4.h"

// ------------------------------------------------------------------ VARIABLES

static dac4_t dac4;
static log_t logger;

// ------------------------------------------------------- ADDITIONAL FUNCTIONS

void dac4_log_report ( uint8_t channel_no )
{
    dac4_channel_setting_t dac4_channel_buffer[ 8 ];

    dac4_data_report ( &dac4, dac4_channel_buffer );
    channel_no *= 2;
    
    log_printf( &logger, "--- Power ON bit: " );
    switch ( dac4_channel_buffer[ channel_no ].por_bit )
    {
        case 0:
        {
            log_printf( &logger,"Power OFF\r\n" );
            break;
        }
        case 1:
        {
            log_printf( &logger, "Power ON\r\n" );
            break;
        }
        default :
        {
            break;
        }
    }

    log_printf( &logger, "--- V reference    : " );
    switch ( dac4_channel_buffer[ channel_no ].voltage_reference )
    {
        case DAC4_VREF_EXTERNAL:
        {
            log_printf( &logger, "External\r\n" );
            break;
        }
        case DAC4_VREF_INTERNAL:
        {
            log_printf( &logger, "Internal\r\n" );
            break;
        }
        default :
        {
            break;
        }
    }

    log_printf( &logger, "--- Power mode     : " );
    switch ( dac4_channel_buffer[ channel_no ].power_mode )
    {
        case DAC4_MODE_NORMAL:
        {
            log_printf( &logger, "Normal\r\n" );
            break;
        }
        case DAC4_MODE_1kOhm:
        {
            log_printf( &logger, "1 kOhm\r\n" );
            break;
        }
        case DAC4_MODE_100kOhm:
        {
            log_printf( &logger, "100 kOhm\r\n" );
            break;
        }
        case DAC4_MODE_500kOhm:
        {
            log_printf( &logger, "500 kOhm\r\n" );
            break;
        }
        default :
        {
            break;
        }
    }

    log_printf( &logger, "--- Gain value     : " );
    switch ( dac4_channel_buffer[ channel_no ].gain_value )
    {
        case DAC4_MODE_NORMAL:
        {
            log_printf( &logger, "1x Gain\r\n" );
            break;
        }
        case DAC4_MODE_1kOhm:
        {
            log_printf( &logger, "2x Gain\r\n" );
            break;
        }
        default :
        {
            break;
        }
    }
    
    log_printf( &logger, "--- DAC input data : %d  [0-4095]\r\n", dac4_channel_buffer[ channel_no ].dac_input_data );
    log_printf( &logger, "-------------------------------------\r\n" );
}

void dac4_set_output ( uint8_t channel_set )
{
    dac4_channel_setting_t dac4_channel_x;
    static uint16_t aux_dac_input_data = 0;
    
    dac4_channel_x.channel_select = channel_set;
    dac4_channel_x.udac_bit = DAC4_UPDATE;
    dac4_channel_x.voltage_reference = DAC4_VREF_EXTERNAL;
    dac4_channel_x.power_mode = DAC4_MODE_NORMAL;
    dac4_channel_x.gain_value = DAC4_GAIN_x1;
    dac4_channel_x.dac_input_data = aux_dac_input_data;

    if ( 0 != dac4_single_write( &dac4, &dac4_channel_x ) )
    {
        log_printf( &logger, "--- Fatal ERROR !!! \r\n" );
    }
    else
    {
        log_printf( &logger, "------------------------------------- \r\n" );
        log_printf( &logger, "--- Output setup done \r\n" );
        log_printf( &logger, "------------------------------------- \r\n" );
        aux_dac_input_data += 500;
        if ( aux_dac_input_data > 4095 )
        {
            aux_dac_input_data = 0;
        }
    }
}

void dac4_channel_report ( )
{
    log_printf( &logger, "\r\n -----> Channel A \r\n" );
    dac4_set_output( DAC4_CHANNEL_A );
    dac4_log_report( 0 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    
    log_printf( &logger, "\r\n -----> Channel B \r\n" );
    dac4_set_output( DAC4_CHANNEL_B );
    dac4_log_report( 1 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    
    log_printf( &logger, "\r\n -----> Channel C \r\n" );
    dac4_set_output( DAC4_CHANNEL_C );
    dac4_log_report( 2 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    
    log_printf( &logger, "\r\n -----> Channel D \r\n" );
    dac4_set_output( DAC4_CHANNEL_D );
    dac4_log_report( 3 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
}

// ------------------------------------------------------ APPLICATION FUNCTIONS

void application_init ( void )
{
    log_cfg_t log_cfg;
    dac4_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.

    dac4_cfg_setup( &cfg );
    DAC4_MAP_MIKROBUS( cfg, MIKROBUS_1 );
    dac4_init( &dac4, &cfg );
    log_info( &logger, "---- Application ----" );

    Delay_ms ( 500 );
    dac4_general_call_reset( &dac4 );
    Delay_ms ( 500 );
    dac4_general_call_wake_up( &dac4 );
    Delay_ms ( 500 );

    log_printf( &logger, "--- App init done \r\n \r\n" );
}

void application_task ( void )
{
    dac4_channel_report( );
}

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

额外支持

资源

喜欢这个项目吗?

'购买此套件' 按钮会直接带您进入购物车,您可以在购物车中轻松添加或移除产品。