[其他ST产品] STM32连接TLC7528驱动

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

5368063aaa75ccb29a.png


评论

———————————————— 版权声明:本文为CSDN博主「霍格沃兹在逃Coder」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/sinat_24880087/article/details/107528809  发表于 2022-12-27 16:06
 楼主| 原来是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的工作方式选择,根据引脚的电平可以选择不同的工作方式。
1657863aaa816d07df.png
 楼主| 原来是wjc 发表于 2022-12-27 16:10 | 显示全部楼层
TLC7528的时序图如下
465763aaa827a5242.png
 楼主| 原来是wjc 发表于 2022-12-27 16:12 | 显示全部楼层
原理图引脚: 4259363aaa8d951b03.png
 楼主| 原来是wjc 发表于 2022-12-27 16:13 | 显示全部楼层
 楼主| 原来是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
 楼主| 原来是wjc 发表于 2022-12-27 16:28 | 显示全部楼层
需要的头文件自己根据需要添加
TLC7528.h
  1. //tlc7528.h
  2. #ifndef  _TLC7528_H
  3. #define  _TLC7528_H
  4. #include "stm32f10x.h"

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

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

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

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

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

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

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

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

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

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

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

  33. void TLC7528_GPIO_Config(void);
  34. void TLC7528_WriteA(u8 TL7528_data);
  35. void TLC7528_WriteB(u8 TL7528_data);


  36. #endif
 楼主| 原来是wjc 发表于 2022-12-27 16:29 | 显示全部楼层
TLC7528.c
  1. //tlc7528.c
  2. #include "TLC7528.h"
  3. /****************************************************
  4. 函数名:TLC7528_GPIO_Config
  5. 形参: 无
  6. 返回值:无
  7. 函数功能:TLC7528 引脚配置
  8. ****************************************************/
  9. void TLC7528_GPIO_Config(void)
  10. {
  11.     GPIO_InitTypeDef GPIO_InitStructure;
  12.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|
  13.                            RCC_APB2Periph_GPIOC|
  14.                            RCC_APB2Periph_AFIO,ENABLE);
  15.     GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);

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

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

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

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


  31. typedef union
  32. {
  33.     u8 Wave_Ctl;
  34.     struct
  35.     {
  36.         u8    WaveBit_0     :1;
  37.         u8    WaveBit_1     :1;
  38.         u8    WaveBit_2     :1;
  39.         u8    WaveBit_3     :1;
  40.         u8    WaveBit_4     :1;
  41.         u8    WaveBit_5     :1;
  42.         u8    WaveBit_6     :1;
  43.         u8    WaveBit_7     :1;
  44.     } Bits;
  45. } WaveCmd;
  46. WaveCmd WaveCmd1;
  47. /****************************************************
  48. 函数名:Wave_Get
  49. 形参:out_data(DA值)
  50. 返回值:无
  51. 函数功能:传递的数据转换为 TLC7528 DB0~DB7
  52. ****************************************************/
  53. void Wave_Get(u8 out_data)
  54. {
  55.     u8 Wave_Output0;
  56.     u8 Wave_Output1;
  57.     u8 Wave_Output2;
  58.     u8 Wave_Output3;
  59.     u8 Wave_Output4;
  60.     u8 Wave_Output5;
  61.     u8 Wave_Output6;
  62.     u8 Wave_Output7;
  63.     WaveCmd1.Wave_Ctl =out_data;   //将波形的数值传给端口,然后信号分解
  64.     Wave_Output0 = WaveCmd1.Bits.WaveBit_0;
  65.     {
  66.         if(Wave_Output0==0)
  67.         {
  68.             BIT0_0;
  69.         }
  70.         else
  71.         {
  72.             BIT0_1;
  73.         }
  74.         Wave_Output1 = WaveCmd1.Bits.WaveBit_1;
  75.         if(Wave_Output1==0)
  76.         {
  77.             BIT1_0;
  78.         }
  79.         else
  80.         {
  81.             BIT1_1;
  82.         }
  83.         Wave_Output2 = WaveCmd1.Bits.WaveBit_2;
  84.         if(Wave_Output2==0)
  85.         {
  86.             BIT2_0;
  87.         }
  88.         else
  89.         {
  90.             BIT2_1;
  91.         }
  92.         Wave_Output3 = WaveCmd1.Bits.WaveBit_3;
  93.         if(Wave_Output3==0)
  94.         {
  95.             BIT3_0;
  96.         }
  97.         else
  98.         {
  99.             BIT3_1;
  100.         }
  101.         Wave_Output4 = WaveCmd1.Bits.WaveBit_4;
  102.         if(Wave_Output4==0)
  103.         {
  104.             BIT4_0;
  105.         }
  106.         else
  107.         {
  108.             BIT4_1;
  109.         }
  110.         Wave_Output5 = WaveCmd1.Bits.WaveBit_5;
  111.         if(Wave_Output5==0)
  112.         {
  113.             BIT5_0;
  114.         }
  115.         else
  116.         {
  117.             BIT5_1;
  118.         }
  119.         Wave_Output6 = WaveCmd1.Bits.WaveBit_6;
  120.         if(Wave_Output6==0)
  121.         {
  122.             BIT6_0;
  123.         }
  124.         else
  125.         {
  126.             BIT6_1;
  127.         }
  128.         Wave_Output7 = WaveCmd1.Bits.WaveBit_7;
  129.         if(Wave_Output7==0)
  130.         {
  131.             BIT7_0;
  132.         }
  133.         else
  134.         {
  135.             BIT7_1;
  136.         }
  137.     }
  138. }
  139. /*****************************************************
  140.         名称:TLC7528_WriteA
  141.         功能:向TLC7528的通道A写入数据
  142.         输入:DA输出的值
  143.         输出:
  144. *****************************************************/
  145. void TLC7528_WriteA(u8 TL7528_data)
  146. {
  147.     TLC7528_CS_ON_1;   //CS低电平
  148.     PDACA_0;//通道A
  149.     Wave_Get(TL7528_data);
  150.     TLC7528_WRITE_ON_1;//DA_WR DAC写使能
  151.     TLC7528_WRITE_OFF_1;//CS/WR 为高电平 D0-D7数据被锁存
  152. //    PDACB_1;
  153. //    TLC7528_CS_OFF_1;    //CS为高 禁止输入数据
  154. }
  155. /*****************************************************
  156.         名称:TLC7528_WriteB
  157.         功能:向TLC7528的通道B写入数据
  158.         输入:DA输出的值
  159.         输出:
  160. *****************************************************/
  161. void TLC7528_WriteB(u8 TL7528_data)
  162. {
  163.     TLC7528_CS_ON_1;   //CS低电平
  164.     PDACB_1;//通道B
  165.     Wave_Get(TL7528_data);
  166.     TLC7528_WRITE_ON_1;
  167.     TLC7528_WRITE_OFF_1;
  168. //    PDACA_0;
  169. //    TLC7528_CS_OFF_1;    //CS为高 禁止输入数据

  170. }

hujiaqi06 发表于 2022-12-29 16:04 | 显示全部楼层
Bowclad 发表于 2023-1-1 17:08 | 显示全部楼层
兼容5v和3.3v吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

87

主题

1250

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部