yj hung

Controller Area Network(CAN BUS) ON STM32

前言 控制器區域網路 (Controller Area Network,簡稱CAN或者CAN bus) 是一種功能豐富的車用匯流排標準。被設計用於在不需要主機(Host)的情況下,允許網路上的單晶片和儀器相互通信。 它基於訊息傳遞協定,設計之初在車輛上採用復用通信線纜,以降低銅線使用量,後來也被其他行業所使用。在碩士班論文底下有使用dsPIC30F4011(Microchip)晶片來實作CAN bus系統,如今因客戶需求開始研究起STM32 Can Bus的操作這邊會介紹接線與Can Bus範例程式等等操作 Can Bus接線 CAN 物理層的形式主要有兩種,左圖中的 CAN 通訊網路是一種遵循 ISO11898 標準的高速、短距離「閉環網路」,它的匯流排最大長度為 40m,通訊速度最高為 1Mbps,匯流排的兩端各要求有一個「120 歐」的電阻。 右圖中的是遵循 ISO11519-2 標準的低速、遠距離「開環網路」,它的最大傳輸距離為 1km,最高通訊速率為 125kbps,兩根匯流排是獨立的、不形成閉環,要求每根匯流排上各串聯有一個「2.2千歐」的電阻。 PS:這邊硬體接線請注意必加電阻與CAN transceiver ,千萬不要傻傻的MCU的Can腳位直接接出來!!!! MESSAGE TRANSFER(CAN通訊的資料格式) CAN2.0有兩種版本,CAN2.0A(Standard),CAN2.0B(Extended)。 Start of Frame(SOF):送出1位元dominant(0),用來同步。 Arbitration Field:表示節點的優先權,用來判別優先權。若多個節點同時傳送,在仲裁欄位逐一比對優先權, 位元為dominant(0)可優先傳送。長度有兩種11bits(Standard identifier)和29bits(Extended Identifier)。 RTR :為優先判斷與資料接收與否的識別 RTR=dominant(0),表資料要傳出,RTR=recessive(1),表要接收資料。 IDE: 標準格式(Standard identifier)為dominant(0);延伸格式(Extended Identifier)為 recessive(1)。 R0:保留 CAN Bus上的傳輸圖解 可以看到下圖分別有3個傳輸裝置分別是A、B、C會把資料同時放到Bus線路上這邊只要留意每個裝置傳輸時候給予微小delay時間即可避免資料傳輸重疊衝突 STM32cubeMX設置與範例程式 怎麼設定波特率呢? […]

Controller Area Network(CAN BUS) ON STM32 Read More »

ADC introduction on STM32

前言 ADC簡單說就是類比訊號轉出城數位訊號,下面有幾個基本名詞介紹 解析度:讀出的資料的長度,如8位就是最大值為255的意思,即範圍[0,255],12位就是最大值為4096,即範圍[0,4096] 通道:ADC輸入引腳,通常一個ADC控制器控制多個通道,如果需要多通道的話,就得進行每個通道掃描了 ADC的轉換方式 單次轉換,一次只轉換一個通道 連續轉換,轉換完成一個通道後立即自動執行下一個通道的轉換 掃描模式,開啟一次後,自動的連續讀取多個通道 ADC的三種工作方式 阻塞模式(查詢模式) 中斷模式 DMA模式 PS:這邊有幾點要注意ADC晶片通常有正參考電壓和負參考電壓,通常正參考電壓連線到VCC,負參考電壓連線到GND cubemx基礎配置 PS:Single-ended和Differentialt差異在於比較准位的不同 範例程式 基本上ADC的使用並不困難比照範例即可實現參考詳細篇友介紹其他高階用法,歡迎參考。一般類比的產品在控制上已經比較少見,主要在LED上可能比較常使用 參考 STM32CubeMX学习笔记(8)——ADC接口使用 STM32 ADC詳細篇(基於HAL庫)

ADC introduction on STM32 Read More »

Flash Operating on STM32 And HardFault Check

