STM32电机控制重量级库函数解析

更新时间:2023-10-21 08:20:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

STM32电机控制重量级库函数解析

Foc_svpwm.c

归属组:arithmetic

描述:PWM配置和SVPWM计算 函数: 函数 SvpwmLMotorConfig(void) SvpwmRMotorConfig(void) SvpwmTimerSynchConfig(void) 功能描述 对左电机用到外设进行配置 对右电机用到外设进行配置 双电机pwm控制时钟源Timer1、8同步,配置TIM1、TIM8、TIM5进行时钟同步 又Valpha、Vbeta输入生成SVPWM波形 输入参数 无 无 无 输出参数 无 无 无 调用函数 无 无 无 在何处被调用 foc_port.c/ FOCPortPeripheralConfig() foc_port.c/ FOCPortPeripheralConfig() foc_port.c/ FOCPortInit() foc_encoder.c/ FOCEncoderStartUp(u8 mc_ch) foc_port.c/ FOCPortArithmeticModel(u8 mc_ch) SvpwmCalcDutyCycles(STATOR_VOLTAGE,u8) typedef struct //Valpha Vbeta { s16 Valfa; s16 Vbeta; }STATOR_VOLTAGE; U8 mc_ch //电机通道,左电机 or 右电机 无 无 Foc_port.c

归属组:arithmetic

描述:FOC配置和算法接口模块 函数: 函数 FOCPortPeripheralConfig(void) 功能描述 对电机用到外设进行配置(定时器、ADC) 输入参数 无 输出参数 无 调用函数 SvpwmLMotorConfig() SvpwmRMotorConfig() InjectADCConfig() InjectADCRegularDMAConfig() FOCCurrentPIDInit() FOCPortPeripheralConfig() InjectADCReadEn() SvpwmTimerSynchConfig() InjectADCPhaseCaliPend() 在何处被调用 Foc_port.c/ FOCPortInit() FOCPortInit(void) 电机控制配置,外设和变量的初始化 无 无 App_main.c/ App_TaskStart() SysDetectErrLED() FOCPortSwitchMotorCtrlChannel(void) 切换电机控制通道,在T1溢出中断中被调用,切换FOC电机控制通道 计算电流矢量Iq的加速度,其实就是计算在一定间隔时间内的差值 FOC模型函数的调用,clark--park--Id/Iq控制--逆park--svpwm 无 无 InjectADCSwitchADCTriSource() InjectADCSwitchADCSampleCH() 无 Stm32f10x_it.c/ TIM1_UP_IRQHandler Foc_port.c/ FOCPortArithmeticModel(u8 mc_ch) Stm32f10x_it.c/ ADC1_2_IRQHandler() 在ADC转换结束中被调用 FOCPort_CalcCurrentDerr(u8 mc_ch) U8 mc_ch //电机通道,左电机 or 右电机 无 FOCPortArithmeticModel(u8 mc_ch) U8 mc_ch //电机通道,左电机 or 右电机 无 InjectADCGetPhaseCurrValues() FOCCoordTransClark() FOCCoordTransPark() FOCCurrentPIDArithmetic() FOCCoordTransRevParkCircleLimitation() FOCCoordTransRevPark() CALC_SVPWM() FOCPort_CalcCurrentDerr() Foc_inject_adc.c 归属组:arithmetic

