01、前言
STM32C5是ST最新性价比芯片,生态系统基于最新版本的STM32CubeMX2,因为当前版本的MC SDK V6.4没有包含STM32C5芯片,如果客户需要创建基于马达控制代码,需要半自动化去实现控制代码的生成以及创建,本文可以应用于任意STM32芯片的马达工程创建,可以作为复用马达控制生态案例来使用,以Nucleo-C5A3ZG + X-Nucleo-IHM16M1 + Shinano LA052为例创建基于STM32C5的马达控制程序。
02、整理马达控制外设资源
第一步是要理清关于马达控制的基本资源,以及需要采用的策略,基本的构成为PWM和ADC两个基本外设,另外如果使用传感器,基本为HALL以及Encoder,无传感器控制常见的是STO+PLL和HSO两种。Nucleo-C5A3ZG + X-Nucleo-IHM16M1的资源分配如下,根据控制策略则需要选择不同资源。
03、创建马达代码整体步骤
创建步骤和普通应用创建基本类似,分为MCU底层,马达控制中间层,马达控制应用层,三个层次的操作如下:
3.1. 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。
3.2. 马达控制中间层
使用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. 工程中增加马达控制中间层
3.3. 马达控制应用层
应用层同样也可以复用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 clock divider*/#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. 向工程中添加马达控制应用层
04、运行马达
完成上面步骤的移植后,在工程中加入头文件包含,还需要根据当前的软件架构,加入马达初始化接口,以及调用API函数运行马达。
4.1. 完成用户应用层
用户应用层需要调用马达控制初始化函数MX_MotorControl_Init()用于马达控制底层以及中间层的初始化动作,完成后要调用MX_NVIC_Init()函数使能中断以及配置中断优先等级。本例中创建了main_mc.c文件用于接口文件,创建example.c文件用于调用以及程序结构化。最后就是在main函数中加入初始化和循环执行函数。
▲ 图10. 完成用户应用层
4.2. 硬件连接
本体硬件连接就是组合连接方式,Nucleo-C5A3ZG + X-Nucleo-IHM16M1 + Shinano LA052,因为Shinano电机有HALL,Encoder接口,可以分别测试无传感观测器,Hall Sensor,Encoder Sensor,有传感器控制要注意传感器接线顺序。
▲ 图11. 硬件连接图
4.3. 编译下载工程,运行马达
工程添加完毕后,编译工程,并修改相关错误,下载程序到STM32C5芯片中,之后就是大家熟悉的执行马达控制过程了,可以用Motor Pilot进行控制,也可以用API函数控制。
▲ 图12. Motor Pilot 控制
05、更换硬件后进行程序修改
本例程只是针对ST的马达控制板做说明,实际当中如果客户使用了STM32C5做了自己的马达控制板,同样也可以参考上面步骤,对代码进行修改。注意分配好硬件资源,然后按照上面步骤进行一步一步修改。MCU底层外设硬件根据实际应用进行管脚配置,马达控制的中间层基本不用改,而马达控制的应用层只需要修改与ADC或者PWM相关的几个.c或者.h文件即可。
5.1. 只更换马达情况
如果同一个硬件,只是更换不同马达,则只需要修改三个头文件:
pmsm_motor_parameters.h – 马达本体参数
drive_parameters.h – 马达驱动参数,包含速度,电流PID参数
power_stage_parameters.h – 电源参数,如果更换电机的电压相同,则无需修改
可以使用MC SDK V6.4生成基于STM32G4控制的新马达的参数(注意PWM波频率要一致),生成的参数可以直接拷贝到这三个文件中。
5.2. 更换硬件情况
如果硬件已经是客户自己硬件,则需要修改除了上面的四个头文件外,还要注意以下几个文件,根据情况进行修改:
mc_config_common.c – 重点关注ADC部分的修改
mc_parameters.c – ADC采样配置的修改
mc_init.h – 主要是对各个使用管脚的宏定义
mcp_config.h – 如果使用了Motor Pilot功能,需要修改串口配置
parameters_conversion_c5xx.h – 时钟宏定义,中断别名定义
06、关于示例工程使用说明
有6个工程文件,分别对应不同场景,每个工程中包含无传感,Hall,Encoder。
工程选择方式
首先打开相关工程文件,在工程中选择需要使用的传感器方式,编译后下载运行。对于单电阻测试需要把跳线调为单电阻模式。
▲ 图13. 工程选择Keil/IAR
07、总结说明
关于STM32C5的MC SDK V6.4版本软件移植,马达控制中间层以及应用层除了和ADC和PWM相关外设相关外,马达控制代码基本可复用状况下,移植只需要关注于Cube库的变化以及ADC,DMA等配置细节,其他可以方便移植到新的MCU中。
来源:STM32
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。