


創建步驟和普通應用創建基本類似,分為MCU底層,馬達控制中間層,馬達控制應用層,三個層次的操作如下:
MCU底層代碼主要是針對TIMER,ADC,GPIO,中斷等配置,這個部分可以借助Cubemx2.0進行配置,可以參考例程工程,這邊不做具體的操作說明,只做關鍵幾個外設的配置注意點的介紹說明。
3.1.1. PWM配置
主要是配置TIM1(或TIM8)做為PWM波輸出,可以配置為上下橋互補輸出,也可以配置為單獨的三相PWM波(驅動芯片產生互補PWM),默認情況下X-Nucleo-IHM16M1是后一種硬件配置。對于過流保護,BKIN管腳輸入,可配置一定的濾波。三電阻采樣使用TIM1 CCR4產生TRGO觸發信號,用于ADC采樣的觸發。單電阻采樣則使用CCR5和CCR6的組合做為ADC的采樣觸發。頻率計算可以根據實際電路調整,寫入Counter period數據,比如使用15KHz,那么ARR 數據為144MHz/15KHz/2=4800。

▲ 圖1. PWM配置
3.1.2. ADC配置
分別配置ADC管腳,不同的電流采樣拓撲需要選擇不同的ADC模塊以及管腳,大致分為四種,三電阻,雙電阻,單電阻,ICS;對于ADC使用方面也可以為3個,2個,1個ADC模塊;MC SDK可以支持這些模式的組合,雙電阻采樣可以看做三電阻采樣的特別模式,在馬達控制軟件中支持三電阻和單電阻的采樣。對于本文所用ADC資源列表如下,比如使用2個ADC模塊對三電阻電流采樣方式,需要分別配置ADC2,ADC3。使用Inject組對電流采樣,TIM1_TRGO做為觸發信號。其他Bus電壓,溫度等則使用Regular組進行ADC采樣。

▲ 圖2. ADC配置


3.1.3. 中斷配置
馬達中用到的中斷需要進行優先等級的分配,并且在MC SDK馬達代碼中會對中斷資源以及中斷服務函數進行配置,因此在Cubemx中不需要配置,代碼中進行配置即可。

▲ 圖3. 中斷有限級別配置
3.1.4. 其他配置
時鐘配置根據硬件進行配置,一般配置為最高主頻時鐘。因為用到了STM32C5的Cordic進行三角函數計算,要使能Cordic功能。如果涉及其他IO口或者通訊等功能,則進行對應的CubeMX2配置;如果需要使用Motor Pilot進行調試,需要配置串口,并且使能串口的DMA;如果用HALL Sensor,Encoder等,則需要配置相關的TIMER資源。
所有上面MCU外設配置好后,就可以生成MCU外設代碼和基礎工程文件,在這個工程文件上在進行添加工作。

▲ 圖4. C5 Cubemx2.0基礎工程
3.1.5. 手動修改部分代碼
因為中斷調用在馬達庫中會自定義,因此需要屏蔽自動生成的中斷調用。
屏蔽mx_system.c中的SysTick_Handler函數。
屏蔽mx_usart2.c中的串口中斷,以及DMA中斷。
stm32c5xx_hal_conf.h中USE_HAL_DBGMCU_MODULE宏定義改為1。
使用MC SDK V6.4的馬達控制代碼,需要修改與MCU底層代碼的接口函數,并且要區別HAL1.0和HAL 2.0庫函數結構的不同進行修改。可以先用MC SDK V6.4生成Nucleo-G431RB + X-Nucleo-IHM16M1 + Shinano LA052的代碼,然后在這個基礎上進行相關的移植修改工作。
3.2.1. PWM,ADC底層接口創建
整體拷貝MCSDK_v6.4.1-Full文件夾到工程目錄下,添加一個C5xx文件夾,并且參考G4的代碼,重新創建pwm_curr_fdbk.c文件以及相頭文件,這邊創建了三個文件,r1_ps_pwm_curr_fdbk.c是單電阻采樣,r3_1_c5xx_pwm_curr_fdbk.c是三電阻1個ADC模塊方式,r3_2_c5xx_pwm_curr_fdbk.c是三電阻2個ADC模塊方式,三個文件實際使用根據情況只使用其中一個文件即可,詳細見參考代碼。

▲ 圖5. 創建C5底層接口文件
3.2.2. 復用馬達控制中間層
其他馬達控制中間層基本可以復用,有區別的是usart_aspep_driver.h和encoder_speed_pos_fdbk.c以及hall_speed_pos_fdbk.c三個文件,實際區別也是有限,只是因為CubeMX庫寫法的不同,進行相關修改即可。

▲ 圖6. MCLib\Any的區別

▲ 圖7. encoder_speed_pos_fdbk.c的區別
添加中間層文件導入工程中,創建group。

