IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: 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、\overline{CS}?、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__
#define __TLC5636_H__

#include "stm32f10x.h"

/* 定义GPIO端口 */
#define RCC_SCK ?? ?RCC_APB2Periph_GPIOB
#define PORT_SCK?? ?GPIOB
#define PIN_SCK?? ??? ?GPIO_Pin_13

#define RCC_DIN ?? ?RCC_APB2Periph_GPIOB
#define PORT_DIN?? ?GPIOB
#define PIN_DIN?? ??? ?GPIO_Pin_15

//#define RCC_DOUT ?? ?RCC_APB2Periph_GPIOB
//#define PORT_DOUT?? ?GPIOB
//#define PIN_DOUT?? ?GPIO_Pin_14

#define RCC_CS ?? ??? ?RCC_APB2Periph_GPIOB
#define PORT_CS?? ??? ?GPIOB
#define PIN_CS?? ??? ?GPIO_Pin_12

#define RCC_FS ? ?RCC_APB2Periph_GPIOA
#define PORT_FS ? GPIOA
#define PIN_FS ? ?GPIO_Pin_6


/* 定义口线置0和置1的宏 */
#define CS_0()?? ??? ?GPIO_ResetBits(PORT_CS, PIN_CS)
#define CS_1()?? ??? ?GPIO_SetBits(PORT_CS, PIN_CS)

#define SCK_0()?? ??? ?GPIO_ResetBits(PORT_SCK, PIN_SCK)
#define SCK_1()?? ??? ?GPIO_SetBits(PORT_SCK, PIN_SCK)

#define DI_0()?? ??? ?GPIO_ResetBits(PORT_DIN, PIN_DIN)
#define DI_1()?? ??? ?GPIO_SetBits(PORT_DIN, PIN_DIN)

#define FS_0()?? ??? ?GPIO_ResetBits(PORT_FS, PIN_FS)
#define FS_1()?? ??? ?GPIO_SetBits(PORT_FS, PIN_FS)

void tlc5636_Init(void);
void tlc5636_Send16Bit(uint16_t _data);
void tlc5636_Write2Byte(uint16_t data);
#endif
?

//tlv5636.c

#include "tlc5636.h"?
#include "SysTick.h"
#include "gpioport.h"

/*
*********************************************************************************************************
*?? ?函 数 名: tlc5636_Init
*?? ?功能说明: TLV5636的初始化
*?? ?形 ? ?参: 无
*?? ?返 回 值: 无
*********************************************************************************************************
*/?
void tlc5636_Init(void)
{
?? ?
?? ?GPIO_InitTypeDef GPIO_InitStructure;
?? ?
?? ?RCC_APB2PeriphClockCmd(RCC_SCK | RCC_DIN |RCC_FS| RCC_CS, ENABLE);
?? ?
?? ?/* 配置几个推挽输出IO */
?? ?GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;?? ??? ?/* 设为输出口 */ ?
?? ?GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;?

?? ?GPIO_InitStructure.GPIO_Pin = PIN_SCK;
?? ?GPIO_Init(PORT_SCK, &GPIO_InitStructure);//时钟引脚初始化

?? ?GPIO_InitStructure.GPIO_Pin = PIN_DIN;?? ??? ??? ?/*对于主机而言为输入,对于从机而言为输出,因此此处配置成输出*/
?? ?GPIO_Init(PORT_DIN, &GPIO_InitStructure);//MOSI引脚初始化

?? ?GPIO_InitStructure.GPIO_Pin = PIN_CS;?
?? ?GPIO_Init(PORT_CS, &GPIO_InitStructure);//CS端初始化
?? ?
?? ?GPIO_InitStructure.GPIO_Pin = PIN_FS;
?? ?GPIO_Init(PORT_FS, &GPIO_InitStructure);//FS端初始化
?? ?
?? ?SCK_0();?? ?CS_1();?? ??? ?FS_0();//空闲状态时,SCLK置0,CS置1,FS置0
}?

/*
*********************************************************************************************************
*?? ?函 数 名: TLC5636_Send16Bit
*?? ?功能说明: 向TLV5636总线发送16个bit数据。
*?? ?形 ? ?参: _data : 数据
*?? ?返 回 值: 无
*********************************************************************************************************
*/?
void tlc5636_Send16Bit(uint16_t _data)
{
?? ?uint8_t i;?
?? ?
?? ?FS_1();
?? ?delay_us(12);
?? ?FS_0();
?? ?
?? ?
?? ?for(i = 0; i < 16; i++)
?? ?{
?? ??? ?if (_data & 0x8000)
?? ??? ?{
?? ??? ??? ?DI_1();
?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?DI_0();
?? ??? ?}
?? ??? ?SCK_1();
?? ??? ?_data <<= 1;
?? ??? ?delay_us(10);
?? ?
?? ??? ?SCK_0();?? ?
?? ??? ?delay_us(10);?? ??? ?
?? ?}
}


void tlc5636_Write2Byte(uint16_t _data)
{
?? ?CS_0();
?? ?tlc5636_Send16Bit(_data);
?? ?CS_1();
//?? ?FS_1();//这条不能写,因为FS = 1,意味着数据传输完成,所以DAC芯片的输出测不到电压值。切记
?? ?
}

//main.c

#include "gpioport.h"
#include "system.h"
#include "SysTick.h"
#include "tlc5636.h"?

int main(void)
{
?? ?
?? ?RCC_HSE_Config(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
?? ?SysTick_Init(72);
?? ?LED1_Init();
?? ?
? tlc5636_Init();
?? ?tlc5636_Write2Byte(0xD003);//设置DAC得参考电压和工作模式
?? ?
?? ?
?? ?while(1)
?? ?{
?? ??? ?LED1 = 0;
?? ? ?delay_s(1);
?? ??? ?LED1 = 1;
?? ??? ?delay_s(1);
?? ??? ?
?? ? ?tlc5636_Write2Byte(0x4FFF);
?? ??? ?
?? ?}
?? ?
}

#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例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-18 10:20:30  更:2021-09-18 10:20:32 
 
开发: 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年12日历 -2024/12/30 1:06:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码