51系列、arduino、stm32系列微控制器驅動TLC5615輸出指定電壓

目錄

TLC5615簡介

TLC5615模組

51微控制器驅動

arduino驅動

stm32驅動

總結

51系列、arduino、stm32系列微控制器驅動TLC5615輸出指定電壓

TLC5615簡介

TLC5615 為美國德州儀器公司推出的產品,是具有序列介面的數模轉換器,通訊採用三線SPI協議,其輸出為電壓型,最大輸出電壓是基準電壓值的兩倍。配置簡單不需要配置過多的暫存器,僅需使用單5V的電源即可工作

TLC5615通訊時序

51系列、arduino、stm32系列微控制器驅動TLC5615輸出指定電壓

透過上方時序圖我們可以快速的編寫底層邏輯的程式,本次僅測試輸出指定的電壓因此只需要使用到CS、SCLK、DIN三個引腳的時序即可,如果只是驅動一個模組的話CS也可以直接接地,此時僅需佔用微控制器兩個IO口即可正常執行

關於通訊資料的配置

51系列、arduino、stm32系列微控制器驅動TLC5615輸出指定電壓

找到資料手冊中關於上面二進位制碼錶可以得知最後有兩位的值固定為0(因為DAC輸入鎖存器為12位的),前面十位資料決定輸出的電壓,其計算公式在右側中的OUTPUT中可以得知,大致的工作流程明確的話可以開始程式燒錄測試了

TLC5615模組

硬體方面可以參照下方引腳說明以及模組的引腳圖

51系列、arduino、stm32系列微控制器驅動TLC5615輸出指定電壓

引腳名稱

功能說明

VCC

正電源端,4。5~5。5V ,通常取 5V

GND

模擬地

AOUT

DAC 模擬電壓輸出端

REF

基準電源輸入

DIN

序列資料輸入端

SCLK

序列時鐘輸入端

CS

晶片選用通端,低電平有效

DOUT

用於級聯時的序列資料輸出端

上面有八個引腳,其中REF和DOUT可以不需要使用,看到下面這張模組原理圖可以找到幾個需要的引數

51系列、arduino、stm32系列微控制器驅動TLC5615輸出指定電壓

其中DOUT為級聯使用,目前沒用到所以不用接,原理圖中可以看到模組使用了一片LM4040的晶片給TLC5615提供了一個

2。048V

電壓的基準源,這是我們不需要外接基準源的原因,同樣的後續計算也是需要使用到2。048這個電壓值去計算的

51微控制器驅動

直接貼出完整程式碼

#include sbit CS=P1^0; //片選埠sbit CLK =P1^1; //時鐘埠sbit DIN=P1^2; //資料輸入void DA_OUTPUT(unsigned int value); //宣告輸出電壓值函式void main(void){ while(1) { DA_OUTPUT(250); }}void DA_OUTPUT(unsigned int value){ unsigned char i; //定義變數用於迴圈 value<<=6; //int型別為16位,僅需12位則去掉高4位方便取出 CS=0; //片選埠 CLK=0; /*迴圈12次取出12位寫入模組暫存器*/ for(i = 0; i < 12; i++) { DIN=(bit)(value&0x8000); //取出最高位 CLK=1; value<<=1; CLK=0; } CS=1; CLK=0; //恢復預設低電平狀態}

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位的解析度相對價效比種種方面都比較可以,以上提供了三種較為常見微控制器的驅動方式以及程式,並且可基於上述程式自行修改輸出方波,正弦波,三角波等,需要資料程式的朋友可以在下方留言或者私信郵箱,看到就會發過去,歡迎留言交流,大家互相學習互相進步!