DAC --- 数模转换器

2024-03-14 19:40
文章标签 dac 数模转换

本文主要是介绍DAC --- 数模转换器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

<一>.DAC简介

<1>.DAC简介

DAC,全称:Digital-to-Analog Converter,指数字/模拟转换器。

ADC和DAC是模拟电路与数字电路之间的桥梁。

<2>.DAC的特性参数

1.分辨率

表示模拟电压的最小增量,常用二进制位数表示,比如:8、12位等。

2.建立时间

表示将一个数字量转换为稳定模拟信号所需的时间。

3.精度

转换器实际特性曲线与理想特性曲线之间的最大误差,误差源:比例系统误差、失调误差、非线性误差。

原因:元件参数误差、基准电压不稳定。运算放大器零漂等。

<3>.STM32各系列DAC的主要特性

<二>.DAC工作原理

1.DAC框图简介(F1/F4/F7)

实际操作DHRyyy:自动、软件、外部事件

DORx:不能直接写入数据

2.参考电压/模拟部分电压

3.DAC数据格式

4.触发源

三种触发转换方式:自动触发、软件触发、外部事件触发;

DHRx数据加载到DORx后,模拟输出电压将经过时间V(SETTLING)-建立时间 后可用。

关闭触发时(TEN=0)的转换时序图

5.DMA请求

6.DAC输出电压

<三>.DAC输出实验

<1>.实验简要

1.功能描述

通过DAC1通道1(PA4)输出预设电压,然后由ADC1通道1(PA1)采集,最后显示ADC转换的数字量及换算后的电压值;

2.关闭通道1触发(即自动)

TEN1位置0;

3.关闭输出缓冲

BUFF1位置1;

4.使用12位右对齐模式

将数字量写入DAC_DHR12R1寄存器。

<2>.DAC寄存器介绍(F1)

输出缓存(BOFF1):可减少阻抗,使输出能力会强一些,但无法输出0

 

<3>.DAC输出实验配置步骤

  1. 初始化DAC:HAL_DAC_Init();
  2. DAC MSP初始化:HAL_DAC_MspInit() --- 配置NVIC、CLOCK、GPIO等;
  3. 配置DAC相应通道相关参数:HAL_DAC_ConfigChannel();
  4. 启动D/A转换:HAL_DAC_Start();
  5. 设置输出数字量:HAL_DAC_SetValue();
  6. 读取通道输出数字量(可选):HAL_DAC_GetValue()

 

函数

主要寄存器

主要功能
HAL_DAC_Init()配置DAC工作状态(HAL库内部使用)
HAL_DAC_MspInit()存放NVIC、CLOCK、GPIO初始化代码
HAL_DAC_ConfigChannel()CR配置DAC相应通道的相关参数
HAL_DAC_Start()CR、SWTRIGR启动D/A转换
HAL_DAC_SetValue()DHR12Rx设置输出数字量
HAL_DAC_Getvalue()DORx读取通道输出数字量

关键结构体 (F1)

<4>.代码

dac.c

#include "./BSP/DAC/dac.h"
#include "./SYSTEM/delay/delay.h"DAC_HandleTypeDef g_dac_handle;         /* DAC句柄 *//*** @brief       DAC初始化函数*   @note      本函数支持DAC1_OUT1/2通道初始化*              DAC的输入时钟来自APB1, 时钟频率=36Mhz=27.8ns*              DAC在输出buffer关闭的时候, 输出建立时间: tSETTLING = 4us (F103数据手册有写)*              因此DAC输出的最高速度约为:250Khz, 以10个点为一个周期, 最大能输出25Khz左右的波形** @param       outx: 要初始化的通道. 1,通道1; 2,通道2* @retval      无*/
void dac_init(uint8_t outx)
{GPIO_InitTypeDef gpio_init_struct;DAC_ChannelConfTypeDef dac_ch_conf;__HAL_RCC_DAC_CLK_ENABLE();                                 /* 使能DAC1的时钟 */__HAL_RCC_GPIOA_CLK_ENABLE();                               /* 使能DAC OUT1/2的IO口时钟(都在PA口,PA4/PA5) */gpio_init_struct.Pin = (outx==1)? GPIO_PIN_4 : GPIO_PIN_5;  /* STM32单片机, 总是PA4=DAC1_OUT1, PA5=DAC1_OUT2 */gpio_init_struct.Mode = GPIO_MODE_ANALOG;HAL_GPIO_Init(GPIOA, &gpio_init_struct);g_dac_handle.Instance = DAC;HAL_DAC_Init(&g_dac_handle);                                /* 初始化DAC */dac_ch_conf.DAC_Trigger = DAC_TRIGGER_NONE;                 /* 不使用触发功能 */dac_ch_conf.DAC_OutputBuffer = DAC_OUTPUTBUFFER_DISABLE;    /* DAC1输出缓冲关闭 */switch(outx){case 1:HAL_DAC_ConfigChannel(&g_dac_handle, &dac_ch_conf, DAC_CHANNEL_1);  /* 配置DAC通道1 */HAL_DAC_Start(&g_dac_handle,DAC_CHANNEL_1);                         /* 开启DAC通道1 */break;case 2:HAL_DAC_ConfigChannel(&g_dac_handle, &dac_ch_conf, DAC_CHANNEL_2);  /* 配置DAC通道2 */HAL_DAC_Start(&g_dac_handle,DAC_CHANNEL_2);                         /* 开启DAC通道2 */break;default:break;}}/*** @brief       设置通道1/2输出电压* @param       outx: 1,通道1; 2,通道2* @param       vol : 0~3300,代表0~3.3V* @retval      无*/
void dac_set_voltage(uint8_t outx, uint16_t vol)
{double temp = vol;temp /= 1000;temp = temp * 4096 / 3.3;if (temp >= 4096)temp = 4095;   /* 如果值大于等于4096, 则取4095 */if (outx == 1)   /* 通道1 */{HAL_DAC_SetValue(&g_dac_handle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, temp); /* 12位右对齐数据格式设置DAC值 */}else            /* 通道2 */{HAL_DAC_SetValue(&g_dac_handle, DAC_CHANNEL_2, DAC_ALIGN_12B_R, temp); /* 12位右对齐数据格式设置DAC值 */}
}