描述:三相电流采样ADC配置和注入式触发采样等的处理函数 函数: 函数 InjectADC_PhaseCurrentCaliEn(void) InjectADCReadEn(FunctionalState cmd) Bool InjectADCPhaseCaliPend(u8 sw) InjectADC_ConvConfig(void) InjectADC_PhaseCurrReadCali() InjectADCRegularDMAConfig() InjectADCConfig() InjectADCSwitchADCTriSource(u8 mc_ch) InjectADCSwitchADCSampleCH(u8 mc_ch) 功能描述 关闭pwm输出,使能相电流校准开关 使能三相注入式采样电流读取 相电流ADC初始值校准 三相注入式ADC配置,配置注入式ADC的寄存器 三相ADC读取值校准 常规ADC通道DMA配置,DMA寄存器的配置 注入式ADc的配置 切换左右电机ADC注入式采样的时钟源 切换左右电机ADC注入式采用通道 输入参数 无 Cmd (ENABLE or DISALBE) U8 sw 无 无 无 无 u8 mc_ch //电机通道,左电机 or 右电机 u8 mc_ch //电机通道,左电机 or 右电机 输出参数 无 无 bool 无 无 无 无 无 无 调用函数 无 无 InjectADC_PhaseCurrentCaliEn() 无 InjectADC_ConvConfig(void) 无 InjectADC_PhaseCurrReadCali() 无 无 在何处被调用 Foc_inject_adc.c/ InjectADCPhaseCaliPend() Foc_port.c/ FOCPortInit() Foc_port.c/ FOCPortInit() Foc_inject_adc.c/ InjectADC_PhaseCurrReadCali() Foc_inject_adc.c/ InjectADCConfig() Foc_port.c/ FOCPortPeripheralConfig() Foc_port.c/ FOCPortPeripheralConfig() foc_port.c/ FOCPortSwitchMotorCtrlChannel() foc_port.c/ FOCPortSwitchMotorCtrlChannel() InjectADCGetPhaseZeroOffset (u8 mc_ch , PHASE_OFFSET *phase_zero) 获取相电流初始值 PHASE_CURRENT InjectADCGetPhaseCurrValues(u8 mc_ch) 三相电流值计算出矢量电流Ia、Ib u8 mc_ch //电机通道 typedef struct //相电流 { s32 a; s32 b; s32 c; }PHASE_OFFSET; u8 mc_ch //电机通道,左电机 or 右电机 无 无 stm32f10x_it.c/ ADC1_2_IRQHandler() 在ADC转换结束中断中被调用,并且是电机状态:MotorCtrlState = CALICURR时 typedef struct //相电流 { s32 a; s32 b; s32 c; }PHASE_OFFSET; 无 InjectADCEnableADCTri(void) 注入式ADC采样使能 无 无 无 InjectADCDisableADCTri(void) 关闭ADC触发源出发采样 无 无 无 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时被调用 stm32f10x_it.c/ TIM1_UP_IRQHandler() T1上溢中断 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; typedef struct { s16 Iq; 调用函数 无 Foc_port.c/ FOCPortArithmeticModel () (在ADC转换完成被调用) Foc_encoder.c/ FOCEncoderStartUp () (在电机启动对准时被调用) 在何处被调用 ROTOR_CURRENT FOCCoordTransPark(STATOR_CURRENT Curr_Input, s16 Theta) Park变换,Iα和Iβ变换成Id和Iq s16 Theta //转子角度 typedef struct { 无 FOCCoordTransRevParkCircleLimitation (u8 mc_ch) STATOR_VOLTAGE FOCCoordTransRevPark (ROTOR_VOLTAGE Volt_Input) 输出调制比限幅的函数 逆park变换,该函数理应有电机角度作为输入参数,但由于该函数在调用时处在正park变换之后,正park变换已经将转子角度计算在结构体中,所以在这个函数中就不用计算了。 s16 Ialfa; s16 Ibeta; }STATOR_CURRENT; u8 mc_ch //电机通道 typedef struct { s16 Vq; s16 Vd; }ROTOR_ VOLTAGE; s16 hAngle s16 Id; }ROTOR_CURRENT; 无 typedef struct { s16 Valfa; s16 Vbeta; }STATOR_ VOLTAGE; typedef struct { s16 tcos; s16 tsin; }TRIANGLE_COMPONENTS; 无 无 TRIANGLE_COMPONENTS CoordTransTrigFunctions(s16 hAngle) 角度Theta转换为正余弦函数 无 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) s16 FOCCurrentPIDArithmetic (s16 hReference, s16 hPresentFeedback, PID_Struct_t *PID_Struct) 功能描述 初始化矢量电流力矩和磁通的PID初始值 矢量电流力矩和磁通的PID计算 输入参数 PID_Struct_t *PID_Torque PID_Struct_t *PID_Flux PID力矩和励磁参数结构体 s16 hReference //参考值 s16 hPresentFeedback //实际值 PID_Struct_t *PID_Struct//PID参数结构体 输出参数 无 调用函数 无 在何处被调用 foc_port.c/ FOCPortInit () Foc_port.c/ FOCPortArithmeticModel () (在ADC转换完成被调用) Foc_encoder.c/ FOCEncoderStartUp () (在电机启动对准时被调用) PID输出值 无 foc_encoder.c

归属组:arithmetic

描述:正交编码器的配置 函数: 函数 功能描述 输入参数 输出参数 调用函数 在何处被调用 FOCEncoderConfig (void) 编码器配置,涉及到的GPIO、定时器等配置 返回电机电角度 无 无 无 s16 FOCEncoderGetElectricalAngle(u8 mc_ch) u8 mc_ch //电机通道 MotorGetInitABSPos(u8 mc_ch) FOCEncoderReset(u8 mc_ch) 获取电机初始绝对值 在对准后写入对应的编码器初始线数 速度检测函数 计算转子平均机械速度,其实就是一个取平均的函数,用上一个函数取和求平均 电机初始对准,也就是在启动时才会调用,还包含一个FOC算法。 u8 mc_ch //电机通道 u8 mc_ch //电机通道 电机电角度: 0 -> 0 degrees, *S16_MAX-> 180 degrees, *S16_MIN-> -180 degrees 无 无 无 无 无 app_main.c/ App_TaskStart(void *p_arg) 开始任务,环境初始化 Foc_port.c/ FOCPortArithmeticModel () (在ADC转换完成被调用) 无 foc_encoder.c/ FOCEncoderStartUp(u8 mc_ch) 电机启动时调用的 foc_encoder.c/ FOCEncoderCalcAverSpeed(u8 mc_ch) motor_control.c/ MotorCtrl_ManageSpeedPID(u8 mc_ch) 在速度环中调用 stm32f10x_it.c/ ADC1_2_IRQHandler() ADC转换结束中断,当电机状态MotorCtrlState=START时才会调用 FOCEncoderStartUp(u8 mc_ch) s32 FOCEncoder_CalcRotSpeed(u8 mc_ch) s32 FOCEncoderCalcAverSpeed(u8 mc_ch) u8 mc_ch //电机通道 u8 mc_ch //电机通道 返回当前转子速度 返回转子机械角速度 无 FOCEncoder_CalcRotSpeed(mc_ch) 该函数返回转子速度 无 FOCEncoderStartUp(u8 mc_ch) 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}};

本文来源:https://www.bwwdw.com/article/j2pf.html

Top