【STM32】DAC程序示例
00. 目录
文章目录
- 00. 目录
- 01. DAC简介
- 02. 硬件模块
- 03. 程序设计
- 04. 结果验证
- 05. 预留
- 06. 附录
- 07. 声明
01. DAC简介
STM32F4的DAC模块(数字/模拟转换模块)是12位数字输入,电压输出型的DAC。DAC可以配置为 8 位或 12 位模式,也可以与 DMA 控制器配合使用。DAC 工作在 12 位模式时,数据可以设置成左对齐或右对齐。DAC 模块有 2 个输出通道,每个通道都有单独的转换器。在双 DAC 模式下,2 个通道可以独立地进行转换,也可以同时进行转换并同步地更新 2 个通道的输出。DAC 可以通过引脚输入参考电压 Vref+(通 ADC 共用)以获得更精确的转换结果。
STM32F4 的 DAC 模块主要特点有:
① 2 个 DAC 转换器:每个转换器对应 1 个输出通道
② 8 位或者 12 位单调输出
③ 12 位模式下数据左对齐或者右对齐
④ 同步更新功能
⑤ 噪声波形生成
⑥ 三角波形生成
⑦ 双 DAC 通道同时或者分别转换
⑧ 每个通道都有 DMA 功能
02. 硬件模块
用到的硬件资源有:
1) 指示灯 DS0
2) KEY_UP 和 KEY1 按键
3) 串口
4) TFTLCD 模块
5) ADC
6) DAC
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HO0gJXb7-1601197306284)(assets/image-20200927164845298.png)]
03. 程序设计
dac.h文件
#ifndef __DAC_H
#define __DAC_H
#include "sys.h" void Dac1_Init(void); //DAC通道1初始化
void Dac1_Set_Vol(u16 vol); //设置通道1输出电压
#endif
dac.c文件
#include "dac.h"//DAC通道1输出初始化
void Dac1_Init(void)
{ GPIO_InitTypeDef GPIO_InitStructure;DAC_InitTypeDef DAC_InitType;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);//使能DAC时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//模拟输入GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;//下拉GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化DAC_InitType.DAC_Trigger=DAC_Trigger_None; //不使用触发功能 TEN1=0DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//不使用波形发生DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;//屏蔽、幅值设置DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ; //DAC1输出缓存关闭 BOFF1=1DAC_Init(DAC_Channel_1,&DAC_InitType); //初始化DAC通道1DAC_Cmd(DAC_Channel_1, ENABLE); //使能DAC通道1DAC_SetChannel1Data(DAC_Align_12b_R, 0); //12位右对齐数据格式设置DAC值
}
//设置通道1输出电压
//vol:0~3300,代表0~3.3V
void Dac1_Set_Vol(u16 vol)
{double temp=vol;temp/=1000;temp=temp*4096/3.3;DAC_SetChannel1Data(DAC_Align_12b_R,temp);//12位右对齐数据格式设置DAC值
}
main.c文件
int main(void)
{ u16 adcx;float temp;u8 t=0; u16 dacval=0;u8 key; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2delay_init(168); //初始化延时函数uart_init(115200); //初始化串口波特率为115200LED_Init(); //初始化LED LCD_Init(); //LCD初始化Adc_Init(); //adc初始化KEY_Init(); //按键初始化Dac1_Init(); //DAC通道1初始化 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,"2014/5/6"); 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);//初始值为0 while(1){t++;key=KEY_Scan(0); if(key==WKUP_PRES){ if(dacval<4000)dacval+=200;DAC_SetChannel1Data(DAC_Align_12b_R, dacval);//设置DAC值}else if(key==2) {if(dacval>200)dacval-=200;else dacval=0;DAC_SetChannel1Data(DAC_Align_12b_R, dacval);//设置DAC值} if(t==10||key==KEY1_PRES||key==WKUP_PRES) //WKUP/KEY1按下了,或者定时时间到了{ adcx=DAC_GetDataOutputValue(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); }
}
04. 结果验证
同时伴随 DS0 的不停闪烁,提示程序在运行。此时,我们通过按 KEY_UP 按键,可以看到输出电压增大,按 KEY1 则变小。
05. 预留
06. 附录
6.1 【STM32】STM32系列教程汇总
网址:【STM32】STM32系列教程汇总
07. 声明
该教程参考了正点原子的《STM32 F4 开发指南》
【STM32】DAC程序示例相关推荐
- 【STM32】待机唤醒程序示例
00. 目录 文章目录 00. 目录 01. 待机模式简介 02. 硬件模块 03. 相关函数 04. 程序示例一 05. 程序示例二 06. 附录 07. 声明 01. 待机模式简介 很多单片机都有 ...
- 【STM32】硬件随机数程序示例
00. 目录 文章目录 00. 目录 01. 概述 02. 硬件模块 03. 相关函数 04. 程序示例 05. 结果验证 06. 附录 07. 声明 01. 概述 STM32F4 自带了硬件随机数发 ...
- 【STM32】ADC程序示例
00. 目录 文章目录 00. 目录 01. ADC简介 02. 硬件资源 03. 编程思路 04. 程序示例 05. 预留 06. 附录 07. 声明 01. ADC简介 STM32F4xx 系列一 ...
- RT-Thread系统 STM32 DAC设备改进,直接调用系统DAC驱动函数设置输出电压
前言 RT-Thread系统官方的驱动支持DAC设备比较晚,还不太完善,所以早期的STM32F1等系列基于芯片的工程中并没有DAC设备的驱动,很多人建议直接调用HAL库中的函数操作DAC,但这样操作并 ...
- java聊天程序步骤解析_java网络之基于UDP的聊天程序示例解析
基于UDP的Socket通信 UDP协议不是一种基于稳定连接的协议,是一种面向数据报包的通信协议,不需要通信双方建立稳定的连接,也没有所谓服务端和客户的概念,数据报包在传输的时候不保证一定及时到达,也 ...
- java web程序示例_想要建立一些有趣的东西吗? 这是示例Web应用程序创意的列表。...
java web程序示例 Interested in learning JavaScript? Get my ebook at jshandbook.com 有兴趣学习JavaScript吗? 在js ...
- 第一个Mybatis程序示例 Mybatis简介(一)
在JDBC小结中(可以参阅本人JDBC系列文章),介绍到了ORM,其中Mybatis就是一个不错的ORM框架 MyBatis由iBatis演化而来 iBATIS一词来源于"internet& ...
- 9.5 程序示例--推荐系统-机器学习笔记-斯坦福吴恩达教授
程序示例–推荐系统 推荐模型 在推荐模型中,我们将暴露: 训练接口 train() 预测接口 predict(Theta, X) 获得推荐接口 getTopRecommends(Theta, X, i ...
- 8.7 程序示例--异常检测-机器学习笔记-斯坦福吴恩达教授
程序示例–异常检测 异常检测模型 提供了一般高斯分布模型和多元高斯分布模型.其中,多元高斯分布模型被限制到了同轴分布: # coding: utf8 # anomaly_detection/anoma ...
最新文章
- oracle的那些事
- basler相机参数简要中文说明_你知道相机曝光模式怎么用么?6种相机曝光模式详解及应用...
- 提示计算机未安装flash,大师应对安装了flash,但浏览器提示没安装,如何解决...
- RUP,XP,敏捷原理
- 当代家长现状。。 | 今日最佳
- openfeign调用 HttpServletRequest作为参数 报错..
- 阿里云安装mysql5.7_同一服务器上二进制安装mysql5.7和mysql5.6
- 各种排序算法的时间复杂度
- 不可错过!斯坦福课程3D数据的机器学习方法(Machine Learning for 3D Data)第二部分Geometry Foundations: Surface Representations
- 算法不会,尚能饭否之排序——折半插入排序(Binary Insert Sort)
- 【转】Linux下发生段错误时如何生成core文件
- 自定义 Bean 作用域
- 单片机中断实验 EX0
- 省份城市 mysql_省份城市数据库 mysql
- 期货开平,多开,空开,多平,空平
- python机器人编程——差速机器人小车的控制,控制模型、轨迹跟踪,轨迹规划、自动泊车(上)
- c语言编程设计实验课件,c语言程序设计实验课件.ppt
- 当心PayPal,Amazon认真对待付款
- centos7查看oracle监听端口,CentOS 7开放及查看防火墙firewall的端口
- workbench设置单元坐标系_节点坐标系:很多Workbench结构用户不知道的重要概念
热门文章
- 2015.5.28 面试题1:赋值运算符函数
- 在ubuntu上mysql出现ERROR 1045(28000):Access denied for user ‘young‘@’localhost‘(using password:NO)...
- oracle status
- HDOJ---1272 小希的迷宫[并查集]
- 实验9 结构程序设计 7-4 查找书籍
- svm java_SVM入门(十)将SVM用于多类分类
- python redis模块connectionerror_PHP程序连接Redis报read error on connection问题
- Java黑皮书课后题第2章:2.10(科学:计算能量)编写程序,计算将水从初始温度加热到最终温度所需的能量。程序应该提示用户输入水的重量(kg),以及水的初始温度、最终温度
- Html的一些小东西
- 2018 前端面试题(不定期更新)