Friday, September 8, 2017

Arduino TLC5940與伺服馬達

Arduino TLC5940與伺服馬達

TLC5940介紹


TLC5940是TI的16 channel LED驅動晶片。可以支援同時16通道的PWM灰階輸出,解析度為4096階。同時有兩種模式 12 bit (4096 Steps) Grayscale PWM Control 和 Dot Correction。

重要參數:
供應電壓:Vcc  => 3V ~ 5.5V
操作界面:Serial Data
資料傳輸速率:~30MHz
LED可驅動最大電壓:~17V
LED可驅動電流:0~60mA(Vcc < 3.6V ) 0~120mA(Vcc > 3.6V)

由於是輸出PWM,也可以拿來做PWM擴充。所以也可以拿來推Servo摟。

TLC5940 Ardunio library

在Ardunio IDE中可以透過library manager找到。而github上也有連結:

TLC5940電路接法

以下以PDIP封裝的TLC5940為例還有使用Arduino Mega2560。
TLC5940 Ardunio Mega2560
SIN(pin 26) MOSI(pin 51)
SCK(pin 25) SCLK(pin 52)
XLAT(pin 24) OC1A(pin 11)
BLANK(pin 23) OC1B(pin 12) + 1K ohm上拉電阻
GSCLK(pin 18) OC2B(pin 9)
VPRG(pin 27) VPRG(pin 50) or GND
XERR(pin 16) XERR(pin 10) or GND
SIN(pin 26) SIN(pin 51)
IREF(pin 20) 1K ohm下拉電阻
VCC(pin 21) 5V
GND(pin 22) GND

至於out0到out15的接法比較特別。
這樣即可完成Servo與TLC5940的電路。

程式部份

這部份可以直接使用範例。來做實驗。開啟方式:
Ardunio IDE-> Files-> Examples -> TLC5940 -> Servo


深入探討Ardunio TLC5940 library


  1. pinout
    pinout部份在library中的pinout中可以找到,包含各種Ardunio板子。
    這些腳位是不能隨便更改的,因為library使用了Arduino的硬體週邊做加速。
    EX: PWM SPI等。
  2. Serial Data
    Serial Data有兩種模式:
    1. SPI:因為Serial Data shift-in的方式其實就是SPI的MOSI和SCK腳位在做的事。
               所以透過SPI可以加速資傳輸速率。溝通方式可以在http://www.ti.com/lit/ds/symlink/tlc5940.pdf中見到。
    2. bit-bang:直接對GPIO操作(產生SCK的clock和data)來傳輸資料,只是較慢,但可以更換腳位。
  3. GSLCK XLAT與blank
    這裡是利用Ardunio的硬體pwm(output compare pwm)來辦到的,以GSCLK為例,她產生4096*50HZ的clock(4096為解析度,50為Servo是20ms一個週期)。在透過XLAT(鎖住更新資料),blank清除GS counter。

Thursday, September 7, 2017

STM32 LCD 使用 BSP 與STM32CubeMX

STM32 LCD 使用 BSP 與STM32CubeMX


本文以STM32F469NI Discovery為範例。目標是以STM32F469的BSP lib操作STM32F469 Discovery的TFT-LCD。

STM32CubeMX configuration

先將周邊開啟如以下設定。

LTDC : LCD-TFT Display Controller,硬體優化的LCD控制介面。
DSIHOST: Display Serial Interface Host,由MIPI alliance建立的行動顯示protocol。提供高速的LCD framrate。
DMA2D : Chrom-Art Accelerator™ 用來做圖像操作的DMA,可以做出限定範圍的填滿等記憶體操作。適用AHB bus,可以將結果導入AHB slave端(DSI HOST)。
RCC : LTDC , DSI HOST需要時序。
I2C : 觸控需要。(stm32f469_discovery.c需要I2C)。
FMC : 用BSP時可以選擇使用SDRAM存儲資料。


時脈控制,由於開啟HSE,所以DSI有了clock source。(這部分要注意STM32CubeMX產生出來的程式碼是否會讓clock超過硬體限制)。
選擇RGB565為color mode。
Pixel format選用ARGB8888。


引入Driver

在專案資料夾下的Drivers/BSP/Components/otm8009a 中,將該路徑下的otm8009a.c 加入keil專案。otm8009a為STM32F469_Discovery上的觸控顯示螢幕。
在專案資料夾下的Drivers/BSP/STM32469I_Discovey中,將該路徑下的stm32469i_discovery.c、stm32469i_discovery_lcd.c、stm32469i_sdram.c加入keil專案中。
去下載STM32CubeMX STM32F4 firmware link: http://www.st.com/content/st_com/en/products/embedded-software/mcus-embedded-software/stm32-embedded-software/stm32cube-embedded-software/stm32cubef4.html
解開來,將Utilities資料夾放入project根目錄。