前言 近期客戶開始研究STM32G031 Flash讀寫,因客戶在寫入Flash使用官網給的Sample code然後再加入Timer 中斷後會持續跑入HardFault_Handler(),我開始研究Flash狀態與HardFault_Handler檢查程序 HardFault_Handler檢查程序 首先這邊和網路上不同使用的是STM32cudeIDE非MDK,因此網站上所建立的偵錯方法可能不完全適用。這邊先介紹會進入HardFault原因 記憶體溢位或則訪問越界。 堆疊溢位。 檢查方法 使用STM32內建檢查 單步執行尋找 使用內建檢查如下圖可以直接初步檢查問題所在,結果如下方所顯示 第二種方法是使用單步執行或設定斷點(最原始方法) Flash Operating Flash Write HAL_FLASH_Unlock() 檢查FLASH_SR 中的 BSY 位 FLASH_CR 寄存器中的 PG 位置 1 寫入 HAL_FLASH_Lock(); 官方的宣告涵式 下方是官方給的sample code Flash Read 演示結果 這邊使用STM32CubeProgrammer 去看內部Flash的數值可以看到全部寫入了12345678 注意事項 由上面演示結果來看Flash可以在指定位置寫入你要的數值,但這邊要注意可以看一下,下面圖程式執行前後內部Flash結果可以看到在一開始程式執行時候就有固定區域存有資料,因此如果把固定區域覆寫其他資料就會造成執行錯誤進入HardFault_Handler(下圖程式裡面加入Timer中斷程式因此紀錄的原始位置比起純粹的寫入還要多)這邊請參考stm32g0 reference manual P70 來把起始寫入位置做改動才能正常運行如果要單純在指定位置寫入資料請參考STM32GO中Flash充当EEPROM的操作 參考 怎么查找STM32的硬件错误HardFault_Handler? 手把手教你查詢stm32 HardFault_Handler除錯及問題方法 STM32GO中Flash充当EEPROM的操作 FLASH Programming in STM32 STM32 Flash

Flash Operating on STM32 And HardFault Check Read More »

Dual Bank Flash功能實現 ON STM32L4

前言 因Firmwave更新時我們期望原先運行的程式不會因此停止,所以這邊就要開創Dual Bank Flash的功能,一邊再下載更新Firmwave另一邊執行原先運行程式,最後再比對F/W version選擇最新的,就跳到該Bank開機 Flash 快閃記憶體,係一種EEPROM嘅形式,可以喺操作中多次擦寫嘅記憶體。呢種科技主要用喺一般性資料儲存,同埋喺電腦同其他數碼產品之間交換傳輸資料,例如記憶卡同USB手指。快閃記憶體係一種特殊嘅、以大區塊抹寫嘅EEPROM。早期嘅快閃記憶體進行一次抹除,就會清嗮全部喺晶片上嘅資料。 快閃記憶體嘅成本遠比可以位元組為單位寫入嘅EEPROM低[1],亦因為咁成為咗非揮發性固態儲存最重要亦最廣為採納嘅技術。PDA、手提電腦、數碼隨身聽、數碼相機同埋手機上都有用到快閃記憶體。另外,快閃記憶體喺遊戲主機上嘅採用亦都越嚟越多,取代咗儲存遊戲資料用嘅EEPROM或者帶有電池嘅SRAM。 雙bank IAP原理 STM32部分型號有提供雙BANK功能,簡單說就是把Flash切割成2區塊BANK1與BANK2。。當在bank1中運行app時就可以把新更新的固件寫入到bank2,寫完以後就切換到從bank2啟動運行新的app。如果當前在bank2運行就把新固件寫入bank1,寫完以後切換從bank1啟動。 如何判別與開啟Dual Bank Flash 首先在Datasheet裡面查看第一頁Memories是否存在2 bank(這邊以STM32L476/STM32L073為例),如果沒有會寫single bank Flash 開啟2 bank首先開啟STM32CubeProgrammer把下圖BFB2打勾(L476為例,L073基本上就是daul bank不用特別開啟) STM32F4 / G4 / G0 / L4 / L0  在SystemInit() 沒有重設Vector table , 當你使用Dual bank ,  並轉跳Bank之後,   產生中斷會導致系統異常 . 建議要將” USER_VECT_TAB_ADDRESS” 打開  (default 是disable) , 如此進到SystemInit()之後才會重置Vector table . what is UFB? 這是存在於SYSCFG寄存器中的一個位,它有兩個值:0或者1,功能是 0:FLASH bank1

Dual Bank Flash功能實現 ON STM32L4 Read More »

