首页 > 其他分享 >【STM32开发之寄存器版】(十)-数模转换DAC

【STM32开发之寄存器版】(十)-数模转换DAC

时间:2024-10-13 15:19:45浏览次数:9  
标签:输出 12 DAC STM32 电压 寄存器 数模转换 通道

一、前言

本次DEMO目标:

本文将使用STM32F103ZET6的DAC1来输出电压,通过ADC1的通道1采集DAC输出电压信息(需要将开发板的ADC PA1和DAC PA4短接起来),通过串口打印在上位机XCOM上。

二、数模转换原理与基本概念

2.1 数模转换的基本概念

数模转换器(DAC)将数字信号转换为模拟信号,广泛用于音频、视频和通信等领域。它的工作原理通常涉及将数字输入值转换成对应的电压或电流输出。

2.2 数模转换的分类

在常见的D/A转换器中,有权电阻网络D/A转换器,倒T形电阻网络D/A转换器、权电流型D/A转换器、权电容网络D/A转换器以及开关树型D/A转换器等几种类型。在D/A转换器数字量的输出方式上也有并行输出和串行输入两种类型。

2.3 数模转换的特性参数

数模转换的特性参数主要分为转换精度转换时间。其中,描述转换精度的特征量为分辨率和转换误差,描述转换时间的特征量是建立时间。

分辨率

DAC的分辨率以位数表示,决定了它能表示的离散电压值的数量。分辨率越高,DAC能够生成的输出电压级别越多。例如,12位DAC可以输出2^12=4,096个不同的电压级别。高分辨率DAC在细节再现方面表现更佳,适用于音频处理和高精度仪器。

转换误差

转换误差是DAC实际输出电压与理论电压之间的偏差。主要包括:

  • 增益误差:输出电压与理想值的比例偏差。
  • 偏移误差:输出电压的基准偏差。
  • 线性度误差:通过积分非线性(INL)和微分非线性(DNL)衡量,描述输出电压与输入数字值之间的线性关系的准确性。

建立时间

建立时间是DAC从输入数字值变化到输出电压稳定所需的时间。它直接影响系统的响应速度和信号处理能力。建立时间越短,DAC能更快地响应输入变化,适用于需要高速转换的应用场景。

三、STM32的DAC

3.1 STM32的DAC简介

STM32的数字/模拟转换模块(DAC)是12位数字输入,电压输出的数字/模拟转换器。DAC可以配置为8位 或12位模式,也可以与DMA控制器配合使用。DAC工作在12位模式时,数据可以设置成左对齐或右对齐。DAC模块有2个输出通道,每个通道都有单独的转换器。在双DAC模式下,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。DAC可以通过引脚输入参考电压VREF+以获得更精确的转换结果。

3.2 STM32的DAC特点

STM32的DAC特点如下:

  • 2个DAC转换器,每个转换器对应1个输出通道
  • 8位或者12位单调输出
  • 12位模式下数据左对齐或者右对齐
  • 同步更新功能
  • 噪声波形生成
  • 三角波形生成
  • 双DAC通道同时或者分别转换
  • 每个通道都有DMA功能
  • 外部触发转换
  • 输入参考电压VREF+

3.3 STM32的DAC原理解析

3.3.1 DAC通道框图

单个DAC通道的框图如下所示:

图中 VDDA 和 VSSA 为 DAC 模块模拟部分的供电,而 Vref+则是 DAC 模块的参考电压。DAC_OUTx 就是 DAC 的输出通道了(对应 PA4 或者 PA5 引脚)。DAC 输出是受 DORx 寄存器直接控制的,但是我们不能直接往DORx 寄存器写入数据,而是通过 DHRx 间接的传给 DORx 寄存器,实现对 DAC 输出的控制。

3.3.2 DAC数据对齐

STM32 的 DAC 支持 8/12 位模式,8 位模式的时候是固定的右对齐的,而 12 位模式又可以设置左对齐/右对齐。单 DAC 通道 x,总共有 3 种情况:

  1. 8 位数据右对齐:用户将数据写入 DAC_DHR8Rx[7:0]位(实际是存入 DHRx[11:4] 位)。
  2. 12 位数据左对齐:用户将数据写入 DAC_DHR12Lx[15:4]位(实际是存入 DHRx[11:0] 位)。
  3. 12 位数据右对齐:用户将数据写入DAC_DHR12Rx[11:0]位(实际是存入DHRx[11:0] 位)。

本文使用的就是单 DAC 通道 1,采用 12 位右对齐格式,所以采用第3种情况。

3.3.3 DAC模块转换时间

若未选中硬件触发(寄存器 DAC_CR1 的 TENx 位置’0’),存入寄存器 DAC_DHRx的数据会在一个 APB1 时钟周期后自动传至寄存器 DAC_DORx。如果选中硬件触发(寄存器DAC_CR1 的 TENx 位置’1’),数据传输在触发发生以后 3 个 APB1 时钟周期后完成。 一旦数据从 DAC_DHRx 寄存器装入 DAC_DORx 寄存器,在经过时间之后,输出即有效,这段时间的长短依电源电压和模拟输出负载的不同会有所变化。我们可以从STM32F103ZET6 的数据手册查到的典型值为 3us,最大是 4us。所以 DAC 的转换速度最快是 250K 左右。

