背景说明

在我个人所做的某个项目中,需要用到DA转换,总所周知,STM32上就有DA转换模块,经过查询STM32的Datasheet,发现本我这个项目用到的STM32f103C8t6上并没有DAC外设,而且一个32上最多也只有两个DAC外设,但我需要用到四个,于是便开始找芯片,于是便找到了这款DAC7512。其只有6个引脚,而且引脚功能简洁易懂,于是便采用此芯片作为外设DAC。

DAC7512原理

DAC7512是一个12位的数模转换器,单电源供电,从2.7v到5.5v,可以接受多种通讯协议。这里我采用的是SPI通信,来对其进行操作
其每次通信都需要写入16位数据,其中低12位是自己的用来进行DAC转换的值,DB15和DB14的值无所谓,填0就好,DB13和DB12的值在普通的DAC转换中,也是填0就好

实际应用

像这种需要对其进行通信的芯片,第一步肯定是看时序图,根据时序图来写代码。由于32上也没有四个SPI端口,所以我采用模拟SPI的方式来对其进行操作
先定义一下引脚

#define SoftWare_CS_1 GPIO_SetBits(GPIOA,GPIO_Pin_0)
#define SoftWare_CS_0 GPIO_ResetBits(GPIOA,GPIO_Pin_0)
#define SoftWare_CLK_1 GPIO_SetBits(GPIOA,GPIO_Pin_5)
#define SoftWare_CLK_0 GPIO_ResetBits(GPIOA,GPIO_Pin_5)
#define SoftWare_Data_1 GPIO_SetBits(GPIOA,GPIO_Pin_7)
#define SoftWare_Data_0 GPIO_ResetBits(GPIOA,GPIO_Pin_7)

由于是模拟SPI接口,所以引脚怎么定义随自己的意思

然后是配置GPIO,由于DAC7512没有读的功能,所以直接全部引脚推挽输出就完事了

void DAC7512_SoftWare_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_5 |GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);
}

配置GPIO在STM32里也是老生常谈了,这里就不多说了

最后就是数据的写操作了。根据时序图,我们要在CLK的下降沿把数据送入DAC7512,所以我在上升沿时改变单片机数据端口的电平,然后保持一个周期,确保DAC7512在时钟的上升沿时能保证得到正确的信号

void DAC7512_SoftWare_SendData(u16 a)
{int i;SoftWare_CS_1;SoftWare_CLK_1;SoftWare_Data_1;delay_us(1);SoftWare_CS_0;delay_us(1);for(i=0;i<16;i++){if(0x8000&a){SoftWare_Data_1;}else{SoftWare_Data_0;}delay_us(1);SoftWare_CLK_0;a=a<<1;delay_us(1);SoftWare_CLK_1;}SoftWare_CS_1;SoftWare_CLK_1;SoftWare_Data_1;
}

然后每次传递完16位数据后,选通端,时钟端和数据端全部拉高

验证

在主函数里写下以下代码,很明显,这是驱动DAC产生三角波的代码,由于是12位的DAC,所以最大输入只能到4095

int  main()
{ int i;DAC7512_SoftWare_Init();while(1){for(i=0;i<4095;i++){DAC7512_SoftWare_SendData(i);}for(i=4095;i>0;i--){DAC7512_SoftWare_SendData(i);  }}
}

在示波器上得到的波形如下:
完美!DAC功能实现
如果有人想下载完整的测试程序,下载链接贴在下面:
DAC7512三角波测试程序
至于DAC7512送进去的值和输出的电压之间的关系,建议直接看Datasheet

