STM32 DAC8734 4路16位DA驱动程序

一、DAC8734 芯片概述

DAC8734 是 TI 推出的 4通道、16位、电压输出 DAC ,采用 SPI 接口,特别适合 数字电源基准、偏置电压、校准系统

参数 规格
分辨率 16位
通道数 4路(A/B/C/D)
接口 SPI(最高 50MHz)
输出电压 ±10V、±5V、0-10V、0-5V
参考电压 内部 2.5V / 外部
封装 TSSOP-38

二、硬件连接(STM32 ↔ DAC8734)

推荐连接方式

复制代码
STM32           DAC8734
────────────────────────
SPIx_SCK   ───► SCLK
SPIx_MOSI  ───► SDIN
SPIx_MISO  ◄─── SDOUT
GPIOx_PIN  ───► SYNC (CS)
GPIOx_PIN  ───► LDAC
GPIOx_PIN  ◄─── RDY
GPIOx_PIN  ───► RST

电压配置跳线

PIN 配置
RNG0 / RNG1 输出电压范围
REFSEL 参考电压选择

三、DAC8734 寄存器定义

寄存器地址

c 复制代码
/* DAC8734 寄存器地址 */
#define DAC_REG_A        0x00
#define DAC_REG_B        0x01
#define DAC_REG_C        0x02
#define DAC_REG_D        0x03
#define DAC_REG_ALL      0x04

#define DAC_GAIN_REG     0x08
#define DAC_OFFSET_REG   0x09
#define DAC_CONFIG_REG   0x0A
#define DAC_STATUS_REG   0x0B

命令帧格式(24位)

复制代码
23:20 - 命令位
19:16 - 地址位
15:0  - 数据位

四、STM32 SPI 底层驱动

1、SPI 初始化(CubeMX 配置)

c 复制代码
/* SPI 配置参数 */
/*
Mode: Full-Duplex Master
Hardware NSS: Disable
Data Size: 8 bits
Prescaler: 8~32 (≥10MHz)
CPOL: Low
CPHA: 1 Edge
First Bit: MSB
*/

2、SPI 读写函数

c 复制代码
#include "spi.h"

static uint8_t SPI_TransferByte(SPI_HandleTypeDef *hspi, uint8_t data)
{
    uint8_t rxdata;
    HAL_SPI_TransmitReceive(hspi, &data, &rxdata, 1, 100);
    return rxdata;
}

static void SPI_Write24Bits(SPI_HandleTypeDef *hspi, uint32_t data)
{
    SPI_TransferByte(hspi, (data >> 16) & 0xFF);
    SPI_TransferByte(hspi, (data >> 8)  & 0xFF);
    SPI_TransferByte(hspi, data & 0xFF);
}

五、DAC8734 驱动核心代码

dac8734.h

c 复制代码
#ifndef __DAC8734_H
#define __DAC8734_H

#include "stm32f4xx_hal.h"

/* 输出范围 */
typedef enum {
    DAC_RANGE_0_5V   = 0x00,
    DAC_RANGE_0_10V  = 0x01,
    DAC_RANGE_5V     = 0x02,
    DAC_RANGE_10V    = 0x03,
    DAC_RANGE_5V_NEG = 0x04,
    DAC_RANGE_10V_NEG= 0x05
} DAC_Range_t;

/* 通道定义 */
typedef enum {
    DAC_CH_A = 0,
    DAC_CH_B = 1,
    DAC_CH_C = 2,
    DAC_CH_D = 3,
    DAC_CH_ALL = 4
} DAC_Channel_t;

/* 设备句柄 */
typedef struct {
    SPI_HandleTypeDef *hspi;
    GPIO_TypeDef *cs_port;
    uint16_t cs_pin;
    GPIO_TypeDef *ldac_port;
    uint16_t ldac_pin;
    GPIO_TypeDef *rst_port;
    uint16_t rst_pin;
} DAC8734_Handle_t;

/* API */
HAL_StatusTypeDef DAC8734_Init(DAC8734_Handle_t *hdac);
HAL_StatusTypeDef DAC8734_SetVoltage(DAC8734_Handle_t *hdac,
                                     DAC_Channel_t ch,
                                     float voltage);
HAL_StatusTypeDef DAC8734_SetRange(DAC8734_Handle_t *hdac,
                                   DAC_Channel_t ch,
                                   DAC_Range_t range);
HAL_StatusTypeDef DAC8734_SoftwareUpdate(DAC8734_Handle_t *hdac);

#endif

dac8734.c

c 复制代码
#include "dac8734.h"
#include <math.h>

#define DAC8734_CS_LOW(h)   HAL_GPIO_WritePin((h)->cs_port, (h)->cs_pin, GPIO_PIN_RESET)
#define DAC8734_CS_HIGH(h)  HAL_GPIO_WritePin((h)->cs_port, (h)->cs_pin, GPIO_PIN_SET)
#define DAC8734_LDAC_LOW(h) HAL_GPIO_WritePin((h)->ldac_port,(h)->ldac_pin,GPIO_PIN_RESET)
#define DAC8734_LDAC_HIGH(h)HAL_GPIO_WritePin((h)->ldac_port,(h)->ldac_pin,GPIO_PIN_SET)

/* 内部写函数 */
static void DAC8734_WriteReg(DAC8734_Handle_t *hdac, uint8_t addr, uint16_t data)
{
    uint32_t frame = ((uint32_t)addr << 16) | data;

    DAC8734_CS_LOW(hdac);
    SPI_Write24Bits(hdac->hspi, frame);
    DAC8734_CS_HIGH(hdac);
}

