打印
[其他ST产品]

STM32连接TLC7528驱动

[复制链接]
648|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
TLC7528C, TLC7528E和TLC75281是双路、8位数字-模拟转换器,它们设计成具有单独的片内数据锁存器,其特点包括非常紧密的DAC至DAC (DAC-to-DAC) 一致性。数据通过公共8位输入口传送至两个DAC数据锁存器的任一个。控制输入端DACA/DACB决定哪一个DAC被装载。这些器件的装载周期与随机存取存储器的写周期类似,能方便地与大多数通用微处理器总线和输出端口相接口。分段(segmenting)高阶位可以使最高有效位变化期间内的闪变为最小,该变化期间内的闪变脉冲通常是最强的。




使用特权

评论回复
评论
原来是wjc 2022-12-27 16:06 回复TA
———————————————— 版权声明:本文为CSDN博主「霍格沃兹在逃Coder」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/sinat_24880087/article/details/107528809 
沙发
原来是wjc|  楼主 | 2022-12-27 16:07 | 只看该作者
TLC7528通过数据总线、CS、WR以及DACA与DACB等控制信号与微处理器接口。当CS和WR均为低电平时,TLC7528模拟输出将对DB0-DB7数据总线输进数据做出响应。在此方式下,TLC7528的输入锁存器是透明的,从DB0-DB7数据总线输入的数据将直接影响TLC7528模拟输出。当CS或WR信号变为高电平时,DB0-DB7数据总线输入端上的数据被锁存,直至CS和WR信号再次变低为止。当CS为高电平时,不管WR的信号状态如何,DB0-DB7数据总线将为高阻状态,禁止输入数据。

使用特权

评论回复
板凳
原来是wjc|  楼主 | 2022-12-27 16:08 | 只看该作者
当TLC7528工作电压为5V时,其数字输入与TTL电平和CMOS电平兼容。但工作电压超过5V时,其数字输入只与CMOS电平兼容。

使用特权

评论回复
地板
原来是wjc|  楼主 | 2022-12-27 16:08 | 只看该作者
表格是TLC7528的工作方式选择,根据引脚的电平可以选择不同的工作方式。

使用特权

评论回复
5
原来是wjc|  楼主 | 2022-12-27 16:10 | 只看该作者
TLC7528的时序图如下

使用特权

评论回复
6
原来是wjc|  楼主 | 2022-12-27 16:12 | 只看该作者
原理图引脚:

使用特权

评论回复
7
原来是wjc|  楼主 | 2022-12-27 16:13 | 只看该作者

使用特权

评论回复
8
原来是wjc|  楼主 | 2022-12-27 16:14 | 只看该作者
PB5 —— DA_A/B —— DAC选择通道
PB4 —— DA_WR —— DAC读写
PB3 —— DA_CS —— DAC片选
PD2 —— DA_D0
PC12 —— DA_D1
PC11 —— DA_D2
PC10 —— DA_D3
PB9 —— DA_D4
PB8 —— DA_D5
PB7 —— DA_D6
PB6 —— DA_D7

使用特权

评论回复
9
原来是wjc|  楼主 | 2022-12-27 16:28 | 只看该作者
需要的头文件自己根据需要添加
TLC7528.h
//tlc7528.h
#ifndef  _TLC7528_H
#define  _TLC7528_H
#include "stm32f10x.h"

/*波形控制 TLC7528数据位相关宏定义*/
#define   BIT0_1                  GPIO_SetBits(GPIOC,GPIO_Pin_0);//PD2  DA D0
#define   BIT0_0                  GPIO_ResetBits(GPIOC,GPIO_Pin_0);

#define   BIT1_1                  GPIO_SetBits(GPIOC,GPIO_Pin_1);//PC12 DA D1
#define   BIT1_0                  GPIO_ResetBits(GPIOC,GPIO_Pin_1);

#define   BIT2_1                  GPIO_SetBits(GPIOC,GPIO_Pin_2);//PC11  DA D2
#define   BIT2_0                  GPIO_ResetBits(GPIOC,GPIO_Pin_2);

