DAC工作原理与配置

参考资料
STM32FX开发板
《STM32FX开发指南-HAL库版本》-第X章 DAC实验
STM32FXxx官方资料:
《STM32FX中文参考手册》-第N章 数字模拟转换DAC

笔记基于正点原子官方视频
视频连接https://www.bilibili.com/video/BV1Wx411d7wT?p=71&spm_id_from=333.1007.top_right_bar_window_history.content.click
如有侵权,联系删除

一、 DAC工作原理

1.DAC简介

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

2.STM32的DAC模块主要特点

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

3.DAC模块方图

VDDA和VSSA为DAC模块模拟部分的供电。
Vref+则是DAC模块的参考电压。
DAC_OUTx就是DAC的输出通道了(对应PA4或者PA5引脚)。

4.DAC转换原理

5.DAC数据格式

6.DAC触发选择

7.DAC其他

二、DAC相关寄存器

1.DAC相关寄存器

里面内容参见《STM32FX中文参考手册》

2.DAC通道1相关寄存器

  • DAC控制寄存器 DAC_CR

  • DAC软件触发寄存器DAC_SWTRIGR

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

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

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

  • DAC通道1数据输出寄存器DAC_DOR1

3.DAC控制寄存器DAC_CR

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

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

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

7.DAC通道1数据输出寄存器DAC_DOR1

三、DAC硬件连接

四、DAC-HAL库函数配置

1.DAC相关HAL库函数

  • HAL_StatusTypeDef HAL_DAC_Init(DAC_HandleTypeDef* hdac);

  • void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac);

  • HAL_StatusTypeDef HAL_DAC_Start();

  • HAL_StatusTypeDef HAL_DAC_Stop();

  • HAL_StatusTypeDef HAL_DAC_ConfigChannel();

  • HAL_StatusTypeDef HAL_DAC_SetValue();

  • void HAL_DAC_IRQHandler(DAC_HandleTypeDef* hdac);

  • void HAL_DAC_ConvCpltCallbackCh1(DAC_HandleTypeDef* hdac);

  • void HAL_DAC_ConvHalfCpltCallbackCh1(DAC_HandleTypeDef* hdac);

  • void HAL_DAC_ErrorCallbackCh1(DAC_HandleTypeDef *hdac);

  • void HAL_DAC_DMAUnderrunCallbackCh1(DAC_HandleTypeDef *hdac);

2.DAC配置步骤:

① 开启DAC和IO口时钟,设置输入引脚为模拟输入:
__HAL_RCC_DAC_CLK_ENABLE(); //使能DAC时钟
__HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟
GPIO_Initure.Mode=GPIO_MODE_ANALOG; //模拟

② 初始化DAC和通道参数 :
HAL_DAC_Init();
HAL_DAC_ConfigChannel();

③ 使能DAC转换通道:
HAL_DAC_Start();

④ 设置DAC输出值:
HAL_DAC_SetValue();

五、DAC配置实例

实现功能
通过按键控制一个数字变量,按键WK_UP每按一下数字自加200,按键 KEY1每按一下数字自减200
数值通过ADC输出,然后用DAC采集到输出的数字量并转化成模拟量电压(4096->3.3v)

1.引入DAC支持文件

2.开启DAC和IO口时钟,设置输入引脚为模拟输入:

__HAL_RCC_DAC_CLK_ENABLE(); //使能DAC时钟
__HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟
GPIO_Initure.Mode=GPIO_MODE_ANALOG; //模拟

//DAC底层驱动,时钟配置,引脚 配置
//此函数会被HAL_DAC_Init()调用
//hdac:DAC句柄
void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac)
{      GPIO_InitTypeDef GPIO_Initure;           //定义GPIO结构体__HAL_RCC_DAC_CLK_ENABLE();             //使能DAC时钟__HAL_RCC_GPIOA_CLK_ENABLE();           //开启GPIOA时钟GPIO_Initure.Pin=GPIO_PIN_4;            //PA4GPIO_Initure.Mode=GPIO_MODE_ANALOG;     //模拟模式GPIO_Initure.Pull=GPIO_NOPULL;          //不带上下拉HAL_GPIO_Init(GPIOA,&GPIO_Initure);
}

3.初始化DAC和通道参数

HAL_DAC_Init();
HAL_DAC_ConfigChannel();

DAC_HandleTypeDef DAC1_Handler;//DAC句柄//初始化DAC
void DAC1_Init(void)
{DAC_ChannelConfTypeDef DACCH1_Config;DAC1_Handler.Instance=DAC;HAL_DAC_Init(&DAC1_Handler);                                        //初始化DACDACCH1_Config.DAC_Trigger=DAC_TRIGGER_NONE;                       //不使用触发功能DACCH1_Config.DAC_OutputBuffer=DAC_OUTPUTBUFFER_DISABLE;          //DAC1输出缓冲关闭HAL_DAC_ConfigChannel(&DAC1_Handler,&DACCH1_Config,DAC_CHANNEL_1);  //DAC通道1配置HAL_DAC_Start(&DAC1_Handler,DAC_CHANNEL_1);                       //开启DAC通道1
}