/* 初始化 */
HAL_StatusTypeDef DAC8734_Init(DAC8734_Handle_t *hdac)
{
    /* 复位 */
    if (hdac->rst_port) {
        HAL_GPIO_WritePin(hdac->rst_port, hdac->rst_pin, GPIO_PIN_RESET);
        HAL_Delay(10);
        HAL_GPIO_WritePin(hdac->rst_port, hdac->rst_pin, GPIO_PIN_SET);
    }

    /* 配置默认输出范围 */
    for (int i = 0; i < 4; i++) {
        DAC8734_SetRange(hdac, i, DAC_RANGE_0_10V);
    }

    return HAL_OK;
}

/* 设置电压 */
HAL_StatusTypeDef DAC8734_SetVoltage(DAC8734_Handle_t *hdac,
                                      DAC_Channel_t ch,
                                      float voltage)
{
    uint16_t code;

    /* ±10V 范围示例 */
    if (voltage > 10.0f) voltage = 10.0f;
    if (voltage < 0.0f)  voltage = 0.0f;

    code = (uint16_t)((voltage / 10.0f) * 65535.0f);

    DAC8734_WriteReg(hdac, ch, code);

    /* 软件触发更新 */
    DAC8734_SoftwareUpdate(hdac);

    return HAL_OK;
}

/* 设置输出范围 */
HAL_StatusTypeDef DAC8734_SetRange(DAC8734_Handle_t *hdac,
                                   DAC_Channel_t ch,
                                   DAC_Range_t range)
{
    uint16_t gain_code = 0;

    switch (range) {
        case DAC_RANGE_0_5V:   gain_code = 0x0000; break;
        case DAC_RANGE_0_10V:  gain_code = 0x0001; break;
        case DAC_RANGE_5V:     gain_code = 0x0002; break;
        case DAC_RANGE_10V:    gain_code = 0x0003; break;
        default: return HAL_ERROR;
    }

    DAC8734_WriteReg(hdac, DAC_GAIN_REG + ch, gain_code);
    return HAL_OK;
}

/* 软件 LDAC 更新 */
HAL_StatusTypeDef DAC8734_SoftwareUpdate(DAC8734_Handle_t *hdac)
{
    DAC8734_LDAC_LOW(hdac);
    __NOP(); __NOP(); __NOP();
    DAC8734_LDAC_HIGH(hdac);
    return HAL_OK;
}

六、使用示例(数字电源场景)

c 复制代码
DAC8734_Handle_t dac8734 = {
    .hspi = &hspi1,
    .cs_port = GPIOA,
    .cs_pin = GPIO_PIN_4,
    .ldac_port = GPIOA,
    .ldac_pin = GPIO_PIN_5,
};

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_SPI1_Init();

    DAC8734_Init(&dac8734);

    /* 设置 4 路基准电压 */
    DAC8734_SetVoltage(&dac8734, DAC_CH_A, 3.3f);  // 参考电压
    DAC8734_SetVoltage(&dac8734, DAC_CH_B, 5.0f);  // 偏置
    DAC8734_SetVoltage(&dac8734, DAC_CH_C, 1.8f);  // 软启动斜率
    DAC8734_SetVoltage(&dac8734, DAC_CH_D, 0.5f);  // 保护阈值

    while (1) {
        /* 动态调整 */
        DAC8734_SetVoltage(&dac8734, DAC_CH_A, 3.0f);
        HAL_Delay(1000);
    }
}

参考代码 STM32 DAC8734 4路16位DA驱动程序 www.youwenfan.com/contentcsv/72602.html

七、校准功能

c 复制代码
/* 两点校准 */
void DAC8734_Calibrate(DAC8734_Handle_t *hdac,
                        DAC_Channel_t ch,
                        float real_v1, float set_v1,
                        float real_v2, float set_v2)
{
    float gain = (real_v2 - real_v1) / (set_v2 - set_v1);
    float offset = real_v1 - gain * set_v1;

    /* 写入 OFFSET / GAIN 寄存器 */
}

八、常见问题排查

现象 原因 解决
无输出 CS 时序错误 检查 SYNC 低电平宽度
输出不准 参考电压漂移 使用外部 2.5V 基准
噪声大 SPI 串扰 缩短走线,加 RC
多路耦合 LDAC 未同步 统一 LDAC 触发
相关推荐
sramdram1 分钟前
基于32位微控制器的FOC汽车水泵方案
单片机·嵌入式硬件·汽车·微控制器·32位微控制器
十月的皮皮3 小时前
stm20260720-从新手 C 到量产 STM32 工程:程序设计推导指南
c语言·开发语言·stm32·stm32cubemx·hal库
开发笔记-阿牛3 小时前
解析一款有意思的产品||CK6159A语音芯片设计的儿童专注力训练机-舒尔特玩具
stm32·单片机·嵌入式硬件·音频
残影飞雪4 小时前
ESP32-C5下载烧录固件失败报错的原因
单片机·嵌入式硬件
搞全栈小苏5 小时前
SIMetrix_simplis8.4安装教程——附安装包
stm32·单片机·嵌入式硬件·电力电子
qq_573967826 小时前
STM32控制器
stm32·单片机·嵌入式硬件
某林2127 小时前
履带小车底盘stm32F103RCT6开发
人工智能·stm32·单片机·嵌入式硬件·架构·人机交互·ros2
sramdram8 小时前
低功耗MCU微控制器在动态血糖仪(CGM)中的应用方案
单片机·嵌入式硬件·mcu·mcu微控制器
Dlrb12118 小时前
ARM--IMX6ULL的SDK学习,BSP开发工程管理,以及链接脚本与Makefile的编写
单片机·嵌入式硬件·arm·sdk·链接脚本·i.mx6ull·cortex-a7
李永奉8 小时前
杰理可视化SDK开发-配置ANC主动降噪功能模块教程
单片机·嵌入式硬件·物联网