新增好的檔案架構如下。
在options for target -> C/C++ -> include path中加入那兩個資料夾。如下:

程式撰寫

main.c中include "stm32469i_discovery_lcd.h"
其中的初始流程為:

  1. 初始化LCD =>以BSP_LCD_Init()
  2. 選擇LCD layer => BSP_LCD_SelectLayer()
  3. 啟動LCD => BSP_LCD_DisplayOn()
剩下繪製部分所提供的函式都在stm32469_discovery_lcd.h中。
不過功能僅有基本。

成果


Monday, September 4, 2017

STM32CubeMX初探

STM32CubeMX初探

STM32CubeMX是code generator(程式碼產生器),與Microchip code configurator一樣。目標是用圖形化方式規劃MCU的外部模組與內部Middlewares設定。我個人覺得使用STM32cubeMX可以讓整個開發更加"工程化",產生的專案會更有組織。

一、安裝與更新

安裝網址如下:http://www.st.com/en/development-tools/stm32cubemx.html

下載完成後,桌面會產生兩個icon,一個是STM32CubeMX,一個是STM32CubeUpdater。
開啟STM32CubeUpdater,選擇所需的STM32系列library,即可完成相依library建設。更新也是透過此工具。

二、基本使用(以STM32F469NI_Discovery為範例)

開啟STM32CubeMX,選擇New Project->選擇晶片或是開發版即可進入。如下圖畫面。

# pinout


左邊為周邊模組(peripheral)綠色為已經啟用。左邊為腳位設定(綠色為已規劃,橘色為開發版已經硬體連接的腳位但未啟用)。左鍵點選腳位可以開啟小選單選擇所需腳位定義。
透過上方tab進入進階規劃。

#Clock Configuration

這個tab將STM32的所有時序和PLL、prescaler列出整理成流。
幾乎所有設定都可以修改。後方藍色框框中可以直接鍵入所需Clock值,系統會幫你調整整個流。當然有硬體限制,STM32cubeMX會提醒你,當你出現錯誤設定會有警示。


#Configuration

這個tab將前面所開啟的周邊模組列出,每個都可點選以進階設定。更詳細的設定之後文章會介紹。

#power consumption calculator

這個tab可以幫助計算能源消耗,還可以計算各個環境下的情況(就是把datasheet後面的數據列出),不過無法計算開發版的能源消耗,僅限晶片本身。

# project Settings

點選上方menu->Project->Project Settings,開啟以下專案設定。
基本上就按照環境選了。不過這裏特別提一個選項,我覺得對後續開發很以幫助。
紅框中選項可以將周邊裝置的初始化函式(以MX_為前綴的函式)產生成獨立的.c/.h配對,避免全部Init函式都在main中,造成main function很肥大,而且當你有多個source檔(並非主要程序都集中在main.c)時,可以讓其他函式更方便引用這些初始程序。


#產生Project與報告

紅框中這兩個東西可以產生Project 與報告。

#結果與檔案樹(以ARM MDK keil為例)


User裡面是初始化函式和main.c。可以發現main.c中有一堆USER code begin和USER code end的註解,這些註解是希望user將自己的code加入其中,因為如果要重新使用STM32CubeMX產生code到同一專案時,可以確保user code不會被覆蓋。

Drivers/STM32F_4xx_HAL_Driver是STM官方在推的HAL函式庫,現在的主流,這部分引用都是由STM32CubeMX完成,其中若是想要自行開啟周邊模組,可以在這個資料夾中的stm32f4xx_hal_conf.h中解除註解或新增註解(外面檔案樹的Inc中)。若有新增模組需要手動將該周邊的HAL的.c新增進專案中。

# 小結

STM32CubeMX的有點是可以讓開發工程化,開發速度加快,可以用高層級的方式思考整個系統架構,而且不用去一直翻閱datasheet(最好還是要了解整個周邊的架構與使用)。

缺點是一些官方套件,例如:STemWin和BSP要自行新增進入專案中,有點可惜。

精選文章

使用Ardunio Atmega2560 連接 nRF24L01+

使用Ardunio Atmega2560 連接 nRF24L01+ 關於library 目前主流有 https://github.com/maniacbug/RF24 與 https://github.com/TMRh20/RF24 這兩個。 其中TMRh20大大做...