所谓的DAC功能也就是将数字信号转换为模拟信号,一般情况下使用比较多的就是ADC功能,也就是将模拟信号转换为数字信号,多用于读取传感器的值。但是有时候需要控制某些传感器,需要用模拟信号控制,这就需要将数字信号转换为模拟信号了。

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

DAC 主要特征

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

下面就通过代码来实现模拟信号输出。

#include "dac.h"void DAC1_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;DAC_InitTypeDef DAC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC , ENABLE);//PA4设置为为模拟输入,使能DAC通道后,PA4会与DAC模拟输出相连,设置为输入为了避免了干扰GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                             //设置为模拟输入GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;                             //不使用触发功能 TEN1=0DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;           //不使用波形发生DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0;     //屏蔽、幅值设置DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;                //DAC1输出缓存关闭DAC_Init(DAC_Channel_1, &DAC_InitStructure);                                //初始化DAC通道1DAC_Cmd(DAC_Channel_1, ENABLE);                                          //使能DAC1DAC_SetChannel1Data(DAC_Align_12b_R, 0);                                    //12位右对齐数据格式设置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_SetChannel1Data(DAC_Align_12b_R, temp);
}

在初始化的时候,要注意一个问题,STM32F103单片机的DAC输出通道有两个。


PA4和PA5,但是在初始化引脚的时候,要将PA4和PA5初始化为模拟输入功能。这个在官方文档上也有说明。

  内部自动就会将PA4和PA5与模拟输出引脚连接起来。所以在初始化的时候,虽然用的是输出功能,但是还是要将引脚设置为输入。

  初始化引脚之后,接下来初始化DAC功能,在这里不使用触发功能,也不使用波形发生功能。直接通过软件来控制

  接下里通过一个函数将要输出的电压值换算为寄存器的设置值。DAC的转换为12位,所以最大值就是2^12,也就是4096,而stm32单片机的供电电压值3.3V,所以将要设置的电压值除以3.3,然后乘以4096就是DAC寄存器需要设置的值。

  如果要输出模拟电压值时,只需要在主函数中调用DAC1_Set_Vol()函数,并将要设置的电压值传递给这个函数就行了。

int main(void)
{u16 adcx;float temp;u8 t = 0;u16 dacval = 0;u8 key;delay_init();NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);uart_init(115200);LED_Init();DAC1_Init();    while(1){LED0 = !LED0;DAC1_Set_Vol(1000);delay_ms(100);}
}

在主函数中设置DAC输出的电压值为1000,也就是1V。这时通过万用表就可以在stm32单片机的PA4引脚量到1V的电压值了。

STM32F103DAC功能实现相关推荐

  1. 如果你没用过maven的install,你应该了解一下!maven中的install功能及用法。

    maven中有一个大多数人都忽视或者没有用到过的一个功能--install,大多数java开发人员都了解maven,使用maven进行依赖管理.但使用的大多数功能不过是clean清理.compile编 ...

  2. 一个form表单,多个提交按钮(实现不同功能和地址的提交)

    直接上代码 表单部分: <form action="" name="find" method="post" enctype=" ...

  3. nginx介绍及常用功能

    什么是nginx nginx跟Apache一样,是一个web服务器(网站服务器),通过HTTP协议提供各种网络服务. Apache:重量级的,不支持高并发的服务器.在Apache上运行数以万计的并发访 ...

  4. java action dao_java中Action层、Service层和Dao层的功能区分

    一.Action/Service/DAO简介: Action是管理业务(Service)调度和管理跳转的. Service是管理具体的功能的. Action只负责管理,而Service负责实施. DA ...

  5. 窗口键 键位码_键盘上这些被冷落的键位居然有这么强大的功能

    各位小伙伴们大家好啊,又到了达尔优外设小课堂时间了,今天呢,我们将为大家带来的是键盘上的功能区按键小科普,也就是我们常说的F区按键. F区按键 F1~F12这个区域的按键我们通常称为功能键,而F的意思 ...

  6. app如何打开了request url_手机日历app内如何打开节日提醒功能?支持提前提醒节日的云便签...

    我们一年中要度过的节日有很多,除了法定节假日之外,还有其他的很多节日,例如西方传来的圣诞节.万圣节,国际性的节日例如父亲节.母亲节等,还有一些传统节日例如小寒.冬至.腊八等,这些都是不放假的. 有时候 ...

  7. etcd 笔记(05)— etcd 代码结构、各模块功能、整体架构、各模块之间的交互、请求和应答流程

    1. etcd 项目结构和功能 etcd 项目代码的目录结构如下: $ tree ├── auth ├── build ├── client ├── clientv3 ├── contrib ├── ...

  8. OpenCV 笔记(01)— OpenCV 概念、整体架构、各模块主要功能

    1. OpenCV 概念 图像处理( Image Processing )是用计算机对图像进行分析, 以达到所需结果的技术, 又称影像处理. 图像处理技术一般包括图像压缩, 增强和复原, 匹配.描述和 ...

  9. django自带的分页功能

    django自带的分页功能 django中自带的分页功能有缺陷,但是也是一种思路,所以在下做一个整理,方便以后使用,还有服务各位小伙伴. django视图部分的代码.(注释才是重点) from dja ...

最新文章

  1. 三步10分钟搞定数据库版本的降迁 (将后台数据库SQL2008R2降为SQL2005版本)
  2. Serverless 时代下大规模微服务应用运维的最佳实践
  3. 黑色星期五c语言,求黑色星期五问题~
  4. 差异分析定位Ring 3保护模块
  5. cudnn.h: No such file or directory
  6. 2017-9-15Opencv 杂
  7. Coursera吴恩达《卷积神经网络》课程笔记(3)-- 目标检测
  8. 《是碰巧还是执着?python所阅读的每一场知识点,唯一的共同点就是——参赛选手中,有详解Python的装饰器!》
  9. python程序设计与应用第1章
  10. JVM内存模型分析(一个程序运行的例子)
  11. plsql 自动查询最后页_一次SQL查询优化思考过程(900W+数据,从17s到300ms)
  12. oracle Lpad()函数和Rpad()函数的用法
  13. Android中的文字占位符
  14. delphi官方iso下载地址
  15. Apache Echarts实现矢量地图
  16. uniapp app 腾讯云 IM 创建群组(陌生交友)
  17. 从“老公”的称呼来历,看男人地位的变迁!
  18. oracle安装搜狗输入法教程,Ubuntu12.04安装搜狗拼音输入法
  19. 7-1 计算职工工资
  20. Win7 如何修改hosts文件

热门文章

  1. Share Favorites
  2. 无意中发现Markdown,最终解放了我
  3. vue-cli 中stylus写样式莫名报错?
  4. Hadoop HA on Yarn——集群配置
  5. mybatis使用拦截器显示sql,使用druid配置连接信息
  6. Android日期控件如何兼容不同手机
  7. 由几个月前写的(验证码利用ashx一般处理程序来做),修改为不用以一般处理程序...
  8. jmeter之线程组如何使用
  9. 怎么把matlab仿真数据压缩,JPEG图像压缩编码及其MATLAB仿真实现(1)
  10. close wait 过多原因_从Linux源码看TIME_WAIT状态的持续时间