#define   BIT3_1                  GPIO_SetBits(GPIOC,GPIO_Pin_3);//PC10 DA D3
#define   BIT3_0                  GPIO_ResetBits(GPIOC,GPIO_Pin_3);

#define   BIT4_1                  GPIO_SetBits(GPIOB,GPIO_Pin_9);//PB9 DA D4
#define   BIT4_0                  GPIO_ResetBits(GPIOB,GPIO_Pin_9);

#define   BIT5_1                  GPIO_SetBits(GPIOB,GPIO_Pin_8);//PB8 DA D5
#define   BIT5_0                  GPIO_ResetBits(GPIOB,GPIO_Pin_8);

#define   BIT6_1                  GPIO_SetBits(GPIOB,GPIO_Pin_7);//PB7 DA D6
#define   BIT6_0                  GPIO_ResetBits(GPIOB,GPIO_Pin_7);

#define   BIT7_1                  GPIO_SetBits(GPIOB,GPIO_Pin_6);//PB6 DA D7
#define   BIT7_0                  GPIO_ResetBits(GPIOB,GPIO_Pin_6);

/*波形控制 TLC7528写相关宏定义*/
#define   TLC7528_WRITE_ON_1                 GPIO_ResetBits(GPIOB,GPIO_Pin_4);//PB4 DA_WR DAC写使能
#define   TLC7528_WRITE_OFF_1                 GPIO_SetBits(GPIOB,GPIO_Pin_4);//
/*波形控制 TLC7528写相关宏定义*/
#define   TLC7528_CS_ON_1                    GPIO_ResetBits(GPIOB,GPIO_Pin_3);//PB3 DA_CS DAC片选
#define   TLC7528_CS_OFF_1                    GPIO_SetBits(GPIOB,GPIO_Pin_3);

#define   TLC_MUTE_OPEN()          GPIO_ResetBits(GPIOA,GPIO_Pin_12);//静音模式  波形输出打开
#define   TLC_MUTE_CLOSE()         GPIO_SetBits(GPIOA,GPIO_Pin_12);  //静音模式  波形输出关闭

/*波形控制 TLC7528 DACB/DACA控制 相关宏定义*/
#define   PDACA_0              GPIO_ResetBits(GPIOB,GPIO_Pin_5);//PB5  DA_A/B DAC通道选择
#define   PDACB_1                  GPIO_SetBits(GPIOB,GPIO_Pin_5);

void TLC7528_GPIO_Config(void);
void TLC7528_WriteA(u8 TL7528_data);
void TLC7528_WriteB(u8 TL7528_data);


#endif

使用特权

评论回复
10
原来是wjc|  楼主 | 2022-12-27 16:29 | 只看该作者
TLC7528.c
//tlc7528.c
#include "TLC7528.h"
/****************************************************
函数名:TLC7528_GPIO_Config
形参: 无
返回值:无
函数功能:TLC7528 引脚配置
****************************************************/
void TLC7528_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|
                           RCC_APB2Periph_GPIOC|
                           RCC_APB2Periph_AFIO,ENABLE);
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);

    //设置PB9\PB8\PB7\PB6为普通推挽输出(波形控制)  TLC7528数据输入端(D4\D5\D6\D7)
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
    GPIO_Init(GPIOB,&GPIO_InitStructure);

    //设置PC0\PC1\PC2\PC3为普通推挽输出(强度控制)  TLC7528数据输入端(D0\D1\D2\D3)
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
    GPIO_Init(GPIOC,&GPIO_InitStructure);

    //设置PB3片选信号、PB4TLC7528写控制端    普通推挽输出(强度控制)
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;
    GPIO_Init(GPIOB,&GPIO_InitStructure);

    //设置PB5TLC7528 DACA/DACB选择端         普通推挽输出(波形控制)
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    GPIO_Init(GPIOB,&GPIO_InitStructure);
}