C# Using Controls.Find to control[WinForm]

前言 因在使用表格填入數字時會因為很多重復動作,就在思考有甚麼方式能夠寫成For迴圈之類形式最後真的找到使用Controls.Find,能把指定形式寫成迴圈 定義 Namespace:System.Windows.FormsAssembly:System.Windows.Forms.dll Searches for controls by their Name property and builds an array of all the controls that match. 範例設置與Coding 先使用TablelayoutPanel創建出一個表格,在把表格內填入Label並命名lbRange_Zone”X”這邊X為代表數字 範例程式 這邊先填入16格數字成200並把其變成紅色這邊一步一步來拆解解釋 Label tbx = this.Controls.Find((“lbRange_Zone” + count.ToString()), true).FirstOrDefault() as Label;這邊因為控制Label因此宣告方式是藍字部分,可以改變看要控制哪些項目做對應更動,紅字部分則是更操作的物件名稱下面就可以針對元件做控制了 參考 [WinForm]使用 Controls.Find 取得/給予控制項資料 Find control by name from Windows Forms controls

C# Using Controls.Find to control[WinForm] Read More »

C# Mouse Contrul In Visual Studio

前言 本章將講述mouse操作範例code(以下控制動作不限於在Form裡) 定義 命名空間:System.Windows.Forms組件: 表示用來繪製滑鼠指標的影像。 繼承Object->Cursor / 屬性TypeConverterAttribute / 實作IDisposableISerializable 範例code 控制滑鼠移動到某個位置 控制滑鼠點擊就需要呼叫API了,第一步是先宣告滑鼠事件API 控制滑鼠左鍵按下 控制滑鼠左鍵放開 PS: 控制滑鼠右鍵/中鍵,只要改一下MOUSEFLAG就可以了 點一下(點擊) 連點兩下 拖曳 Doma結果 按下test後鼠標會移動到下籃框位置並顯示座標,這邊第一步是先抓取textbox在畫面上的座標位置並把他先設定零點 參考 [C#] 控制滑鼠移動, 點一下, 連點兩下, 拖曳 Cursor 類別

C# Mouse Contrul In Visual Studio Read More »

C# Float and Double Convert to Hexadecimal

前言 因MCU或uDrive在傳輸給UI時Double和Float會透過IEEE754轉成16進制傳輸,因此這邊會介紹2種方法去轉成16進制與範例程式以供參考 理論 浮點數表達式是計算機內用來表示小數的方法,由IEEE規定組成格式,並用有32 bits單精度(float)與64 bits雙精度(double)的資料型態 浮點數的表達方法主要由4個參數組成,分別是正負符號、尾數(m)、基數(n)、指數(e) : 可以看到右圖,主要Float 與Double不同地方是在尾數存取與指數位精準位數不同,這邊先以Float為範例推演給各位觀看如下圖 範例程式 Double converter to Hex Float converter to Hex Hex converter to Float Hex converter to Double Doma結果 其他方法 上面為通用方法,但可以看到存取位元較多今天如果想讓存取位元較少可以參考下面範例,但有條件限制如下 * matrix format:* size: 32 bits* bit[0]: +/-* bit[7:1]: integer* bit[31:8]: decimal* max.: 127.9999999* min.: -127.9999999 Double converter to Hex Hex converter to Double gains

C# Float and Double Convert to Hexadecimal Read More »

C# Substring 定義及七種用法(分割拆解認關鍵字方法)

前言 因我們可由COM PORT接收到MCU資訊,但其資料是一串字串並未分隔。EX: 由MCU輸出”System restart \n\r” +”MCU restart ok\r\n”=>這邊C# UI接收到的會是”System restart \n\rMCU restart ok\r\n”不會切割成2句文字因此本章節會介紹如何做字串切割如下清單與確認關鍵字,方便資料讀取 從字串取得部份字串 從字串取得前面n個字元部份字串 取得部份字串從指定的 startIndex 處開始, endIndex:到指定的 endIndex處結束 取得某個字元後或前的部份字串 傳回字串第一次出現位置 取得兩字串間的部份字串 用字元分離字串再分離字串成部份字串 C#對中文字串的擷取 定義 命名空間:System組件:mscorlib.dll, netstandard.dll 從這個執行個體擷取子字串。 這個成員是多載的。 如需這個成員的完整資訊,包含語法、使用方式和範例,請按一下多載清單中的名稱。 程式範例 C# String.Substring 方法 在C#跟.NET中,字串可以用字串型別來表示,String.Substring方法是C#裡從字串的執行個體擷取部份字串,這個方法有兩個多載的方式: Substring(Int32):從字串執行個體擷取部份字串。 部份字串會在指定的字元位置開始並繼續到字串的結尾。 Substring(Int32, Int32):從字串執行個體擷取部份字串。 部份字串起始於指定的字元位置,並且具有指定的長度 從字串取得前面n個字元部份字串 字串的字元是從0開始索引的,字串第一個字元的位置是從0開始的。 假設你要從字串中取得前面12個字元的部份字串,可以使用Substring方法傳遞開始的索引0跟12的長度,就可以從字串取得前面12個字元的部份字串。 取得部份字串從指定的 startIndex 處開始, endIndex:到指定的 endIndex處結束 Substring方法的第一個參數是部份字串開始的索引,第二個參數是包括空白字元在內的字元數,可以使用String. Length找出字串結束的位置。 下面的範利用來找第八個位置到最後的部份字串 也可以透過Substring的第二參數來取得一些字元,下面的範例可以從第八個位置取得15個字元的字串。 取得某個字元後或前的部份字串 使用Substring取得第一次出現的指定字元前的部份字串,可以透過第一個參數為0,第二個參數為指定字元的位置(長度)來做。PS:此用法為UI中切割出資料主要用法 下面的程式是取得指定字元後的部份字串:

C# Substring 定義及七種用法(分割拆解認關鍵字方法) Read More »

C# WindowForm COM Port 連接/傳送/接收資料完整建置

前言 序列埠(Serial port),也稱序列埠或序列埠,序列通信埠,COM埠,簡稱串口。主要用於序列式逐位資料傳輸。常見的有一般電腦應用的RS-232(使用 25 針或 9 針連接器)和工業電腦應用的半雙工RS-485與全雙工RS-422。首先我們因為編寫一個UI介面要與STM32板子相互連接資料傳輸,第一步就是撰寫COM Port Demo效果 前置作業 程式架構為:按下button,進行RS232連線,並在Listbox顯示可連線之COM Port與連線狀態。連線成功後,將MCU傳輸值顯示在Listbox上。 PS:這邊注意開啟的專案有2個選擇是.NET Framework才會在工具列裡出現SerialPort的選項 程式範例 1.首先宣告一個Serial變數 2.撰寫button點擊後動作 3.進行串列埠連線(因這邊有撰寫BaudRate可以透過外部文件改寫所以有一點點不同) 4.撰寫關閉Com Port 5.撰寫連接觸發事件 7.串列埠接收資料事件 額外功能 串列埠傳送資料 斷開串列埠 得到可用串列埠號 PS:這邊注意serialPort1.Dispose();與serialPort1.Close(); 2者不同處是Dispose()是釋放全部內存,Close()是完全斷開並釋放內存 參考 C#中COM串列埠連線、傳送、接收資料

C# WindowForm COM Port 連接/傳送/接收資料完整建置 Read More »

FOC控制原理(Theory For FOC Control)之4

前言 前面講述完全部數學轉換後來到最後一步FOC的控制流程,首先我們來看到下圖Three Phase Inverter一般包含在motor driver,而綠框一般為MCU控制計算 最终的完整FOC算法 在前面章節提到的Id和Iq分別的物理意義為,將轉子磁鏈進行解偶,分解成轉子旋轉的切線方向與徑向兩個變量 其中Iq是我們所需要的代表期望力矩輸出 而Id為我們不需要我們盡可能使其為0 接下來我們再將控制環分成3個階段(電流環、速度環、位置環)並加上PI回授補償就可以獲得下圖 PS:在速度環中轉速並不是瞬時的速率,而是測了一段時間取平均值的速率,因此若是在低速的情况下,速率環就不那適用了,因為平均測速法會存在非常大的誤差(轉子不動或者動地很慢,编碼器就没有输出或者只输出1、2个脈衝) 參考 FOC项目知识点总结五 | FOC流程总述 FOC控制原理

FOC控制原理(Theory For FOC Control)之4 Read More »

Shopping Cart