36.DAC工作原理与配置
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工作原理与配置相关推荐
- 第五章 路由器的工作原理及其配置
第五章 路由器的工作原理及其配置 5.1 广域网服务 WAN连接的目的是在两个远离的网络之间尽可能高效率传递数据.连接的效率越高,到最终用户的连接就越透明.WAN连接通常比L A N连接要慢.例如,一 ...
- MPLS之LDP的工作原理和配置
LDP的工作原理和配置 LDP的基本概念和工作机制 MPLS标签分发模式 LDP的基础配置 一.LDP的基本概念和工作机制 首先MPLS是一种根据标签报文中携带的标签来转发数据的技术. MPLS的一个 ...
- HSRP双机热备工作原理与配置
热备份路由选择协议(HSRP) 一.HSRP的相关概念 1.HSRP的原理 1.1.HSRP概述 HSRP(Host Standby Routing Protocol,热备份路由选择协议)是Cisco ...
- windows php fastcgi,windows下FastCGI(php-cgi)的工作原理和配置
一.FastCGI是什么? FastCGI是语言无关的.可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能.众所周知,CGI解释器的反复加载是CGI性能低下的主 ...
- ASA 防火墙 工作原理与配置实例
ASA是状态化防火墙,会建立一个用户信息连接表(Conn),连接表中包含的相关信息有源IP地址.目的IP地址.IP协议(如TCP或UDP).IP协议信息(如TCP/UDP的端口号.TCP序列号和TCP ...
- 路由器工作原理及配置实验
一.路由器工作原理 路由器根据路由表转发数据,并选择最优路径 :若路由表中没有路由,可手动设置静态路由. 路由器工作在OSI模型三层(网络层),收到数据包后根据OSI模型层层将数据包拆开,到网络层后根 ...
- 交换机的基本工作原理与配置
数据链路层功能: 1.数据链路的建立.维护与拆除 2.帧包装.帧传输.帧同步 3.帧的差错恢复 4.流量控制 以太网工作在数据链路层 数据链路层封装的MAC头部里的MAC地址(48比特=48位=6字节 ...
- [计算机网络]四、交换机的工作原理与配置(数据链路层、以太网交换机、交换机的基本配置)
目录 1.数据链路层 1.1.数据链路层的功能 1.2.以太网工作在数据链路层 1.2.1.以太网的发展 1.2.2.以太网MAC地 1.2.3.网卡.路由器和交换机厂商有哪些 1.2.4.以太网帧的 ...
- Hybrid接口的工作原理及其配置
Hybrid接口的工作原理涉及及接口的三个属性: 分别为:untag列表,tag列表,PVID(port-base VLAN ID,基于端口的VLAN ID) untag列表:只在接口发送数据帧时起作 ...
最新文章
- 受益匪浅:十个哲理寓言,十个成功秘诀
- RIPv2 路由手工汇总
- jmeter 多机负载压测与服务器性能监测
- “CObject::operator =”: 无法访问 private 成员(在“CObject”类中声明)
- ios 获取一个枚举的所有值_凯哥带你从零学大数据系列之Java篇---第十一章:枚举...
- bluecam连接步骤说明_厂家详解旋片式真空泵使用说明
- jquery如何获取元素的滚动高度
- python多线程之线程锁(Lock)和递归锁(RLock)实例
- 黑马程序员——Java基础---String与StringBuilder
- AnnotationUtils
- 2017CCPC哈尔滨赛区总结
- 拓端tecdat|R语言和Stan,JAGS:用rstan,rjags建立贝叶斯多元线性回归预测选举数据
- 好用的桌面搜索引擎(如果你的快捷方式很多,可能会需要它)
- c语言iostream函数用法,iostream中的extern对象解决方法
- R语言中经纬度度分秒转小数
- Python暴力破解ZIP文件密码
- python ffmpeg mp3文件转为wav文件
- android 9指纹认证_Android指纹认证教程
- 数据血缘图谱升级方案设计与实现
- Win10 设置默认语言