4.设置DAC输出值:

HAL_DAC_SetValue();

//设置通道1输出电压
//当数值为1000时,DAC输出1V
//vol:0~3300,代表0~3.3V
void DAC1_Set_Vol(u16 vol)
{double temp=vol;temp/=1000;      //temp=temp/1000;temp=temp*4096/3.3;HAL_DAC_SetValue(&DAC1_Handler,DAC_CHANNEL_1,DAC_ALIGN_12B_R,temp);//12位右对齐数据格式设置DAC值
}

到这里dac.c函数编写完毕,dac.c代码如下:

#include "dac.h"DAC_HandleTypeDef DAC1_Handler;//DAC句柄//初始化DAC
void DAC1_Init(void)
{DAC_ChannelConfTypeDef DACCH1_Config;DAC1_Handler.Instance=DAC;HAL_DAC_Init(&DAC1_Handler);                                        //初始化DACDACCH1_Config.DAC_Trigger=DAC_TRIGGER_NONE;                       //不使用触发功能DACCH1_Config.DAC_OutputBuffer=DAC_OUTPUTBUFFER_DISABLE;          //DAC1输出缓冲关闭HAL_DAC_ConfigChannel(&DAC1_Handler,&DACCH1_Config,DAC_CHANNEL_1);  //DAC通道1配置HAL_DAC_Start(&DAC1_Handler,DAC_CHANNEL_1);                       //开启DAC通道1
}//DAC底层驱动,时钟配置,引脚 配置
//此函数会被HAL_DAC_Init()调用
//hdac:DAC句柄
void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac)
{      GPIO_InitTypeDef GPIO_Initure;           //定义GPIO结构体__HAL_RCC_DAC_CLK_ENABLE();             //使能DAC时钟__HAL_RCC_GPIOA_CLK_ENABLE();           //开启GPIOA时钟GPIO_Initure.Pin=GPIO_PIN_4;            //PA4GPIO_Initure.Mode=GPIO_MODE_ANALOG;     //模拟模式GPIO_Initure.Pull=GPIO_NOPULL;          //不带上下拉HAL_GPIO_Init(GPIOA,&GPIO_Initure);
}//设置通道1输出电压
//当数值为1000时,DAC输出1V
//vol:0~3300,代表0~3.3V
void DAC1_Set_Vol(u16 vol)
{double temp=vol;temp/=1000;      //temp=temp/1000;temp=temp*4096/3.3;HAL_DAC_SetValue(&DAC1_Handler,DAC_CHANNEL_1,DAC_ALIGN_12B_R,temp);//12位右对齐数据格式设置DAC值
}

同时,dac.h代码如下:

#ifndef __DAC_H
#define __DAC_H
#include "sys.h"extern DAC_HandleTypeDef DAC1_Handler;//DAC句柄void DAC1_Init(void);
void DAC1_Set_Vol(u16 vol);     //当数值为1000时,DAC输出1V
#endif

5.main.c函数编写

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "lcd.h"
#include "sdram.h"
#include "usmart.h"
#include "adc.h"
#include "dac.h"int main(void)
{u16 adcx;float temp;u8 t=0;    u16 dacval=0;u8 key;  HAL_Init();                     //初始化HAL库   Stm32_Clock_Init(360,25,2,8);   //设置时钟,180Mhzdelay_init(180);                //初始化延时函数uart_init(115200);              //初始化USARTusmart_dev.init(90);            //初始化USMART LED_Init();                     //初始化LED KEY_Init();                     //初始化按键SDRAM_Init();                   //初始化SDRAMLCD_Init();                     //初始化LCDMY_ADC_Init();                  //初始化ADC1DAC1_Init();                    //初始化DAC1POINT_COLOR=RED; LCD_ShowString(30,50,200,16,16,"Apollo STM32F429"); LCD_ShowString(30,70,200,16,16,"DAC TEST");   LCD_ShowString(30,90,200,16,16,"Apollo Control By Wire");LCD_ShowString(30,110,200,16,16,"2022/4/2");    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");  HAL_DAC_SetValue(&DAC1_Handler,DAC_CHANNEL_1,DAC_ALIGN_12B_R,0);//初始值为0     while(1){t++;key=KEY_Scan(0);              if(key==WKUP_PRES){      if(dacval<4000)dacval+=200;HAL_DAC_SetValue(&DAC1_Handler,DAC_CHANNEL_1,DAC_ALIGN_12B_R,dacval);//设置DAC值}else if(key==2)    {if(dacval>200)dacval-=200;else dacval=0;HAL_DAC_SetValue(&DAC1_Handler,DAC_CHANNEL_1,DAC_ALIGN_12B_R,dacval);//设置DAC值}     if(t==10||key==KEY1_PRES||key==WKUP_PRES)        //WKUP/KEY1按下了,或者定时时间到了{      adcx=HAL_DAC_GetValue(&DAC1_Handler,DAC_CHANNEL_1);  //读取前面设置DAC的值LCD_ShowxNum(94,150,adcx,4,16,0);          //显示DAC寄存器值temp=(float)adcx*(3.3/4096);                //得到DAC电压值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);     //得到ADC转换值   temp=(float)adcx*(3.3/4096);             //得到ADC电压值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);   }
}

