DAC数模转换

2023-11-01 12:51
文章标签 dac 数模转换

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

文章目录

    • 数模转换原理
      • DAC模块主要特点
      • DAC引脚
      • DAC转换
      • DAC数据格式
      • DAC触发选择
      • DAC输出电压
      • DAC通道使能
      • DAC输出缓冲器使能
      • DAC通道1 相关寄存器
        • DAC控制寄存器 DAC_CR
        • DAC 通道1的12位右对齐数据保持寄存器DAC_DHR12R1
        • DAC 通道1的12位左对齐数据保存寄存器DAC_DHR12L1
        • DAC通道1的8位右对齐数据保存寄存器DAC_DHR8R1
      • 硬件连接
      • DAC配置步骤
      • 相关代码

数模转换原理

DAC模块(数字/模拟转换模块)是12位数字输入,电压输出型。可以配置8位 12位 模式,也可与DMA控制器配合使用。12位模式下,可以设置成左对齐或右对齐。DAC模块有2个输出通道,各有单独的转换器。双DAC模式下2个通道可以独立的进行转换,也可以同时进行转换并同步的更新2个通道的输出。
在这里插入图片描述

DAC模块主要特点

① 2个DAC转换器:每个转换器对应1个输出通道
② 8位或者12位单调输出
③ 12位模式下数据左对齐或者右对齐
④ 同步更新功能
⑤ 噪声波形生成
⑥ 三角波形生成
⑦ 双DAC通道同时或者分别转换
⑧ 每个通道都有DMA功能

DAC引脚

在这里插入图片描述
避免电流消耗,应先将PA4或PA5引脚配置为模拟模式。
DAC_OUT1对应PA4
DAC_OUT2对应PA5

DAC转换

DAC_DORx寄存器无法直接写入,所有数据必须加载DAC_DHRx寄存器(写入DAC_DHR8Rx、DAC_DHR12Lx、DAC_DHR12Rx、DAC_DHR8RD、DAC_DHR12LD或DAC_DHR12LD)才能传输到DAC通道x。
未选择硬件触发(DAC_CR寄存器中的TENx位复位),则经过一个APB1时钟周期后,DAC_DHRx寄存器中存储的数据将自动转移到DAC_DORx寄存器。选择了硬件触发且有触发条件,在三个APB1时钟周期后进行转移。
当DAC_DORx加载了DAC_DHRx内容时,模拟输出电压将在一段时间t(SETTLING)后可用,具体时间取决于电源电压和模拟输出负载。
在这里插入图片描述

DAC数据格式

有三种情况
① 8位数据右对齐:用户须将数据写入寄存器DAC_DHR8Rx【7:0】位,最终转存到DHRx【11:4】位
② 12位数据左对齐:用户需将数据写入寄存器DAC_DHRLx【15:4】位,最终转存到DHRx【11:0】位
③ 12位数据右对齐:用户须将数据写入寄存器DAC_DHR12Rx【11:0】位,最终转存到DHRx【11:0】位。
在这里插入图片描述

DAC触发选择

TENx控制位置1 可通过外部事件触发转换。通过TSELx【2:0】控制位决定8个可能事件中的哪一个来触发转换。
在这里插入图片描述
DAC接口检测到上升沿时,DAC_DHRx寄存器中存储的最后一个数据即会转换到DAC_DORx寄存器中。触发后三个APB1周期DAC_DORx寄存器会得到更新。
SWTRIG位置为 1 转换开始 DAC_DHRx寄存器内容加载到DAC_DORx 寄存器中后,SWTRIG即由硬件复位。

DAC输出电压

线性转换后,数字输入会转换为0-V(REF+)之间的输出电压
模拟输出电压公式:
DAC(output) = V(REF) * DOR/4095

DAC通道使能

将DAC_CR寄存器中的相应ENx 位置1,即可接通对应DAC通道。经过一段启动时间t(WAKEUP)后,DAC通道被真正使能)
ENx位只能使能模拟DAC Channelx宏单元,即使ENx位复位,DAC Channelx数字接口仍处于使能状态

DAC输出缓冲器使能

DAC继承了两个输出缓冲器,可降低输出阻抗并不增加运算放大器的情况下直接驱动外部负载。