dac.h

#ifndef __DAC_H
#define __DAC_H#include "./SYSTEM/sys/sys.h"void dac_init(uint8_t outx);                        /* DAC通道1初始化 */ 
void dac_set_voltage(uint8_t outx, uint16_t vol);   /* 设置通道1/2输出电压 */ #endif

 main.c

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./USMART/usmart.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/KEY/key.h"
#include "./BSP/DAC/dac.h"
#include "./BSP/ADC/adc3.h"extern DAC_HandleTypeDef g_dac_handle;int main(void)
{uint16_t adcx;float temp;uint8_t t = 0;uint16_t dacval = 0;uint8_t key;HAL_Init();                                 /* 初始化HAL库 */sys_stm32_clock_init(RCC_PLL_MUL9);         /* 设置时钟, 72Mhz */delay_init(72);                             /* 延时初始化 */usart_init(115200);                         /* 串口初始化为115200 */usmart_dev.init(72);                        /* 初始化USMART */led_init();                                 /* 初始化LED */lcd_init();                                 /* 初始化LCD */key_init();                                 /* 初始化按键 */adc3_init();                                /* 初始化ADC3 */dac_init(1);                                /* 初始化DAC1_OUT1通道 */lcd_show_string(30,  50, 200, 16, 16, "STM32F103", RED);lcd_show_string(30,  70, 200, 16, 16, "DAC TEST", RED);lcd_show_string(30,  90, 200, 16, 16, "ATOM@ALIENTEK", RED);lcd_show_string(30, 110, 200, 16, 16, "WK_UP:+  KEY1:-", RED);lcd_show_string(30, 130, 200, 16, 16, "DAC VAL:", BLUE);lcd_show_string(30, 150, 200, 16, 16, "DAC VOL:0.000V", BLUE);lcd_show_string(30, 170, 200, 16, 16, "ADC VOL:0.000V", BLUE);while (1){t++;key = key_scan(0);          /* 按键扫描 */if (key == WKUP_PRES){if (dacval < 4000)dacval += 200;HAL_DAC_SetValue(&g_dac_handle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, dacval);/* 输出增大200 */}else if (key == KEY1_PRES){if (dacval > 200)dacval -= 200;else dacval = 0;HAL_DAC_SetValue(&g_dac_handle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, dacval); /* 输出减少200 */}if (t == 10 || key == KEY1_PRES || key == WKUP_PRES)        /* WKUP/KEY1按下了,或者定时时间到了 */{adcx = HAL_DAC_GetValue(&g_dac_handle, DAC_CHANNEL_1);  /* 读取前面设置DAC1_OUT1的值 */lcd_show_xnum(94, 130, adcx, 4, 16, 0, BLUE);           /* 显示DAC寄存器值 */temp = (float)adcx * (3.3 / 4096);                      /* 得到DAC电压值 */adcx = temp;lcd_show_xnum(94, 150, temp, 1, 16, 0, BLUE);           /* 显示电压值整数部分 */temp -= adcx;temp *= 1000;lcd_show_xnum(110, 150, temp, 3, 16, 0X80, BLUE);       /* 显示电压值的小数部分 */adcx = adc3_get_result_average(ADC3_CHY, 20);           /* 得到ADC3通道1的转换结果 */temp = (float)adcx * (3.3 / 4096);                      /* 得到ADC电压值(adc是16bit的) */adcx = temp;lcd_show_xnum(94, 170, temp, 1, 16, 0, BLUE);           /* 显示电压值整数部分 */temp -= adcx;temp *= 1000;lcd_show_xnum(110, 170, temp, 3, 16, 0X80, BLUE);       /* 显示电压值的小数部分 */LED0_TOGGLE();  /* LED0闪烁 */t = 0;}delay_ms(10);}
}

