| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> STM32F103驱动DAC芯片TLV5636ID_2021.9.17 -> 正文阅读 |
|
[嵌入式]STM32F103驱动DAC芯片TLV5636ID_2021.9.17 |
DAC芯片------TLV5636ID ? ?TLV5636是一个12位电压输出的DAC芯片,它的内部控制寄存器为16位,其中高4位是控制位,后12位是DAC的数据位。可以通过写入16位数据对芯片进行配置, 一、TLV5636ID介绍。 1.封装图 ?2.各引脚意义 ?(1)DIN:串行数据的输入管脚 (2)SCLK: DAC的时钟输入管脚 (3)CS:DAC芯片的片选信号,低电平有效。 (4)FS:同步信号。 (5)AGND:模拟地 (6)REF:DAC的外部参考电压输入,可通过编程选取内部基准还是外部基准电压。 (7)OUT:DAC芯片输出电压。电压计算为 V = 2 *(data)/(2*exp(12) = 4096) (8) VDD:电源 3.内部结构电路 ? 可以看到芯片的输入为DIN、SCLK、?、FS四个信号,在其内部有一个12位的数据锁存器,用于存放输入数据,另外2位的控制参考电压锁存器和2位功率和速度控制锁存器,共同构成16位输入数据。 4.TLV5636ID的时序图 ? ? ?从数据手册上看,TLV5636ID的?最小时钟周期时间为50ns,也就是最大的时钟频率为20MHz,在编程的时候应该考虑到这个,一般SPI挂接在APB1或者APB2上,时钟周期拿STM32F103来说是72MHz/36MHz。通过对SPI设置分频系数来满足不超过20MHz的条件。 其中几个重要的时间如下: a. TwH(FS):FS信号拉高持续时间,最低为半个时钟周期。FS信号非常重要,FS的下降沿告诉DAC芯片开始数据传输。所以在开启使能后必须要使得FS信号线产生一个下降沿信号 b.Tsu(D):数据准备时间。其实相当于数据稳定时间,这个时间最小为1/6个SPI时钟周期。 d.Tsu(H):数据有效时间。这段数据可以经SPI读取最小为1/10个SPI时钟周期。 e.Tsu(c16-cs):D0被采样后的第一个上升沿到CS拉高的最小时间,最小为1/10个SPI时钟周期。 5.串行接口 ? TLV5636ID兼容3种接口如下: 各种接口协议下的连接如上图。 必须注意的是:TLV5636ID的工作必须拉低CS信号,其次要给FS信号一个下降沿,告诉数据传输开始,这样移位寄存器将数据移入(MSB,高位先移动,软件需设置成一样)锁存器中,在16个数据被采集完毕或者FS拉高后,数据将会输出到OUT端。?另外,如果是使用SPI接口时,需要对DAC芯片进行配置,所以写入的第一个数据是配置DAC的工作模式的,如果数据位宽是8位的,那么需要进行两次写操作,这个不必重复进行。配置完后可以进行正常的数据传输。 6.TLV5636ID的数据格式 ? 二、软件编程 1.流程 ? ? 根据前面的数据手册,为了方便,先用软件模拟SPI进行数据传输,硬件的还没有试。 第一步:初始化TLV5636ID,软件模拟的话就初始化个人选择的4个端口,分别代表DAC的DIN,SCLK,CS和FS信号。我选择的分别是PB15,PB13,PB12,PA6。 第二步:配置?SPI的工作模式,写入数据0xD003(外部输入基准电压),使用内部的基准电压时写入数据0xD002或者0xD000。 第三步:写入需要写入的数据。(数据时一次性的,只为了测试DAC芯片的输出功能是否正常) 2.代码 //tlv5636.h #ifndef __TLC5636_H__ #include "stm32f10x.h" /* 定义GPIO端口 */ #define RCC_DIN ?? ?RCC_APB2Periph_GPIOB //#define RCC_DOUT ?? ?RCC_APB2Periph_GPIOB #define RCC_CS ?? ??? ?RCC_APB2Periph_GPIOB #define RCC_FS ? ?RCC_APB2Periph_GPIOA
#define SCK_0()?? ??? ?GPIO_ResetBits(PORT_SCK, PIN_SCK) #define DI_0()?? ??? ?GPIO_ResetBits(PORT_DIN, PIN_DIN) #define FS_0()?? ??? ?GPIO_ResetBits(PORT_FS, PIN_FS) void tlc5636_Init(void); //tlv5636.c #include "tlc5636.h"? /* ?? ?GPIO_InitStructure.GPIO_Pin = PIN_SCK; ?? ?GPIO_InitStructure.GPIO_Pin = PIN_DIN;?? ??? ??? ?/*对于主机而言为输入,对于从机而言为输出,因此此处配置成输出*/ ?? ?GPIO_InitStructure.GPIO_Pin = PIN_CS;? /*
//main.c #include "gpioport.h" int main(void) #include "system.h"? 系统位带定义头文件 #include "SysTick" 系统定时器的头文件 至此,TLV5636软件模拟SPI驱动DAC工作程序完成 三、总结问题 1.数据手册的时序很重要以及DAC芯片的工作原理。 2.配置时的数据可以不放入到循环中,而写入的数据时,函数必须放大循环内部,让DAC芯片不断的去读取,这样输出端才能输出电压。之前老是没有电压,可能是DAC输出的电压输出后就清0了,根据他的工作原理。时间很短,所以不能测量,所以需要不停的写入。(这块后续再理解理解,感觉这样解释很勉强) |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 2:20:53- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |