STM32电机控制【重量级库函数】解析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STM32电机控制【重量级库函数】解析
STM32电机控制重量级库函数解析
Foc_svpwm.c
归属组:arithmetic
描述:PWM配置和SVPWM计算
函数:
函数功能描述输入参数输出
参数
调用函数在何处被调用
SvpwmLMotorConfig(void) 对左电机用到外设进行配置无无无foc_port.c/
FOCPortPeripheralConfig() SvpwmRMotorConfig(void) 对右电机用到外设进行配置无无无foc_port.c/
FOCPortPeripheralConfig()
SvpwmTimerSynchConfig(void) 双电机pwm控制时钟源
Timer1、8同步,配置TIM1、
TIM8、TIM5进行时钟同步无无无foc_port.c/
FOCPortInit()
SvpwmCalcDutyCycles(STATOR_VOLTAGE,u8) 又Valpha、Vbeta输入生成
SVPWM波形typedef struct //Valpha Vbeta
{
s16 V alfa;
s16 Vbeta;
}STATOR_VOLTAGE;
U8 mc_ch //电机通道,左电机or
右电机
无无foc_encoder.c/
FOCEncoderStartUp(u8 mc_ch)
foc_port.c/
FOCPortArithmeticModel(u8 mc_ch)
Foc_port.c
归属组:arithmetic
描述:FOC配置和算法接口模块
函数:
函数功能描述输入参数输出参数调用函数在何处被调用
FOCPortPeripheralConfig(void) 对电机用到外设进行配置(定
时器、ADC) 无无SvpwmLMotorConfig()
SvpwmRMotorConfig()
InjectADCConfig()
InjectADCRegularDMAConfig()
Foc_port.c/
FOCPortInit()
FOCPortInit(void) 电机控制配置,外设和变量的
初始化无无FOCCurrentPIDInit()
FOCPortPeripheralConfig()
InjectADCReadEn()
SvpwmTimerSynchConfig()
InjectADCPhaseCaliPend()
App_main.c/
App_TaskStart()
SysDetectErrLED()
FOCPortSwitchMotorCtrlChannel(void) 切换电机控制通道,在T1溢出
中断中被调用,切换FOC电
机控制通道无无InjectADCSwitchADCTriSource()
InjectADCSwitchADCSampleCH()
Stm32f10x_it.c/
TIM1_UP_IRQHandler
FOCPort_CalcCurrentDerr(u8 mc_ch) 计算电流矢量Iq的加速度,
其实就是计算在一定间隔时
间内的差值U8 mc_ch //电机通道,左
电机or 右电机
无无Foc_port.c/
FOCPortArithmeticModel(u8
mc_ch)
FOCPortArithmeticModel(u8 mc_ch) FOC模型函数的调用,clark--park--Id/Iq控制--逆
park--svpwm U8 mc_ch //电机通道,左
电机or 右电机
无InjectADCGetPhaseCurrValues()
FOCCoordTransClark()
FOCCoordTransPark()
FOCCurrentPIDArithmetic()
FOCCoordTransRevParkCircleLimitation()
FOCCoordTransRevPark()
CALC_SVPWM()
FOCPort_CalcCurrentDerr()
Stm32f10x_it.c/
ADC1_2_IRQHandler()
在ADC转换结束中被调用
Foc_inject_adc.c
归属组:arithmetic
描述:三相电流采样ADC配置和注入式触发采样等的处理函数
函数:
函数功能描述输入参数输出参数调用函数在何处被调用
InjectADC_PhaseCurrentCaliEn(void) 关闭pwm输出,使能相电流校
准开关无无无Foc_inject_adc.c/
InjectADCPhaseCaliPend()
InjectADCReadEn(FunctionalState cmd) 使能三相注入式采样电流读取Cmd (ENABLE or
DISALBE)无无Foc_port.c/
FOCPortInit()
Bool InjectADCPhaseCaliPend(u8 sw) 相电流ADC初始值校准U8 sw bool InjectADC_PhaseCurrentCaliEn
()
Foc_port.c/ FOCPortInit()
InjectADC_ConvConfig(void) 三相注入式ADC配置,配置
注入式ADC的寄存器无无无Foc_inject_adc.c/
InjectADC_PhaseCurrReadCali()
InjectADC_PhaseCurrReadCali() 三相ADC读取值校准无无InjectADC_ConvConfig(void) Foc_inject_adc.c/
InjectADCConfig()
InjectADCRegularDMAConfig() 常规ADC通道DMA配置,
DMA寄存器的配置无无无Foc_port.c/
FOCPortPeripheralConfig()
InjectADCConfig() 注入式ADc的配置无无InjectADC_PhaseCurrReadCali(
)
Foc_port.c/ FOCPortPeripheralConfig()
InjectADCSwitchADCTriSource(u8 mc_ch) 切换左右电机ADC 注入式采
样的时钟源u8 mc_ch //电机通道,左电
机or 右电机
无无foc_port.c/
FOCPortSwitchMotorCtrlChannel()
InjectADCSwitchADCSampleCH(u8 mc_ch) 切换左右电机ADC
注入式采
用通道u8 mc_ch //电机通道,左电
机or 右电机
无无foc_port.c/
FOCPortSwitchMotorCtrlChannel()
InjectADCGetPhaseZeroOffset
(u8 mc_ch , PHASE_OFFSET *phase_zero)
获取相电流初始值u8 mc_ch //电机通道
typedef struct //相电流
{
s32 a;
s32 b;
s32 c;
}PHASE_OFFSET; 无无stm32f10x_it.c/
ADC1_2_IRQHandler()
在ADC转换结束中断中被调用,并且是电机状
态:MotorCtrlState = CALICURR时
PHASE_CURRENT InjectADCGetPhaseCurrValues(u8 mc_ch) 三相电流值计算出矢量电流
Ia、Ib
u8 mc_ch //电机通道,左电
机or 右电机
typedef struct //
相电流
{
s32 a;
s32 b;
s32 c;
}PHASE_OFFSET;
无foc_port.c/
FOCPortArithmeticModel(u8 mc_ch)
foc_encoder.c/
FOCEncoderStartUp (u8 mc_ch)
stm32f10x_it.c/
ADC1_2_IRQHandler (u8 mc_ch)
在ADC转换结束中断中被调用,而且是在电机
状态处于IDLE时被调用
InjectADCEnableADCTri(void) 注入式ADC采样使能无无无stm32f10x_it.c/
TIM1_UP_IRQHandler()
T1上溢中断InjectADCDisableADCTri(void) 关闭ADC触发源出发采样无无无stm32f10x_it.c/
ADC1_2_IRQHandler ()
ADC转换结束中断foc_coord_transform.c
归属组:arithmetic
描述:FOC坐标变换,该文件内包含正弦表、最大调制表
#define SIN_COS_TABLE {……}
static const s16 CoordSinCosTable[256] = SIN_COS_TABLE;
函数:
函数功能描述输入参数输出参数调用函数在何处被调用
STATOR_CURRENT FOCCoordTransClark(PHASE_CURRENT Curr_Input) Clark变换,定子电流Ia、Ib
转换成Ialpha和Iβ
typedef struct//定子相电流
{
s16 Ia;
s16 Ib;
}PHASE_CURRENT;
typedef struct
//α、β电流
{
s16 Ialfa;
s16 Ibeta;
}STATOR_CURRENT;
无
Foc_port.c/
FOCPortArithmeticModel () (在ADC转换完成被调用)
Foc_encoder.c/
FOCEncoderStartUp () (在电机启动对准时被调用)
ROTOR_CURRENT FOCCoordTransPark(STA TOR_CURRENT Curr_Input, s16 Theta) Park变换,Iα和Iβ变换成Id
和Iq
s16 Theta //转子角度
typedef struct
{
typedef struct
{
s16 Iq;
无
s16 Ialfa;
s16 Ibeta;
}STATOR_CURRENT;
s16 Id;
}ROTOR_CURRENT;
FOCCoordTransRevParkCircleLimitation
(u8 mc_ch)
输出调制比限幅的函数u8 mc_ch //电机通道无无
STATOR_VOLTAGE FOCCoordTransRevPark (ROTOR_VOLTAGE V olt_Input) 逆park变换,该函数理应有电机角度作为输入参数,但由于
该函数在调用时处在正park变
换之后,正park变换已经将转
子角度计算在结构体中,所以
在这个函数中就不用计算了。
typedef struct
{
s16 Vq;
s16 Vd;
}ROTOR_ VOLTAGE;
typedef struct
{
s16 V alfa;
s16 Vbeta;
}STATOR_ VOLTAGE;
无
TRIANGLE_COMPONENTS CoordTransTrigFunctions(s16 hAngle)
角度Theta转换为正余弦函数s16 hAngle typedef struct {
s16 tcos;
s16 tsin;
}TRIANGLE_COMPO
NENTS;
无foc_coord_transform.c/ FOCCoordTransPark()
在正park变换中计算sin(theta)和cos(theta)
foc_pid_regulators.c
归属组:arithmetic
描述:力矩和磁通的PID函数
函数:
函数功能描述输入参数输出参数调用函数在何处被调用
FOCCurrentPIDInit (PID_Struct_t *PID_Torque, PID_Struct_t *PID_Flux) 初始化矢量电流力矩和磁通
的PID初始值
PID_Struct_t *PID_T orque
PID_Struct_t *PID_Flux
PID力矩和励磁参数结构体
无无foc_port.c/
FOCPortInit ()
s16 FOCCurrentPIDArithmetic (s16 hReference,
s16 hPresentFeedback, PID_Struct_t *PID_Struct) 矢量电流力矩和磁通的PID
计算
s16 hReference //参考值
s16 hPresentFeedback //实际值
PID_Struct_t *PID_Struct//PID参
数结构体
PID输出值无Foc_port.c/
FOCPortArithmeticModel () (在ADC转换完成被调
用)
Foc_encoder.c/
FOCEncoderStartUp () (在电机启动对准时被调用)
foc_encoder.c
归属组:arithmetic
描述:正交编码器的配置
函数:
函数功能描述输入参数输出参数调用函数在何处被调用
FOCEncoderConfig (void) 编码器配置,涉及到的GPIO、
定时器等配置无无无app_main.c/
App_TaskStart(void *p_arg)
开始任务,环境初始化
s16 FOCEncoderGetElectricalAngle(u8 mc_ch) 返回电机电角度u8 mc_ch //电机通道电机电角度:
0 -> 0 degrees,
*S16_MAX-> 180 degrees,
*S16_MIN-> -180 degrees 无Foc_port.c/
FOCPortArithmeticModel ()
(在ADC转换完成被调用)
MotorGetInitABSPos(u8 mc_ch) 获取电机初始绝对值u8 mc_ch //电机通道无无无
FOCEncoderReset(u8 mc_ch) 在对准后写入对应的编码器
初始线数u8 mc_ch //电机通道无无foc_encoder.c/
FOCEncoderStartUp(u8 mc_ch)
电机启动时调用的
s32 FOCEncoder_CalcRotSpeed(u8 mc_ch) 速度检测函数u8 mc_ch //电机通道返回当前转子速度无foc_encoder.c/
FOCEncoderCalcAverSpeed(u8 mc_ch)
s32 FOCEncoderCalcAverSpeed(u8 mc_ch) 计算转子平均机械速度,其
实就是一个取平均的函数,
用上一个函数取和求平均u8 mc_ch //电机通道返回转子机械角速度FOCEncoder_CalcRotSpeed(mc_
ch)
该函数返回转子速度
motor_control.c/
MotorCtrl_ManageSpeedPID(u8 mc_ch)
在速度环中调用
FOCEncoderStartUp(u8 mc_ch) 电机初始对准,也就是在启
动时才会调用,还包含一个
FOC算法。
u8 mc_ch //电机通道无无stm32f10x_it.c/
ADC1_2_IRQHandler()
ADC转换结束中断,当电机状态
MotorCtrlState=START时才会调用
FOCEncoderStartUp(u8 mc_ch)
void TIM2_IRQHandler(void) void TIM4_IRQHandler(void) 左右电机编码器转满一圈的溢出中断,编码器用到的定时器是TIMER2和TIMER4。
typedef struct
{
u8 ch; //電機通道
s8 dir; //電機轉向
MC_STYLE mode; //電機狀態typedef enum {CURRENT_STYLE=1,SPEED_STYLE , FREE_STYLE , BREAK_STYLE}MC_STYLE TIM_TypeDef *timer; //計時器定義TIM_TypeDef *encoder_timer;
u16 pwmmode; //PWM模式
u16 cc4pwmmode;
}MC_INFO;
MC_INFO MotorCtrlInfo[2] = {{L_MOTOR , 1 , FREE_STYLE , TIM1 , TIM4 , TIM_OCMode_PWM1 , TIM_OCMode_PWM2}, {R_MOTOR , -1, FREE_STYLE , TIM8 , TIM2 , TIM_OCMode_PWM1 , TIM_OCMode_PWM2}};。