<四>.DAC输出三角波实验

<五>.DAC输出正弦波实验

<六>.PWM DAC实验

这篇关于DAC --- 数模转换器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/809518

相关文章

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

学习硬件测试05:NTC(ADC)+正弦波(DAC)+DMA(ADC+DAC)(P73、P76、P78)

文章以下内容全部为硬件相关知识,鲜有软件知识,并且记的是自己需要的部分,大家可能看不明白。 一、NTC(ADC) 1.1实验现象 本实验用 NTC 采集温度,数码管实时显示温度数据(整数),左下角 USB 小串口每隔 1S 打印温度信息。 1.2硬件电路 NTC 电阻是一个模拟温度传感器,随着温度的升高,电阻值逐渐减小。电路简单介绍如下: 电源滤波电容在 25℃ 室温下 NTC 电

STM32G474之DAC

STM32G474分别使用CORDIC硬件和“math.h”的正弦值,从DAC1和DAC2输出。 1、DAC特点  PA4的附加功能为DAC1_OUT1,无需映射,直接将它配置为模拟功能,就可以使用了。 PA6的附加功能为DAC2_OUT1,无需映射,直接将它配置为模拟功能,就可以使用了。 2、测试程序 DAC_HandleTypeDef      DAC_1_Handler;   //DA

DAC: High-Fidelity Audio Compression with Improved RVQGAN

Rithesh KumarDescript, Inc.2023NIPS code 文章目录 abstratmethod abstrat 44.1k音频编码为8k bps,接近90x压缩比;可以处理speech, musiccodebook collapse: 部分码本没有利用到。----quantizer dropout :允许单个模型支持可变比特率,但实际上会损害全带宽音频的

《嵌入式-STM32开发指南》第二部分 基础篇 - 第8章 模拟输入输出-DAC

2.1 DAC工作原理 2.1.1 DAC介绍 数字/模拟转换模块(DAC)是12位数字输入,电压输出的数字/模拟转换器。DAC可以配置为8位或12位模式,也可以与DMA控制器配合使用。DAC工作在12位模式时,数据可以设置成左对齐或右对齐。DAC模块有2个输出通道,每个通道都有单独的转换器。在双DAC模式下,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。DAC可以

6-1 STM32F405--DAC输出(软件触发)

功能描述:配置STM32F405RGT6的DAC,在PA5引脚每隔2秒分别输出1V、2V、3V的电压。 main.c文件内容如下 #include "stm32f4xx.h" // Device header#include "Delay.h"#include "MyDAC.h"int main(void){MyDAC_Init(); //初始化DACwh

电压模式R-2R DAC的工作原理和特性

本文将探讨电压模式R-2R DAC结构。 在本文中,我们将探索什么是R-2R DAC以及如何实现它们。 首先,我们将简要回顾一下开尔文分压器DAC。这种结构很简单,但它们需要大量的电阻和开关来实现高分辨率DAC。这个问题的一个解决方案是称为R-2R DAC的DAC结构。这些结构巧妙地利用梯形网络来实现电阻较少的DAC。 什么是数字转换器? 数模转换器(DAC)接收以数字代码表示的数据,并产

STM32-17-DAC

STM32-01-认识单片机 STM32-02-基础知识 STM32-03-HAL库 STM32-04-时钟树 STM32-05-SYSTEM文件夹 STM32-06-GPIO STM32-07-外部中断 STM32-08-串口 STM32-09-IWDG和WWDG STM32-10-定时器 STM32-11-电容触摸按键 STM32-12-OLED模块 STM32-13-MPU STM32-14

STM32快速入门(ADC数模转换)

STM32快速入门(ADC数模转换) 前言 ADC数模转换存在的意义就是将一些温度传感器、各自数据传感器产生的模拟信号转换成方便识别和计算的数字信号。 导航 图24 通用定时器框图: 图片截取自STM32 F1XX中文参考手册。还是以框图为中心,来叙述我对ADC的理解。 ACD实现细节 核心原理 所谓ADC转换目的是为了将连续变化的模拟量转变成数字,方便程序的计算。这里的模拟量

基于FPGA的AD5753(DAC数模转换器)的控制 II(SPI驱动)

基于FPGA的AD5753(DAC数模转换器)的控制 II(已上板验证) 语言 :Verilg HDL EDA工具:Vivado 基于FPGA的AD5753(DAC数模转换器)的控制 II(已上板验证)一、引言二、基于FPGA的AD5753控制驱动实现1. 顶层模块2. 数据控制模块(AD5753_DATA_Ctrl模块)3、gen_crc8校验模块 三、结尾