DAC通道1 相关寄存器

DAC控制寄存器 DAC_CR

在这里插入图片描述

DAC 通道1的12位右对齐数据保持寄存器DAC_DHR12R1

在这里插入图片描述

DAC 通道1的12位左对齐数据保存寄存器DAC_DHR12L1

在这里插入图片描述

DAC通道1的8位右对齐数据保存寄存器DAC_DHR8R1

在这里插入图片描述

硬件连接

在这里插入图片描述

DAC配置步骤

① 开启PA口时钟,设置PA4为模拟输入
DAC通道1 接在PA4上,则先使能GPIOA,然后设置PA4为模拟输入

RCC_AHB1PeriphClockCmd(RCC_AHBIPeriph_GPIOA, ENABLE)://
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_IniStructure.GPIO_Mode = GPIO_Mode_AN://模拟输入
GPIO_InitStructure.GPlO_PuPd = GPIO_PuPd_DOWN://下拉
GPIO_Init(GPIOA, &GPIO_InitStructure)//初始化

② 使能DAC1时钟
DAC模块时钟由APB1提供,则先使能DAC1时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC,ENABLE);//使能DAC时钟

③ 初始化DAC,设置DAC的工作模式
DAC初始化 :DAC_Init
其他全部通过DAC_CR设置实现

void DAC_Init(uint32_t DAC_Channel,DAC_InitTypcDef DAC_InitStruct);typedef struct
{
uint32_t DAC_Trigger;
uint32_t DAC_WaveGeneration;
uint32_t DAC_LFSRUnmask_TriangleAmplitude;
uint32_t DAC_OutputBuffer;
}
DAC InitTypeDef:

④ 使能DAC转换通道

DAC_Cmd(DAC_Channel_1,ENABLE);//使能DAC通道1

⑤ 设置DAC的输出值
使用12位右对齐数据格式 设置DHR12R1

DAC_SetChannel1Data(DAC_Align_12b_R,0);

相关代码

int main(void)
{ u16 adcx;float temp;u8 t=0;	 u16 dacval=0;u8 key;	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);delay_init(168);    uart_init(115200);		LED_Init();				LCD_Init();					Adc_Init(); 		KEY_Init(); 			Dac1_Init();		 POINT_COLOR=RED; LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");	LCD_ShowString(30,70,200,16,16,"DAC TEST");	LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");LCD_ShowString(30,110,200,16,16,"2021/9/4");	 LCD_ShowString(30,130,200,16,16,"WK_UP:+  KEY1:-");	 POINT_COLOR=BLUE;//ÉèÖÃ×ÖÌåΪÀ¶É«      	 LCD_ShowString(30,150,200,16,16,"DAC VAL:");	      LCD_ShowString(30,170,200,16,16,"DAC VOL:0.000V");	      LCD_ShowString(30,190,200,16,16,"ADC VOL:0.000V");DAC_SetChannel1Data(DAC_Align_12b_R,dacval);while(1){t++;key=KEY_Scan(0);			  if(key==WKUP_PRES){		 if(dacval<4000)dacval+=200;DAC_SetChannel1Data(DAC_Align_12b_R, dacval);}else if(key==2)	{if(dacval>200)dacval-=200;else dacval=0;DAC_SetChannel1Data(DAC_Align_12b_R, dacval);}	 if(t==10||key==KEY1_PRES||key==WKUP_PRES) 	{	  adcx=DAC_GetDataOutputValue(DAC_Channel_1);LCD_ShowxNum(94,150,adcx,4,16,0);     	   temp=(float)adcx*(3.3/4096);			   adcx=temp;LCD_ShowxNum(94,170,temp,1,16,0);     	temp-=adcx;temp*=1000;LCD_ShowxNum(110,170,temp,3,16,0X80); 	   adcx=Get_Adc_Average(ADC_Channel_5,10);		 temp=(float)adcx*(3.3/4096);			   adcx=temp;LCD_ShowxNum(94,190,temp,1,16,0);     	temp-=adcx;temp*=1000;LCD_ShowxNum(110,190,temp,3,16,0X80); 	LED0=!LED0;	   t=0;}	    delay_ms(10);	 }	
}

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



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

相关文章

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校验模块 三、结尾