目的:以 ADC 模組為基礎,設計一個簡易示波器觀察訊號變化,同時能記錄每筆資料以便數值分析。
設計:使用 STM32 系列晶片內的 ADC 模組,將類比訊號轉換成數位資料,然後將整筆數據從網路傳送到 PC 端,再由 PC 程式接收後繪製成曲線圖。開發過程,利用前面一文「以 STM32 晶片的 DAC 為架構設計一個訊號產生器」
所產生的方波當做待測訊號源,此訊號源輸入到 ADC 接腳,如下圖一所示。
 |
圖一:設計完整示波器的方塊圖 |
下圖是程式碼設定 ADC 的參數,第一個要先設定 ADC 取樣率的刻度,再來設定取樣率,如下面紅線標示。取樣率跟晶片的 operating clock 有關,從系統的高速時脈降頻到 ADC 的取樣率。第二個是選定 ADC 轉換資料的精密度,精密度越高,資料量則越大。最後,設定 ADC 轉換完畢後產生中斷通知 CPU,每次 ADC 轉換資料後,中斷的 IRQ 便會把數值從暫存器搬到記憶體裡。在設計裡,我們宣告兩塊 buffer 存放數值。
 |
圖二:ADC 參數設定 |
下圖是在 PC 端寫一個網路接收資料的程式,並把資料繪製成曲線圖。當 ADC 取樣率為 15.2KHz時,從PC端看到的圖形比較像弦波,當我把 ADC 取樣率提高為 48KHz 時,PC端看到的圖形就像一個方波了。不過,取樣率高低對設計來說是一項架構問題,取樣率越高,代表資料量越高,傳輸速率越大,所需要的網路頻寬要夠,還要晶片的CPU有足夠的效能才行。
 |
圖三-1:ADC 取樣率 15.2K 所顯示的方波 |
 |
圖三-2:ADC 取樣率為 48K 所顯示的方波 |
問題:DMA資料搬運過程不穩定,當取樣率越高的時候,DMA搬運出現資料錯亂的情況。將這個問題放到 StackOverflow 網站尋求解答,連結如下「ADC 與 DMA 資料搬運的問題」。所以,在上面的測試過程,我們都採用 ADC 中斷的方式搬運資料到記憶體,而不是 DMA。
漢亞科技 Han-Ya 發表在 痞客邦 留言(0) 人氣(417)
目的:產生方波或正弦波的訊號
設計:以 STM32 系列內建的 DAC 模組為架構,搭配內部的 Timer 當做取樣率,讓 DAC 輸出週期性訊號。
我們設計訊號產生器靠 DAC 模組將數值轉換成類比訊號,接著產生一個週期性訊號需要使用 Timer,利用它產生的 event 通知我們產生一個訊號數值,簡單說就是一個取樣點,而取樣率就是 Timer 的參數設置。這裡會有個效能的問題,如果取樣速率越高,那麼系統核心每次要 DAC 轉換數值的頻率就會增加,這會占用到系統 CPU 的運算時間。因此,DAC 需要配合 DMA 模組以達到系統效能。
圖一所示為上述三個模組的運作流程圖,第一步 Timer 產生取樣點的事件,驅動第二步的 DAC 模組,因為設定 DAC 與 DMA 搭配合作,第三步 DAC 會對 DMA 發出一個請求,要求 DMA 將波形訊號數值搬到 DAC 暫存器裡面,最後 DMA 執行這個請求。
 |
圖一:STM32 DAC 運作的流程圖 |
圖二和圖三所示為程式碼的說明,首先要宣告一塊記憶體存放波形資料,這陣列代表一個波形的完整週期。接著,我們要初始化 Timer、DAC、DMA 模組,Timer 設定取樣率,DMA 和 DAC 要設定資料搬運的位址與長度。設計到這裡,比較困難的地方在怎麼計算適當的取樣率,它會影響到波形的週期大小。我們以 STM32F207 晶片為例,Timer 模組的 clock 是 60MHz,當 TIM_Period 設定為 500 時,每個取樣點產生的頻率為 120KHz = 60MHz/500,再來看一個完整波形的週期需要 30 個取樣點,所以這個波形頻率為 4KHz = 120KHz/30,其週期為 250us。程式在 STM32F207 板卡上運行的結果顯示在最後一張圖。
 |