36.DAC工作原理与配置相关推荐

  1. 第五章 路由器的工作原理及其配置

    第五章 路由器的工作原理及其配置 5.1 广域网服务 WAN连接的目的是在两个远离的网络之间尽可能高效率传递数据.连接的效率越高,到最终用户的连接就越透明.WAN连接通常比L A N连接要慢.例如,一 ...

  2. MPLS之LDP的工作原理和配置

    LDP的工作原理和配置 LDP的基本概念和工作机制 MPLS标签分发模式 LDP的基础配置 一.LDP的基本概念和工作机制 首先MPLS是一种根据标签报文中携带的标签来转发数据的技术. MPLS的一个 ...

  3. HSRP双机热备工作原理与配置

    热备份路由选择协议(HSRP) 一.HSRP的相关概念 1.HSRP的原理 1.1.HSRP概述 HSRP(Host Standby Routing Protocol,热备份路由选择协议)是Cisco ...

  4. windows php fastcgi,windows下FastCGI(php-cgi)的工作原理和配置

    一.FastCGI是什么? FastCGI是语言无关的.可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能.众所周知,CGI解释器的反复加载是CGI性能低下的主 ...

  5. ASA 防火墙 工作原理与配置实例

    ASA是状态化防火墙,会建立一个用户信息连接表(Conn),连接表中包含的相关信息有源IP地址.目的IP地址.IP协议(如TCP或UDP).IP协议信息(如TCP/UDP的端口号.TCP序列号和TCP ...

  6. 路由器工作原理及配置实验

    一.路由器工作原理 路由器根据路由表转发数据,并选择最优路径 :若路由表中没有路由,可手动设置静态路由. 路由器工作在OSI模型三层(网络层),收到数据包后根据OSI模型层层将数据包拆开,到网络层后根 ...

  7. 交换机的基本工作原理与配置

    数据链路层功能: 1.数据链路的建立.维护与拆除 2.帧包装.帧传输.帧同步 3.帧的差错恢复 4.流量控制 以太网工作在数据链路层 数据链路层封装的MAC头部里的MAC地址(48比特=48位=6字节 ...

  8. [计算机网络]四、交换机的工作原理与配置(数据链路层、以太网交换机、交换机的基本配置)

    目录 1.数据链路层 1.1.数据链路层的功能 1.2.以太网工作在数据链路层 1.2.1.以太网的发展 1.2.2.以太网MAC地 1.2.3.网卡.路由器和交换机厂商有哪些 1.2.4.以太网帧的 ...

  9. Hybrid接口的工作原理及其配置

    Hybrid接口的工作原理涉及及接口的三个属性: 分别为:untag列表,tag列表,PVID(port-base VLAN ID,基于端口的VLAN ID) untag列表:只在接口发送数据帧时起作 ...

最新文章

  1. 受益匪浅:十个哲理寓言,十个成功秘诀
  2. RIPv2 路由手工汇总
  3. jmeter 多机负载压测与服务器性能监测
  4. “CObject::operator =”: 无法访问 private 成员(在“CObject”类中声明)
  5. ios 获取一个枚举的所有值_凯哥带你从零学大数据系列之Java篇---第十一章:枚举...
  6. bluecam连接步骤说明_厂家详解旋片式真空泵使用说明
  7. jquery如何获取元素的滚动高度
  8. python多线程之线程锁(Lock)和递归锁(RLock)实例
  9. 黑马程序员——Java基础---String与StringBuilder
  10. AnnotationUtils
  11. 2017CCPC哈尔滨赛区总结
  12. 拓端tecdat|R语言和Stan,JAGS:用rstan,rjags建立贝叶斯多元线性回归预测选举数据
  13. 好用的桌面搜索引擎(如果你的快捷方式很多,可能会需要它)
  14. c语言iostream函数用法,iostream中的extern对象解决方法
  15. R语言中经纬度度分秒转小数
  16. Python暴力破解ZIP文件密码
  17. python ffmpeg mp3文件转为wav文件
  18. android 9指纹认证_Android指纹认证教程
  19. 数据血缘图谱升级方案设计与实现
  20. Win10 设置默认语言

热门文章

  1. 如何证明圆锥面积=1/3圆柱面积?
  2. CloudFoundry源码分析:NATS
  3. 企业WiFi管理需求
  4. Linux获取最后一个参数(参数统计)
  5. zstuoj (浙理工) 孙壕请一盘青岛大虾呗
  6. C++类和对象(中)
  7. 一秒看懂:SaaS软件和传统软件的区别!
  8. IOS- 时间格式转换问题(12小时和24小时的区别)
  9. DYA9面向对象中--方法的重写
  10. 超级机器人大战A(GBA)帅气攻略(超级系流程2)