typedef union
{
    u8 Wave_Ctl;
    struct
    {
        u8    WaveBit_0     :1;
        u8    WaveBit_1     :1;
        u8    WaveBit_2     :1;
        u8    WaveBit_3     :1;
        u8    WaveBit_4     :1;
        u8    WaveBit_5     :1;
        u8    WaveBit_6     :1;
        u8    WaveBit_7     :1;
    } Bits;
} WaveCmd;
WaveCmd WaveCmd1;
/****************************************************
函数名:Wave_Get
形参:out_data(DA值)
返回值:无
函数功能:传递的数据转换为 TLC7528 DB0~DB7
****************************************************/
void Wave_Get(u8 out_data)
{
    u8 Wave_Output0;
    u8 Wave_Output1;
    u8 Wave_Output2;
    u8 Wave_Output3;
    u8 Wave_Output4;
    u8 Wave_Output5;
    u8 Wave_Output6;
    u8 Wave_Output7;
    WaveCmd1.Wave_Ctl =out_data;   //将波形的数值传给端口,然后信号分解
    Wave_Output0 = WaveCmd1.Bits.WaveBit_0;
    {
        if(Wave_Output0==0)
        {
            BIT0_0;
        }
        else
        {
            BIT0_1;
        }
        Wave_Output1 = WaveCmd1.Bits.WaveBit_1;
        if(Wave_Output1==0)
        {
            BIT1_0;
        }
        else
        {
            BIT1_1;
        }
        Wave_Output2 = WaveCmd1.Bits.WaveBit_2;
        if(Wave_Output2==0)
        {
            BIT2_0;
        }
        else
        {
            BIT2_1;
        }
        Wave_Output3 = WaveCmd1.Bits.WaveBit_3;
        if(Wave_Output3==0)
        {
            BIT3_0;
        }
        else
        {
            BIT3_1;
        }
        Wave_Output4 = WaveCmd1.Bits.WaveBit_4;
        if(Wave_Output4==0)
        {
            BIT4_0;
        }
        else
        {
            BIT4_1;
        }
        Wave_Output5 = WaveCmd1.Bits.WaveBit_5;
        if(Wave_Output5==0)
        {
            BIT5_0;
        }
        else
        {
            BIT5_1;
        }
        Wave_Output6 = WaveCmd1.Bits.WaveBit_6;
        if(Wave_Output6==0)
        {
            BIT6_0;
        }
        else
        {
            BIT6_1;
        }
        Wave_Output7 = WaveCmd1.Bits.WaveBit_7;
        if(Wave_Output7==0)
        {
            BIT7_0;
        }
        else
        {
            BIT7_1;
        }
    }
}
/*****************************************************
        名称:TLC7528_WriteA
        功能:向TLC7528的通道A写入数据
        输入:DA输出的值
        输出:
*****************************************************/
void TLC7528_WriteA(u8 TL7528_data)
{
    TLC7528_CS_ON_1;   //CS低电平
    PDACA_0;//通道A
    Wave_Get(TL7528_data);
    TLC7528_WRITE_ON_1;//DA_WR DAC写使能
    TLC7528_WRITE_OFF_1;//CS/WR 为高电平 D0-D7数据被锁存
//    PDACB_1;
//    TLC7528_CS_OFF_1;    //CS为高 禁止输入数据
}
/*****************************************************
        名称:TLC7528_WriteB
        功能:向TLC7528的通道B写入数据
        输入:DA输出的值
        输出:
*****************************************************/
void TLC7528_WriteB(u8 TL7528_data)
{
    TLC7528_CS_ON_1;   //CS低电平
    PDACB_1;//通道B
    Wave_Get(TL7528_data);
    TLC7528_WRITE_ON_1;
    TLC7528_WRITE_OFF_1;
//    PDACA_0;
//    TLC7528_CS_OFF_1;    //CS为高 禁止输入数据

}

使用特权

评论回复
11
hujiaqi06| | 2022-12-29 16:04 | 只看该作者

使用特权

评论回复
12
Bowclad| | 2023-1-1 17:08 | 只看该作者
兼容5v和3.3v吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

82

主题

1042

帖子

0

粉丝