圖二:波形資料的定義 |
 |
圖三:每個模組參數的初始化 |
漢亞科技 Han-Ya 發表在 痞客邦 留言(0) 人氣(241)

最近遇上一個問題,工業儀器設備越來越多採用USB介面取代RS-232,造成原本RS-232設備無法對接。就介面標準來看,在工業使用上 RS-232 是點對點的通訊協定,沒有主從分別的傳輸介面,傳輸距離數十公尺遠,如果再轉成 RS-485 傳輸距離更遠。相對於USB,具有主從架構的傳輸介面,因為來自電腦介面的標準,傳輸線距離僅數公尺遠。然而,坊間看到的 USB To RS232 轉換線只是 USB slave,必須接到電腦 (USB host),這種傳輸線無法直接接 USB儀器 (USB slave),所以我先要找到一個 USB host 轉換中介,再寫一個轉換程式後,才能把 USB儀器的數據轉到 RS-232 設備上。
漢亞科技 Han-Ya 發表在 痞客邦 留言(0) 人氣(40)

語音合成和語音辨識的技術存在數十年,不過近年來將這語音的技術應用在蘋果的Siri和亞馬遜的echo設備裡。對開發者而言,語音技術最麻煩的是各種語言、不特定人的字庫辭庫訓練,光要建立這龐大且精準的訓練庫就不是短時間能完成的。最近,發現百度(Baidu)提供中文語音合成和語音辨識的服務,網站如下:AI開放平台,裡面不只有語音技術服務,還有其他技術。調用百度各項技術的SDK,建立網路連結後,連上AI開放平台,便能取得合成的結果或者辨識的結果。另外,SDK也有提供各種程式語法的範例,如:Java、C++、C#、Python、Node.js ... 等等,以滿足各類程式開發者的需求。底下我以Python語法為例,開發一個中文語音合成+語音辨識的測試程式。
漢亞科技 Han-Ya 發表在 痞客邦 留言(0) 人氣(48)
最近從網上買了兩個Arduino MKRWAN,屬於LoRa開發板的一種,可以拿來研究物聯網的通訊傳輸,一個用來當發送端,另一個用來當接收端。首先瞭解開發板的架構,Arduino MKR WAN 1300開發板是由ATMEL SAMD晶片,再搭配 LoRa 模組所組成,系統方塊圖如下所示。
在下圖的左邊,ATMEL SAMD就是Arduino Zero開發板的控制器,以Cortex-M0為核心的晶片。而在下圖的右邊,LoRa模組是由Murata公司製作的通訊模組,該模組內部包含一顆STM32L系列的控制器和一顆SX1276 LoRa晶片。在市面上容易買到單獨SX1276/78晶片的LoRa模組,這種必須仔細了解SX1276內部暫存器的設定才能順利開發與運用。另外,也有一類模組還包含一顆控制器,通常這種模組是用 AT command 方式來控制 LoRa 傳輸,很多複雜的控制命令已經被封裝成 AT 指令了,對初次接觸LoRa開發的人來說會方便許多。

|
Arduino MKRWAN 1300 方塊圖
|
漢亞科技 Han-Ya 發表在 痞客邦 留言(0) 人氣(75)
系統架構:由環境監測元件和運算控制元件所組成的硬體,如圖一所示,再搭配流程控制軟體組成一個完整的系統。每個環境監測元件透過無線網路的方式連接到運算控制元件,將每處環境的數值傳給運算元件,再由運算元件計算出最佳的環境狀態,進而控制電力、空調或風扇…等周邊系統。漢亞科技 Han-Ya 發表在 痞客邦 留言(0) 人氣(89)