本章我们将不使用硬件触发(TEN=0),其转换的时间框图如图所示:

3.3.4 DAC输出电压

当 DAC 的参考电压为 Vref+的时候,DAC 的输出电压是线性的从 0~Vref+,12 位模式下 DAC 输出电压与 Vref+以及 DORx 的计算公式如下:

DACx 输出电压=Vref*(DORx/4095)

四、时钟树解析

DAC1是APB1下的外设,APB1预分频后最大给予PCLK1的时钟频率是36MHz。故系统时钟为72MHz,AHB不分频,APB1二分频后给予DAC 36MHz的时钟频率,具体时钟树分析如下所示:

五、寄存器介绍

对DAC1的控制主要涉及以下寄存器:

寄存器作用
DAC_CRDAC控制寄存器
DAC_DHR12R1DAC通道1的12位右对齐数据保持寄存器

下面将对这两个寄存器进行分别介绍。

5.1 DAC_CR控制寄存器

《STM32中文参考手册》对DAC_CR寄存器的描述如下:

该寄存器功能较多,我们需关注以下位:[12]DMAEN1、[11:8]MAMP1、[7:6]WAVE1、 [5:3]TSEL1、[2]TEN1、[1]BOFF1、[0]EN1。下面对其进行一一介绍:

[12]DMAEN1

DMA通道1 DMA使能。本位设置为0,关闭DAC1 DMA模式。

[11:8]MAMP1

DAC通道1屏蔽/幅值选择器。设置为0000

[7:6]WAVE1

DAC通道1噪声/三角波发生使能,本位设置为00,关闭波形发生。

[5:3]TSEL1

DAC通道1的外部触发事件,本位设置为000,TIM6 TRGO事件,但是需要TEN=1才行。

[2]TEN1

使能/关闭DAC通道1的触发,本位设置位0,关闭DAC通道1的触发。

[1]BOFF1

关闭DAC通道1输出缓存,本位设置为1,关闭DAC通道1输出缓存。

[0]EN1

DAC通道1使能,本位设置为1,使能DAC通道1.

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

《STM32中文参考手册》对DAC_DHR12R1寄存器的描述如下:

该位由软件写入,表示DAC通道1的12位数据。 

六、程序设计

本次demo的程序设计主要分为DAC1初始化、设置DAC输出电压以及轮询主函数。 

6.1 DAC1初始化

该函数位于HARDWARE/dac.c/Dac1_Init();主要功能是初始化PA和DAC时钟,设置PA4管脚复用、使能并设置DAC1等。具体代码如下所示:

//DAC通道1输出初始化
void Dac1_Init(void)
{
	RCC->APB2ENR|=1<<2;    	//使能PORTA时钟	  	
	RCC->APB1ENR|=1<<29;   	//使能DAC时钟	  	
	   	 
	GPIOA->CRL&=0XFFF0FFFF; 
	GPIOA->CRL|=0X00000000;	//PA4 模拟输入    

	DAC->CR|=1<<0;			//使能DAC1
	DAC->CR|=1<<1;			//DAC1输出缓存不使能 BOFF1=1
	DAC->CR|=0<<2;			//不使用触发功能 TEN1=0
	DAC->CR|=0<<3;			//DAC TIM6 TRGO,不过要TEN1=1才行
	DAC->CR|=0<<6;			//不使用波形发生
	DAC->CR|=0<<8;			//屏蔽、幅值设置
	DAC->CR|=0<<12;			//DAC1 DMA不使能    

	DAC->DHR12R1=0;
}

6.2 设置DAC输出电压

该函数位于HARDWARE/dac.c/Dac1_Set_Vol();主要功能是通过寄存器DAC->DHR12R1设置DAC输出电压,具体代码如下所示:

//设置通道1输出电压
//vol:0~3300,代表0~3.3V
void Dac1_Set_Vol(u16 vol)
{
	float temp=vol;
	temp/=1000;
	temp=temp*4096/3.3;		//计算DAC输出寄存器值
	DAC->DHR12R1=temp;
}

6.3 轮询主函数 

该函数位于USER/test.c;主要功能是使用ADC将DAC输出的电压值采集回来,并通过串口打印在上位机XCOM上。具体代码如下所示:

#include "sys.h"
#include "delay.h"
#include "usart.h" 
#include "led.h" 		 	 
#include "lcd.h" 
#include "key.h"
#include "adc.h"
#include "dac.h" 
#include "usmart.h" 	 