DAC7512原理及其通过STM32的编程和应用相关推荐

  1. STM32 C++编程 004 Adc (数模转换)类

    使用 C++ 语言给 STM32 编写一个 Adc 类 我使用的STM32芯片:STM32F103ZET6 我们使用的STM32库版本:V3.5.0 注意: 想学习本套 STM32 C++编程 的专栏 ...

  2. TCP原理,Socket与网络编程入门

    TCP原理,Socket与网络编程入门 开篇 从互联网的诞生以来,网络程序逐渐普及.计算机网络将各个计算机连接到一起使它们可以通信.在现代,网络已成为我们十分重要的一部分.这次不搞些费脑子的东西,就让 ...

  3. MG995舵机工作原理及基于STM32的驱动源代码

    MG995舵机工作原理及基于STM32的驱动源代码 一·MG995舵机工作原理 1.MG995舵机简介 产品型号 MG995 产品尺寸 40.7*19.7*42.9mm 产品重量 55g 工作扭矩 1 ...

  4. 第018课 ADC和触摸屏硬件原理详解及裸机编程

    第001节_ADC硬件原理 模数转换器即A/D转换器,或简称ADC,通常是指一个将模拟信号转变为数字信号的电子元件. 通常的模数转换器是把经过与标准量比较处理后的模拟量转换成以二进制数值表示的离散信号 ...

  5. crc 校验错误_资深工程师:图说CRC原理应用及STM32硬件CRC外设

    在嵌入式产品应用中,常常需要应对系统数据在存储或者传输过程中的完整性问题.所谓完整性是指数据在其生命周期中的准确性和一致性.这些数据可能存储在EEPROM/FLASH里,或者基于通信协议进行传输,它们 ...

  6. 了解实时时钟RTC的原理并通过stm32实现STM32的日历读取、设置和输出

    文章目录 前言 一.RTC是什么? 1.定义 2.原理 二.配置项目 三.配置代码 1.重定向printf函数 2.效果(1) 3.添加星期 4.效果(2) 四.总结 五.参考资料 前言 硬件:stm ...

  7. STM32状态机编程实例——全自动洗衣机(上)

    前面几篇文章,以按键功能,介绍了状态机的原理与按键状态机实例,实现按键单击.双击.长按等状态的检测. 本篇,继续使用状态机编程,来实现一个更有趣的功能--全自动洗衣机. 1 全自动洗衣机功能分析 下面 ...

  8. Java集合,ConcurrentHashMap底层实现和原理(常用于并发编程)

    为什么80%的码农都做不了架构师?>>>    概述 ConcurrentHashMap常用于并发编程,这里就从源码上来分析一下ConcurrentHashMap数据结构和底层原理. ...

  9. 多角度让你彻底明白yield语法糖的用法和原理及在C#函数式编程中的作用

    如果大家读过dapper源码,你会发现这内部有很多方法都用到了yield关键词,那yield到底是用来干嘛的,能不能拿掉,拿掉与不拿掉有多大的差别,首先上一段dapper中精简后的Query方法,先让 ...

最新文章

  1. Java数据访问对象模式
  2. ai一个线段多个箭头_AI设计教程:艺术笔制作渐变线条海报的方法是什么
  3. 关于数据中心的选址大全
  4. linux du命令使用:目录大小排序
  5. 【数据结构与算法】之链表的操作和使用
  6. arcgis工具python源码_面向Arcgis的python脚本编程_数据
  7. 从李一男,到美女博士姚婷,任正非:要把中国的天才,留在中国
  8. STM32----SysTick实现监控开机时长
  9. [UiAutomator] UiSelector中使用instance与index方法定位控件的区别
  10. 深度学习 《LSTM和GRU模型》
  11. 关于“只有静态常量整型数据成员才可以在类中初始化”
  12. 最好的休息,不是睡觉
  13. Git是目前世界上最先进的分布式版本控制系统(没有之一)。
  14. 计算机英语词汇mp3,【听单词】常用半导体英语词汇大全52,半导体专业英语单词MP3...
  15. Lua的多任务机制——协程(coroutine)
  16. 跑马灯效果 例子 写法 利用闭包
  17. stm32F4方向+脉冲发生器
  18. 【每周更新】OpenWrtLEDE精品软路由x86/64稳定版固件下载
  19. sqlserver 汉字转拼音(转载)
  20. EM78P468 义隆单片机 单键触控

热门文章

  1. 腾讯8分钟产品课腾讯产品心法整理
  2. 使用ElasticSearch完成百万级数据查询附近的人功能
  3. Stata: 断点回归分析 (RDD) 文献和命令
  4. 造作吧!让AirSelfie迷你无人机带你随时随地体验航拍
  5. 基于SSM的高校共享单车管理系统【数据库设计、源码、开题报告】
  6. 嵌入式开发第二阶段,系统编程
  7. Ubuntu 16.04 桌面壁纸问题解决
  8. hadoop集群配置记录
  9. 大学物理 波动光学 思维导图总结
  10. 荣耀x10max支持鸿蒙,根河收购荣耀X10Max摄像头侧键卡托耳机