最近實現在 STM32F207 控制器 (ARM-based) 上面實現一個簡易型的 FTP server,其目的是為了文件的傳輸。原本在一般電腦上的 FTP 是一個再平常不過的網路功能,但是在 embedded system 上如果沒有搭配 Linux 作業系統,通常要自行開發 FTP 才行。圖一所示就是 STM32F207 控制器,上面有網路介面和 SD 卡,我們希望從遠端能將儲存在 SD 卡上的文檔經由網路下載,而這個 SD 卡就類似硬碟的功能。
漢亞科技 Han-Ya 發表在 痞客邦 留言(0) 人氣(286)
語音播放器應用在停車場系統、音樂鈴、語音導航...等等。
之前曾使用過一款語音IC -(新唐的 ISD15100 系列)- 單晶片內建 FLASH,可以儲存語音資料且音源輸入出的功能齊全,可說非常便利。後來,筆者發現 WT588D 語音模組的價格更為親民 (大約50~100 TWB 與儲存容量大小有關),而且從網上零售採購非常容易,這是開發者的福音。 漢亞科技 Han-Ya 發表在 痞客邦 留言(0) 人氣(248)

最近用 Microchip dsPIC30F4011 的開發板 (APP020 PLUS) 結合藍芽模組,如下圖所示,打算做一個馬達控制的顯示器。之前,接觸的 MCU 都是 STM32 和 NXP LPC 以 ARM 為核心的 32-bit 控制器。有機會首次使用 Microchip 的控制器,於是查詢了一下才了解 Microchip 發展很久了,過去主要以 8-bit 或 16-bit MCU 為主,目前也有 32-bit MCU。搜尋的過程中,大多數找到 8/16 bit 的資料是10年前的,這跟市場主流控制器是 32-bit 有關吧。dsPIC30F4011 系列晶片與 PIC 系列不同的地方在於一個核心有 DSP 運算指令,一個則無。目前使用的這顆 dsPIC30 相當於 ARM M0 等級的控制器,不過價格上,似乎 dsPIC30 比較貴,這就視使用者的應用而決定了。
漢亞科技 Han-Ya 發表在 痞客邦 留言(0) 人氣(211)
前陣子在開發安卓系統的 SIP 撥號功能 (參考 "
SIP Voip 在 Android 系統上的開發" 一文),底層 NDK 設計與編譯大致完成,接下來要設計使用者頁面。首先,必須在腦海中約略規劃一個使用者頁面的雛形,再根據這個雛形設計一個符合 Android 系統的 layout。我們可以思考整個頁面該如何的布局,是垂直型排列或者水平的排列?還是類似表格式的布局?
就布局而言,安卓系統的 Layout 分成三大類型,分別是
LinearLayout、RelativeLayout 和
TableLayout。LinearLayout 顧名思義就是內部 Widget 元件必須是直線布局,直線的排列可分為垂直或水平 (這裡可沒有斜線喔!)。RelativeLayout 是指內部的元件屬於不規則型的布局方式,每個元件彼此間靠著相對位置來排列。TableLayout 是指元件排列方式屬於表格類型,由幾行幾列所組成。
使用者頁面可以由上述三種類型混合搭配設計而成,每個大 layout 裡面又可以由小的 layout 組成,類似一種巢狀的架構。用例子說明更容易明白,圖一的左邊所示是一個撥號頁面的使用者介面,圖一的右邊所示則為頁面的布局概念圖。這個 APP 頁面布局是由一個具有垂直排列的大型 LinearLayout 構成,裡面再包含四個小型 layout。由於是垂直排列,所以裡面這四個子 layout 從上到下依序排列。第一個子布局是具有水平排列的 LinearLayout,因此裡面的 Widget 元件由左到右排列。接著底下的子布局有四個方向鍵和兩個按鈕,因為不具有垂直或水平排列的特質,只能用 RelativeLayout 來規劃這六個按鈕的相關位置。撥號盤的排列像是表格 4 x 4 的布局,所以這裡用 TableLayout 很適合。最底下四個按鈕呈現水平排列則使用 LinearLayout 布局。

漢亞科技 Han-Ya 發表在 痞客邦 留言(0) 人氣(26)