目錄
TLC5615簡介
TLC5615模組
51微控制器驅動
arduino驅動
stm32驅動
總結
TLC5615簡介
TLC5615 為美國德州儀器公司推出的產品,是具有序列介面的數模轉換器,通訊採用三線SPI協議,其輸出為電壓型,最大輸出電壓是基準電壓值的兩倍。配置簡單不需要配置過多的暫存器,僅需使用單5V的電源即可工作
TLC5615通訊時序
透過上方時序圖我們可以快速的編寫底層邏輯的程式,本次僅測試輸出指定的電壓因此只需要使用到CS、SCLK、DIN三個引腳的時序即可,如果只是驅動一個模組的話CS也可以直接接地,此時僅需佔用微控制器兩個IO口即可正常執行
關於通訊資料的配置
找到資料手冊中關於上面二進位制碼錶可以得知最後有兩位的值固定為0(因為DAC輸入鎖存器為12位的),前面十位資料決定輸出的電壓,其計算公式在右側中的OUTPUT中可以得知,大致的工作流程明確的話可以開始程式燒錄測試了
TLC5615模組
硬體方面可以參照下方引腳說明以及模組的引腳圖
引腳名稱
功能說明
VCC
正電源端,4。5~5。5V ,通常取 5V
GND
模擬地
AOUT
DAC 模擬電壓輸出端
REF
基準電源輸入
DIN
序列資料輸入端
SCLK
序列時鐘輸入端
CS
晶片選用通端,低電平有效
DOUT
用於級聯時的序列資料輸出端
上面有八個引腳,其中REF和DOUT可以不需要使用,看到下面這張模組原理圖可以找到幾個需要的引數
其中DOUT為級聯使用,目前沒用到所以不用接,原理圖中可以看到模組使用了一片LM4040的晶片給TLC5615提供了一個
2。048V
電壓的基準源,這是我們不需要外接基準源的原因,同樣的後續計算也是需要使用到2。048這個電壓值去計算的
51微控制器驅動
直接貼出完整程式碼
#include
51的程式碼較為簡短,頂部使用
sbit
定義為使用的埠,簡單明瞭也易於修改,後面有定義一個函式
void DA_OUTPUT(unsigned int value);
在這個函式中輸入引數呼叫會直接改變模組輸出的電壓大小,其對應電壓關係為輸出電壓
Vout = 2Vref*value/1024
,其中
value
為我們在函式中輸入的值,
Vref
為基準電壓
2。048
,計算得出的
Vout
為
Aout
埠輸出的電壓大小
簡化後我們需要輸出電壓
Vout
時需要輸入的函式值為
Vout/0。004
即
Vout*250
,如果我們需要讓TLC5615模組輸出1V電壓,那麼需要在函式中加入引數250即可,有興趣的朋友也可以對函式進行最佳化
預設接線可參照下表
51微控制器
TLC5615
5V
VCC
GND
GND
P1。0
CS
P1。1
CLK
P1。2
DIN
需要程式碼可在下方留言郵箱或者私信郵箱
arduino驅動
arduino驅動有大量的庫可以呼叫可以使開發人員節約大量的時間,這裡我們同樣使用呼叫庫的方式去驅動,直接貼出原始碼
#include “TLC5615。h”TLC5615 TLC5615(2,3,4); //CS——->2 CLK——->3 DIN——->4void setup() { // put your setup code here, to run once: TLC5615。begin();}void loop() { // put your main code here, to run repeatedly: TLC5615。DA_OUTPUT(500);}
上面同樣的呼叫了庫中的幾個函式去實現指定電壓輸出的功能,與51微控制器類似的使用放大,我在庫中寫了一個功能相同的函式
void DA_OUTPUT(uint16_t value);
去供使用者使用
使用起來僅需編寫四段程式碼即可實現固定電壓輸出(loop是自己生成的),使用前記得新增庫,需要庫或者資料可在下方留言郵箱或者私信郵箱
程式碼段
TLC5615 TLC5615(2,3,4);
聲明瞭TLC5615物件,名稱可自定義,後面新增的引數
2
,
3
,
4
分別代表了模組使用的
CS
、
CLK
和
DIN
埠,同樣可根據需要自行修改定義
TLC5615。begin();
函式用於初始化前面定義的TLC5615使用的埠
函式
TLC5615。DA_OUTPUT(500);
用於控制
AOUT
埠輸出的電壓值,即輸入的值value=
Vout
*250,具體計算過程可以參照前面51微控制器驅動部分
接下來燒錄程式接好線之後即可測量對應輸出電壓是否對應,具體接線可參照下表
arduino
TLC5615
5V
VCC
GND
GND
2
CS
3
CLK
4
DIN
stm32驅動
stm32的程式碼相對來說要複雜一點,這裡我就直接貼出main。c中的程式碼,使用微控制器型號STM32F103C8系列,需要完整工程可在下方留言郵箱或者私信郵箱
#include “pbdata。h”#include“stm32f10x。h”#define CS_1 GPIO_SetBits(Pin_group,CS_Pin)#define CS_0 GPIO_ResetBits(Pin_group,CS_Pin)#define CLK_1 GPIO_SetBits(Pin_group,CLK_Pin)#define CLK_0 GPIO_ResetBits(Pin_group,CLK_Pin)#define DIN_1 GPIO_SetBits(Pin_group,DIN_Pin)#define DIN_0 GPIO_ResetBits(Pin_group,DIN_Pin)/*定義使用引腳*/#define CS_Pin GPIO_Pin_6#define CLK_Pin GPIO_Pin_7#define DIN_Pin GPIO_Pin_8/*定義引腳所在組*/#define Pin_group GPIOB/*定義使用的時鐘*/#define Pin_RCC RCC_APB2Periph_GPIOBvoid GPIO_init(GPIO_TypeDef*GPIOx,u16 GPIO_Pin,GPIOMode_TypeDef Mode){ GPIO_InitTypeDef GPIO_InitStruct;//宣告一個管腳初始化的結構體 GPIO_InitStruct。GPIO_Mode=Mode; GPIO_InitStruct。GPIO_Pin=GPIO_Pin; GPIO_InitStruct。GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStruct);}void DA_OUTPUT(uint16_t value){ uint8_t i; value<<=6; CS_0;CLK_0; for(i = 0; i < 12; i++) { if(value&0x8000) { DIN_1; } else { DIN_0; } CLK_1; value<<=1; CLK_0; } CS_1;CLK_0;}int main(void){ RCC_APB2PeriphClockCmd(Pin_RCC,ENABLE); GPIO_init(Pin_group,CS_Pin|CLK_Pin|DIN_Pin,GPIO_Mode_Out_PP); CS_1;CLK_0;DIN_0; while(1) { DA_OUTPUT(500); }}
裡面控制連線TLC5615的引腳的程式碼如下
/*定義使用引腳*/
#define CS_Pin GPIO_Pin_6#define CLK_Pin GPIO_Pin_7#define DIN_Pin GPIO_Pin_8/*定義引腳所在組*/#define Pin_group GPIOB/*定義使用的時鐘*/#define Pin_RCC RCC_APB2Periph_GPIOB
分別控制引腳,引腳所在的GPIO組和時鐘,其他的沒有太多需要注意的,裡面的輸出函式
void DA_OUTPUT(uint16_t value)
功能如上述51微控制器或者arduino驅動中講述的功能完全相同
需要一直到stm32F4或者其他時鐘速度更快的微控制器需要注意的是驅動時序可能會需要增加延時,根據手冊時序看當速度達到
50ns
或者更小時可能無法正常驅動
預設接線可參照下表
STM32F1
TLC5615
5V
VCC
GND
GND
PB6
CS
PB7
CLK
PB8
DIN
總結
TLC5615為時序簡單的ADC器件,使用簡單,易操作,也具有10位的解析度相對價效比種種方面都比較可以,以上提供了三種較為常見微控制器的驅動方式以及程式,並且可基於上述程式自行修改輸出方波,正弦波,三角波等,需要資料程式的朋友可以在下方留言或者私信郵箱,看到就會發過去,歡迎留言交流,大家互相學習互相進步!