int main(void)
{		 	
	u16 adcx;
	float temp;
	u16 dacval=2048;
    Stm32_Clock_Init(9);	//系统时钟设置
	uart_init(72,115200);	//串口初始化为115200
	delay_init(72);	   	 	//延时初始化 
	Adc_Init(); 			//adc初始化	
	Dac1_Init();		 	//DAC通道1初始化	   	
	//显示提示信息											          	      
	while(1)
	{
		
		DAC->DHR12R1=dacval;	            //设置DAC输出;
		adcx=Get_Adc_Average(ADC_CH1,10);	//得到ADC转换值;
		temp=(float)adcx*(3.3/4096);			//得到DAC电压值;
		printf("ADC采集到的DAC输出电压为:%4.3fV\r\n",temp);   //串口打印输出结果。

	}
}

七、上机实验

将代码下载至STM32F103ZET6,当DAC设置为2048时,ADC采集回的电压为1.65V,与预期相同。具体情况如下图所示:

至此完成本次DEMO! 

标签:输出,12,DAC,STM32,电压,寄存器,数模转换,通道
From: https://blog.csdn.net/Jlinkneeder/article/details/142863781

相关文章

  • #STM32#定时器扫描按键消抖#按键控制LED灯亮灭#标准库
    一.机械按键抖动在按下按键后金属弹片会来回震动影响I/O口的电平变化,影响检测和判断操作。通常抖动时间为:5ms~10ms影响:在不加消除抖动的情况下按下按键LED灯可能会出现失灵的情况,因为这时的判断按键情况通常是判断电平的高低,由于电平不停的发转,所以呀很难判断此时是否是被......
  • STM32与ESP32串口数据发送以及网页端数据实时显示和远程遥控
    目标:实现网页端速度实时显示以及可以通过点击页面按键达到对小车的位移方位控制。一、ESP32代码首先,需要让ESP32连接到WiFi,这样才能为后续的操作做准备。ssid="xxxxxx"password="xxxxxx"#WIFI连接defwifi_connect():wlan=network.WLAN(network.STA_IF)#STA模式......
  • 【STM32开发之寄存器版】(九)-模数转换ADC
    一、前言本次DEMO目标:本文将使用STM32F103ZET6的ADC1通道1来采样外部电压值,并使用串口在上位机XCOM上打印出电压值。二、模数转换原理与基本概念2.1ADC基本概念模数转换器(ADC,Analog-to-DigitalConverter)是一种将模拟信号转换为数字信号的电子器件。它的主要功能是将......
  • 【STM32开发之寄存器版】(八)-定时器的编码器接口模式
    一、前言1.1编码器接口原理编码器模式主要用于检测旋转编码器的转动方向和转动速度。旋转编码器一般输出两路相位相差90度的脉冲信号(称为A相和B相),通过这两路信号,定时器可以判断编码器的旋转方向,并计数转动的脉冲数。1.2本次DEMO目标本次DEMO将使用STM32F103ZET6的PA6(......
  • 【STM32开发之寄存器版】(七)-PWM脉冲宽度调制
    一、前言PWM简介PWM(脉宽调制)是一种通过调节信号的脉冲宽度来控制功率输出的技术。其基本原理是保持固定频率的信号,将其高电平和低电平的持续时间调整,达到控制平均功率的目的。应用方面,PWM广泛用于电机控制、LED调光、音频放大、以及电源管理等领域,因为它能有效提高能效并减......
  • 利用STM32VET6控制TEF6686(V102)收音机芯片
    目录TEF6686芯片概述TEF6686芯片的主要特点包括:TEF6686芯片具备的主要功能TEF6686芯片的应用范围I2C协议驱动代码IIC.cIIC.hTEF6686.c(设备初始化)TEF6686.hTEF6686_command.cTEF6686_command.hTEF6686芯片概述TEF6686是一款由NXPSemiconductors生产的高性能单芯片收音机IC,它集......
  • 基于STM32设计自动输液监测系统(241)
    文章目录一、前言1.1项目介绍【1】项目开发背景【2】设计实现的功能【3】项目硬件模块组成1.2设计思路1.3项目开发背景【1】选题的意义【2】参考文献【3】项目背景【4】摘要【5】设计的主要内容和功能1.4开发工具的选择1.5系统功能总结1.6......
  • 基于STM32的智慧超市管理设计与实现(239)
    文章目录一、前言1.1项目背景1.2设计思路1.3功能详细总结【1】环境监测与智能控制【2】商品管理与顾客服务【3】实时数据展示1.4环境监测页面设计1.5超市收银上位机1.6系统框架图1.7硬件原理图1.8硬件实物二、硬件选型2.1STM32开发......
  • STM32中实现下降沿捕获(HAL库)
    配置步骤:1、配置时基工作参数HAL_TIM_IC_Init();主要配置其中的instanceinitautorelaodpreloadcountermodeperiodprescaler2、msp初始化HAL_TIM_IC_MspInit(TIM_HandleTypeDef*htim) __HAL_RCC_TIM2_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE();  HAL_NV......
  • STM32f103c8t6中PWM的配置
    1、PWM简介    PWM波形(PulseWidthModulation,脉冲宽度调制波形)是一种占空比可变的脉冲波形。这种调制方式通过改变脉冲的宽度来控制电路中的信号强度和频率。具体来说,PWM波形中的高电平持续时间和低电平持续时间可以根据需要进行调整,从而实现对模拟信号电平的数字......