之前寫的介紹
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 的介面。

[2017/06/20]
這次改版內容比較大,距離第一個雛形版本也有 2 年了,第一次維護與改進一個小程式這麼久,覺得很特別。

  1. 調整通訊封包格式,去除 sequence number 功能,改為 parameter 功能,最小長度 8-byte,最大長度 256-byte。
  2. 重新改善接收封包方法,比起改版前約增加 10% 速度,傳最小封包約 3KHz。
  3. MATLAB 端簡化設定,自動判別封包的資料長度與種類。
  4. 加入雙向通訊功能,已與微控制器相互驗證。
  5. 完善封包更新頻率估算功能,原本必須要傳時間資訊至電腦,目前亦可以僅透過系統時間做估算。

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

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

YOUTUBE DEMO 影片

傳輸的封包格式定義如下

  • kSerial packet format
byte 1 byte 2 byte 3 byte 4 byte 5 byte 6 ...   byte L - 2 byte L - 1   byte L  
  HK     HS     L     T       P1     P2    ...       DN        ER         EN    
name information
HK header 'K' (75)
HS header 'S' (83)
L   total length (min 8)
T   data type
P1 parameter 1
P2 parameter 2
... ...
DN  data
ER finish '\r' (13)
EN finish '\n' (10)
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( bytes, type )
bytes = s.write( data, type )

% 延遲功能

s.delay( delay )

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

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

% 設定解算封包之接收閥值,threshold 表示收到該數目資資料才會解封包

s.setRecvThreshold( threshold )

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

[packetData, packetInfo, packetLens] = s.packetRecv()

% 依自訂定封包發送

bytes = s.packetSend();                     ->  null
bytes = s.packetSend(command);              ->  only send parameter
bytes = s.packetSend(command, data);        ->  automatic detect data type
bytes = s.packetSend(command, data, type);  ->  user define data type

% 獲取資料更新頻率,分成用系統時間計算與接收時間資訊計算

freq = s.getFreq(unit);                     ->  use system clock to calculate freq
freq = s.getFreq(index, lengrh, unit);      ->  use packet sec/msc to calculate freq

% 獲取時間,目前必須要傳送時間資訊才可以使用

time = s.getTime(index, type, unit);        ->  type ~= 0 : return total seconds
                                            ->  type  = 0 : return [min, sec, msc]

% 獲取內部暫存器接收資料與資訊

data = s.getRecordData()
data = s.getRecordInfo()

% 儲存接收資料,檔案名稱 '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