之前寫的介紹
http://kitsprout.logdown.com/posts/335401

github https://github.com/Hom-Wang/MATLAB/tree/master/kSerial

[2016/09/17] MATLAB 新版本 Serial 示波器
最近一直在寫 MATLAB,用越久 MATLAB 越了解 MATLAB 的方便與強大,上研究所前對 MATLAB 的熟悉就只是高級工程計算機的概念,反而是 MATHEMATICA 還比較常用,在符號的運算與公式的推導上非常有優勢,但到了研究所後,很多的東西都要做模擬與驗證,不知不覺接觸 MATLAB 的時間就越來越多,以微控制器開發為主的我,熟悉了即時繪圖與 serial 之後更是變成一個不可或缺的工具,在電腦與微控制器之間的通訊非常簡單,後續的資料處理與分析也非常的便利

近幾個禮拜接觸了 MATLAB 上的 classdef 後,就把之前寫的 serialOscilloscope 改版了,並請重新改寫 serial 的接收封包格式,目前沒有沒有丟包的問題,更新頻率測試過鮑率 256000 下 400Hz 都沒有問題,主要受限於 MATLAB 的鮑率與微控制器的傳輸速度。

在波型顯示的部分則改用 object 與 delete 的方法,目前不會依運行時間長而導致延遲的情況,之後會嘗試加入 GUI 功能,這樣對於切換不同的資料顯示上也會方便許多

[2017/04/16]
kSerial 的設計最主要就是在 MATLAB 與微控制器之間建立一個傳輸的連結,讓微控制器可以透過 kSerial 將資料傳到 MATLAB 上做顯示與分析,並且在此基礎上可以擴充不同的應用像是波形顯示、分析等等。使用自己寫的 kSerial 也有好幾個月的時間了,中間有過不少大大小小的修改,這幾天對 kSerial 做了一些整理,之後打算再實現雙向通訊的部分以及 GUI 的介面。

現階段實現了幾種應用功能:

  1. serialPacket, 基本的資料顯示
  2. serialOscilloscope, 類示波器的資料顯示
  3. serialFFT, 頻域顯示(尚未完善)
  4. serialCube, 配合四元數的姿態顯示

YOUTUBE DEMO 影片

傳輸的封包格式定義如下

  • serial format
    byte[ 1 : 2 ] - "KS"
    byte[ 3 : 4 ] - TTTT LLLL LLLL LLLL, T : type (4 bits), L : data length (12 bits)
    byte[ 5 : L+4 ] - data * L
    byte[ L+5 : L+6 ] - sequence number
    byte[ L+7 : L+8 ] - "\r\n"
classdef kSerial.m link
% 幾種建立與初始化 kSerial 方法,port = 'COMx', 'auto', 'select', max baudRate is 256000

s = kSerial()                        [ port = 'auto', baudRate = 115200, no delete instrfindall ]
s = kSerial(baudRate)                [ port = 'auto', set baudRate, no delete instrfindall]
s = kSerial(port, baudRate)          [ set port, set baudRate, no delete instrfindall ] 
s = kSerial(baudRate, 'clear')       [ port = 'auto', delete instrfindall ]
s = kSerial(port, baudRate, 'clear') [ set port, set baudRate, delete instrfindall ]

% 開啟與關閉 kSerial 功能

s.open()
s.close()

% 讀寫 kSerial 功能

data = s.read( nByte, type )
nByte = s.write( data, type )

% 簡單的設定 kSerial 的鮑率與輸入暫存器大小

s.setInputBufferSize( bufferSize )
s.setBaudRate( baudRate )

% 依自訂定封包接收,封包資料與封包數目

[packetData, packetLens] = s.packetRecv( dataLens, dataType )

% 獲取資料更新頻率,必須要傳送時間資訊才可以使用

freq = getFreq( index, length, unit )

% 更新內部暫存器與獲取內部暫存器

updateBuffer( data, lens )
data = getBuffer()

% 儲存接收資料,檔案名稱 'NAME'_TIME

s.save2mat( name, index )

kSerialOscilloscope.m link
% 建立 kSerialOscilloscope

osc = kSerialOscilloscope()

% 設定示波器 X, Y 顯示刻度

setWindow( ymax, ymin, width )

% 設定畫板,並初始化 kSerialOscilloscope

initOscilloscope( fig )

% 顯示波形

updateOscilloscope( s )

kSerialCube.m link
% 建立 kSerialCube

cube = kSerialCube( origin, scale, window )

% 設定畫板與視角,並初始化 kSerialCube

initCube( fig, v )

% 顯示姿態

plotCube( p, q )

% 獲取尤拉角

att = getAttitude( cube, q )

Comments

comments powered by Disqus