▲ 圖8. 工程中增加馬達控制中間層
應用層同樣也可以復用STM32G4所使用到的文件,需要修改的是HAL 1.0和HAL 2.0不同所帶來的寫法不同以及STM32C5本體控制要求的不同而修改。這邊會創建三個FOC文件mc_tasks_foc.c針對的是無傳感觀測器,mc_tasks_foc_hall.c針對的是HALL信號,mc_tasks_foc_encoder.c針對的是編碼器,三個FOC文件根據Sensor不同,只需要使用其中一個文件。創建parameters_conversion_c5xx.h用于芯片時鐘,ADC,TIMER時鐘以及中斷的別名定義。強調一點是這邊創建了stm32c5xx_mc_it.c和stm32_mc_common_it.c文件,文件中基本涵蓋了馬達控制所使用到的中斷處理。
/********************************************************************************* @file parameters_conversion_c5xx.h*******************************************************************************//* Define to prevent recursive inclusion -------------------------------------*/#ifndef PARAMETERS_CONVERSION_C5XX_H#define PARAMETERS_CONVERSION_C5XX_H#include "drive_parameters.h"#include "power_stage_parameters.h"#include "mc_math.h"/************************* CPU & ADC PERIPHERAL CLOCK CONFIG ******************/#define SYSCLK_FREQ 144000000uL#define TIM_CLOCK_DIVIDER 1#define ADV_TIM_CLK_MHz 144 /* Actual TIM clk including Timer clockdivider*/#define ADC_CLK_MHz 36#define HALL_TIM_CLK 144000000uL#define APB1TIM_FREQ 144000000uL/************************* IRQ Handler Mapping *********************/#define TIMx_UP_M1_IRQHandler TIM1_UPD_IRQHandler#define TIMx_BRK_M1_IRQHandler TIM1_BRK_TERR_IERR_IRQHandler#define CURRENT_M1_IRQHandler ADC2_IRQHandler#define SPD_HALL_TIM_M1_IRQHandler TIM2_IRQHandler#define SPD_ENC_TIM_M1_IRQHandler TIM2_IRQHandler#define ADC_TRIG_CONV_LATENCY_CYCLES 4#define ADC_SAR_CYCLES 13.5

▲ 圖9. 向工程中添加馬達控制應用層
完成上面步驟的移植后,在工程中加入頭文件包含,還需要根據當前的軟件架構,加入馬達初始化接口,以及調用API函數運行馬達。
4.1. 完成用戶應用層
用戶應用層需要調用馬達控制初始化函數MX_MotorControl_Init()用于馬達控制底層以及中間層的初始化動作,完成后要調用MX_NVIC_Init()函數使能中斷以及配置中斷優先等級。本例中創建了main_mc.c文件用于接口文件,創建example.c文件用于調用以及程序結構化。最后就是在main函數中加入初始化和循環執行函數。

▲ 圖10. 完成用戶應用層
本體硬件連接就是組合連接方式,Nucleo-C5A3ZG + X-Nucleo-IHM16M1 + Shinano LA052,因為Shinano電機有HALL,Encoder接口,可以分別測試無傳感觀測器,Hall Sensor,Encoder Sensor,有傳感器控制要注意傳感器接線順序。

▲ 圖11. 硬件連接圖
工程添加完畢后,編譯工程,并修改相關錯誤,下載程序到STM32C5芯片中,之后就是大家熟悉的執行馬達控制過程了,可以用Motor Pilot進行控制,也可以用API函數控制。

▲ 圖12. Motor Pilot 控制
本例程只是針對ST的馬達控制板做說明,實際當中如果客戶使用了STM32C5做了自己的馬達控制板,同樣也可以參考上面步驟,對代碼進行修改。注意分配好硬件資源,然后按照上面步驟進行一步一步修改。MCU底層外設硬件根據實際應用進行管腳配置,馬達控制的中間層基本不用改,而馬達控制的應用層只需要修改與ADC或者PWM相關的幾個.c或者.h文件即可。
如果同一個硬件,只是更換不同馬達,則只需要修改三個頭文件:
pmsm_motor_parameters.h – 馬達本體參數
drive_parameters.h – 馬達驅動參數,包含速度,電流PID參數
power_stage_parameters.h – 電源參數,如果更換電機的電壓相同,則無需修改
可以使用MC SDK V6.4生成基于STM32G4控制的新馬達的參數(注意PWM波頻率要一致),生成的參數可以直接拷貝到這三個文件中。
如果硬件已經是客戶自己硬件,則需要修改除了上面的四個頭文件外,還要注意以下幾個文件,根據情況進行修改:
mc_config_common.c – 重點關注ADC部分的修改
mc_parameters.c – ADC采樣配置的修改
mc_init.h – 主要是對各個使用管腳的宏定義
mcp_config.h – 如果使用了Motor Pilot功能,需要修改串口配置
parameters_conversion_c5xx.h – 時鐘宏定義,中斷別名定義
有6個工程文件,分別對應不同場景,每個工程中包含無傳感,Hall,Encoder。

工程選擇方式
首先打開相關工程文件,在工程中選擇需要使用的傳感器方式,編譯后下載運行。對于單電阻測試需要把跳線調為單電阻模式。

▲ 圖13. 工程選擇Keil/IAR
關于STM32C5的MC SDK V6.4版本軟件移植,馬達控制中間層以及應用層除了和ADC和PWM相關外設相關外,馬達控制代碼基本可復用狀況下,移植只需要關注于Cube庫的變化以及ADC,DMA等配置細節,其他可以方便移植到新的MCU中。
實戰經驗 | MCU復位期間PC端仍然認為USB連接未斷開
實戰經驗 | 碰到hardfault問題你還在死磕代碼嗎?
實戰經驗 | 使用STiROT后看門狗意外復位問題分析
? THE END

