Workbench 程式架構
前言
這邊網路資源也算蠻多的一些相關知識可以參考FOC控制原理與电机应用开发实战指南-基于STM32中的影片知識,這邊會探討在ST的Workbench 在設定完成後所生成的code,主要在程式架構與重要程式碼說明,在了解架構後,就能夠自己加入所需要應用調整,後續會逐步介紹API應用與不同控制的改動
程式架構
下圖可以看到主要的整個程式運轉主架構,其中有2個中斷(Systick中斷與ADC中斷)可以由圖看出是程式的主核心,Systick中斷執行安全任務與中頻任務(速度環),而ADC中斷則執行高頻任務
Systick中斷
系统定时器是一个24bit的向下遞減的計數器,計數器每計數一次的時間為1/SYSCLK。當中內存數值寄存器的數值遞減到0的時候,系统定時器就產生一次中斷。
這邊參考已默認1ms的定時中斷為範例來看參考代碼
__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
/* Configure the SysTick to have interrupt in 1ms time basis*/
if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) > 0U)
{
return HAL_ERROR;
}
/* Configure the SysTick IRQ priority */
if (TickPriority < (1UL << __NVIC_PRIO_BITS))
{
HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U);
uwTickPrio = TickPriority;
}
else
{
return HAL_ERROR;
}
/* Return function status */
return HAL_OK;
}
中斷函數
void SysTick_Handler(void)
{
MC_RunMotorControlTasks();
}
MC_RunMotorControlTasks函數內容
__weak void MC_RunMotorControlTasks(void)
{
if ( bMCBootCompleted ) {
/* ** Medium Frequency Tasks ** */
MC_Scheduler(); //中頻任務
/* Safety task is run after Medium Frequency task so that
* it can overcome actions they initiated if needed. */
TSK_SafetyTask(); //安全任務
/* ** User Interface Task ** */
UI_Scheduler(); //用户界面任務
}
}
ADC中斷
ADC中斷主要在Timer觸發後執行FOC座標轉變、SVPWM執行、電壓電流溫度採樣與PWM調整占比輸出(可以參考下圖)
ADC初始化部分可以參考文件【基于NUCLEO-F746ZG电机开发应用】7.程序框架-两个重要中断,與一般初始化大致相同就不贅述只有在中斷部分有加入函示庫
ADC中斷
void ADC_IRQHandler(void)
{
/* USER CODE BEGIN ADC_IRQn 0 */
/* USER CODE END ADC_IRQn 0 */
if ( LL_ADC_IsActiveFlag_JEOS( ADC1 ) )//檢查ADC轉換flag
{
LL_ADC_ClearFlag_JEOS( ADC1 );//清除Flag
}
// Highfrequency task Single or M1
UI_DACUpdate(TSK_HighFrequencyTask()); //高頻任務
/* USER CODE BEGIN ADC_IRQn 1 */
/* USER CODE END ADC_IRQn 1 */
}
Pingback: Motor Profiler and MotorControl Workbench - AMS and STM32