TI中文支持网
TI专业的中文技术问题搜集分享网站

InstaSPIN FOC算法电机关闭问题

平台:利用drv8301 revd驱动板,Lab 10a驱动无刷电机

第一种关闭方法:我在lab 10a.c 文件中的中断函数interrupt void mainISR(void){}里面关闭电机,关闭语句为:gMotorVars.Flag_enableSys=0和gMotorVars.Flag_enableSys = 0。执行完这两条语句后,电机其实还没真正关掉,那么电机是怎么关掉的?也就是电机具体是执行到程序哪一条语句才真正关闭?(是不是执行HAL_disablePwm(halHandle);后才真正关闭电机如果是,程序是怎么运行到这里的?)

第二种关闭方法:我在lab 10a.c 文件中的主循环while(gMotorVars.Flag_enableSys){}里面关闭电机,关闭语句为:gMotorVars.Flag_enableSys=0和gMotorVars.Flag_enableSys = 0。执行完这两条语句后,电机其实还没真正关掉,那么电机是怎么关掉的?也就是电机具体是执行到程序哪一条语句才真正关闭?(是不是执行HAL_disablePwm(halHandle);后才真正关闭电机,如果是,程序是怎么运行到这里的?)

才是真的以上两种关闭电机的方法有什么区别?谢谢。

Eric Ma:

主要是在主循环中,当执行gMotorVars.Flag_enableSys=0和gMotorVars.Flag_enableSys = 0 后,系统的状态机变为idle模式,FOC算法不运行,同时PWM关掉。PWM关掉是关键,这样就不会有驱动输出了。

ERIC

平台:利用drv8301 revd驱动板,Lab 10a驱动无刷电机

第一种关闭方法:我在lab 10a.c 文件中的中断函数interrupt void mainISR(void){}里面关闭电机,关闭语句为:gMotorVars.Flag_enableSys=0和gMotorVars.Flag_enableSys = 0。执行完这两条语句后,电机其实还没真正关掉,那么电机是怎么关掉的?也就是电机具体是执行到程序哪一条语句才真正关闭?(是不是执行HAL_disablePwm(halHandle);后才真正关闭电机如果是,程序是怎么运行到这里的?)

第二种关闭方法:我在lab 10a.c 文件中的主循环while(gMotorVars.Flag_enableSys){}里面关闭电机,关闭语句为:gMotorVars.Flag_enableSys=0和gMotorVars.Flag_enableSys = 0。执行完这两条语句后,电机其实还没真正关掉,那么电机是怎么关掉的?也就是电机具体是执行到程序哪一条语句才真正关闭?(是不是执行HAL_disablePwm(halHandle);后才真正关闭电机,如果是,程序是怎么运行到这里的?)

才是真的以上两种关闭电机的方法有什么区别?谢谢。

user4708725:

回复 Eric Ma:

在中断里面关闭,FOC继续运行?

平台:利用drv8301 revd驱动板,Lab 10a驱动无刷电机

第一种关闭方法:我在lab 10a.c 文件中的中断函数interrupt void mainISR(void){}里面关闭电机,关闭语句为:gMotorVars.Flag_enableSys=0和gMotorVars.Flag_enableSys = 0。执行完这两条语句后,电机其实还没真正关掉,那么电机是怎么关掉的?也就是电机具体是执行到程序哪一条语句才真正关闭?(是不是执行HAL_disablePwm(halHandle);后才真正关闭电机如果是,程序是怎么运行到这里的?)

第二种关闭方法:我在lab 10a.c 文件中的主循环while(gMotorVars.Flag_enableSys){}里面关闭电机,关闭语句为:gMotorVars.Flag_enableSys=0和gMotorVars.Flag_enableSys = 0。执行完这两条语句后,电机其实还没真正关掉,那么电机是怎么关掉的?也就是电机具体是执行到程序哪一条语句才真正关闭?(是不是执行HAL_disablePwm(halHandle);后才真正关闭电机,如果是,程序是怎么运行到这里的?)

才是真的以上两种关闭电机的方法有什么区别?谢谢。

user4708725:

回复 user4708725:

我是把电机关闭函数放在中断函数的最底端,就是把电机关闭函数放在CTRL_setup(ctrlhandle);和return;之间,运行FOC的代码在电机关闭函数的上面,这样和放在主循环里面关闭有什么区别呢?

平台:利用drv8301 revd驱动板,Lab 10a驱动无刷电机

第一种关闭方法:我在lab 10a.c 文件中的中断函数interrupt void mainISR(void){}里面关闭电机,关闭语句为:gMotorVars.Flag_enableSys=0和gMotorVars.Flag_enableSys = 0。执行完这两条语句后,电机其实还没真正关掉,那么电机是怎么关掉的?也就是电机具体是执行到程序哪一条语句才真正关闭?(是不是执行HAL_disablePwm(halHandle);后才真正关闭电机如果是,程序是怎么运行到这里的?)

第二种关闭方法:我在lab 10a.c 文件中的主循环while(gMotorVars.Flag_enableSys){}里面关闭电机,关闭语句为:gMotorVars.Flag_enableSys=0和gMotorVars.Flag_enableSys = 0。执行完这两条语句后,电机其实还没真正关掉,那么电机是怎么关掉的?也就是电机具体是执行到程序哪一条语句才真正关闭?(是不是执行HAL_disablePwm(halHandle);后才真正关闭电机,如果是,程序是怎么运行到这里的?)

才是真的以上两种关闭电机的方法有什么区别?谢谢。

Igor An:

回复 user4708725:

关闭电机一般我们会用变量gMotorVars.Flag_Run_Identify = 0 来做,而不是用gMotorVars.Flag_enableSys=0。

当gMotorVars.Flag_Run_Identify = 0 或者 1时,电机运行状态机会切换状态,在idel 状态中会调用Disable pwm,来关机。

gMotorVars.Flag_enableSys=0 只是会不去运行状态机检测和切换的那块代码。

平台:利用drv8301 revd驱动板,Lab 10a驱动无刷电机

第一种关闭方法:我在lab 10a.c 文件中的中断函数interrupt void mainISR(void){}里面关闭电机,关闭语句为:gMotorVars.Flag_enableSys=0和gMotorVars.Flag_enableSys = 0。执行完这两条语句后,电机其实还没真正关掉,那么电机是怎么关掉的?也就是电机具体是执行到程序哪一条语句才真正关闭?(是不是执行HAL_disablePwm(halHandle);后才真正关闭电机如果是,程序是怎么运行到这里的?)

第二种关闭方法:我在lab 10a.c 文件中的主循环while(gMotorVars.Flag_enableSys){}里面关闭电机,关闭语句为:gMotorVars.Flag_enableSys=0和gMotorVars.Flag_enableSys = 0。执行完这两条语句后,电机其实还没真正关掉,那么电机是怎么关掉的?也就是电机具体是执行到程序哪一条语句才真正关闭?(是不是执行HAL_disablePwm(halHandle);后才真正关闭电机,如果是,程序是怎么运行到这里的?)

才是真的以上两种关闭电机的方法有什么区别?谢谢。

user4708725:

回复 Igor An:

非常感谢您的回答。

假设电机运行速度为300rpm,在中断函数中delay2s左右,2s后把电机的速度设置为0rpm,再设置一个定时器延时2s左右,定时器延时2s后执行电机关机程序,此时的电机会产生一个制动力,这是为什么?

平台:利用drv8301 revd驱动板,Lab 10a驱动无刷电机

第一种关闭方法:我在lab 10a.c 文件中的中断函数interrupt void mainISR(void){}里面关闭电机,关闭语句为:gMotorVars.Flag_enableSys=0和gMotorVars.Flag_enableSys = 0。执行完这两条语句后,电机其实还没真正关掉,那么电机是怎么关掉的?也就是电机具体是执行到程序哪一条语句才真正关闭?(是不是执行HAL_disablePwm(halHandle);后才真正关闭电机如果是,程序是怎么运行到这里的?)

第二种关闭方法:我在lab 10a.c 文件中的主循环while(gMotorVars.Flag_enableSys){}里面关闭电机,关闭语句为:gMotorVars.Flag_enableSys=0和gMotorVars.Flag_enableSys = 0。执行完这两条语句后,电机其实还没真正关掉,那么电机是怎么关掉的?也就是电机具体是执行到程序哪一条语句才真正关闭?(是不是执行HAL_disablePwm(halHandle);后才真正关闭电机,如果是,程序是怎么运行到这里的?)

才是真的以上两种关闭电机的方法有什么区别?谢谢。

Igor An:

回复 user4708725:

如果是用gMotorVars.Flag_Run_Identify = 0 来做关机的话,应该不会产生制动效果,因为只是将所有PWM Disable掉,电机会处于自由降速状态,逆变器不会注入任何功率到电机,所以也根本不会有任何制动能力。

而用gMotorVars.Flag_enableSys=0来关机的话,电机表现可能会有些随机性,这个可能需要你根据你加入到代码,看gMotorVars.Flag_enableSys=0后有哪些环节会受到影响。

平台:利用drv8301 revd驱动板,Lab 10a驱动无刷电机

第一种关闭方法:我在lab 10a.c 文件中的中断函数interrupt void mainISR(void){}里面关闭电机,关闭语句为:gMotorVars.Flag_enableSys=0和gMotorVars.Flag_enableSys = 0。执行完这两条语句后,电机其实还没真正关掉,那么电机是怎么关掉的?也就是电机具体是执行到程序哪一条语句才真正关闭?(是不是执行HAL_disablePwm(halHandle);后才真正关闭电机如果是,程序是怎么运行到这里的?)

第二种关闭方法:我在lab 10a.c 文件中的主循环while(gMotorVars.Flag_enableSys){}里面关闭电机,关闭语句为:gMotorVars.Flag_enableSys=0和gMotorVars.Flag_enableSys = 0。执行完这两条语句后,电机其实还没真正关掉,那么电机是怎么关掉的?也就是电机具体是执行到程序哪一条语句才真正关闭?(是不是执行HAL_disablePwm(halHandle);后才真正关闭电机,如果是,程序是怎么运行到这里的?)

才是真的以上两种关闭电机的方法有什么区别?谢谢。

user4708725:

回复 Igor An:

给定速度为零,关闭电机有制动力产生,逆变器是怎么注入功率到电机?

平台:利用drv8301 revd驱动板,Lab 10a驱动无刷电机

第一种关闭方法:我在lab 10a.c 文件中的中断函数interrupt void mainISR(void){}里面关闭电机,关闭语句为:gMotorVars.Flag_enableSys=0和gMotorVars.Flag_enableSys = 0。执行完这两条语句后,电机其实还没真正关掉,那么电机是怎么关掉的?也就是电机具体是执行到程序哪一条语句才真正关闭?(是不是执行HAL_disablePwm(halHandle);后才真正关闭电机如果是,程序是怎么运行到这里的?)

第二种关闭方法:我在lab 10a.c 文件中的主循环while(gMotorVars.Flag_enableSys){}里面关闭电机,关闭语句为:gMotorVars.Flag_enableSys=0和gMotorVars.Flag_enableSys = 0。执行完这两条语句后,电机其实还没真正关掉,那么电机是怎么关掉的?也就是电机具体是执行到程序哪一条语句才真正关闭?(是不是执行HAL_disablePwm(halHandle);后才真正关闭电机,如果是,程序是怎么运行到这里的?)

才是真的以上两种关闭电机的方法有什么区别?谢谢。

user4708725:

回复 user4708725:

我刚刚试了一下,如果用gMotorVars.Flag_Run_Identify = 0 来做关机的话,实际上也会产生制动效果。

给定速度为零,关闭电机有制动力产生,这个制动力是怎么产生的?逆变器是怎么注入功率到电机?

平台:利用drv8301 revd驱动板,Lab 10a驱动无刷电机

第一种关闭方法:我在lab 10a.c 文件中的中断函数interrupt void mainISR(void){}里面关闭电机,关闭语句为:gMotorVars.Flag_enableSys=0和gMotorVars.Flag_enableSys = 0。执行完这两条语句后,电机其实还没真正关掉,那么电机是怎么关掉的?也就是电机具体是执行到程序哪一条语句才真正关闭?(是不是执行HAL_disablePwm(halHandle);后才真正关闭电机如果是,程序是怎么运行到这里的?)

第二种关闭方法:我在lab 10a.c 文件中的主循环while(gMotorVars.Flag_enableSys){}里面关闭电机,关闭语句为:gMotorVars.Flag_enableSys=0和gMotorVars.Flag_enableSys = 0。执行完这两条语句后,电机其实还没真正关掉,那么电机是怎么关掉的?也就是电机具体是执行到程序哪一条语句才真正关闭?(是不是执行HAL_disablePwm(halHandle);后才真正关闭电机,如果是,程序是怎么运行到这里的?)

才是真的以上两种关闭电机的方法有什么区别?谢谢。

Igor An:

回复 user4708725:

当gMotorVars.Flag_Run_Identify = 0 时,软件会执行Disable PWM,相当于逆变器的六个管子全部断开,这种情况下逆变器是不会输出任何电流、电压加到电机上,所以不会有制动,不是很清楚为什么你会看到制动效果,或者你修改过代码,增加了一些处理。

当速度指令设为0时,由速度环控制降速,自动调节产生的制动力矩。

逆变器控制电机的过程就是将电压加到电机上,功率流向是从逆变器到电机,由逆变器供能量让电机运转,就是我说的注入功率啊。

平台:利用drv8301 revd驱动板,Lab 10a驱动无刷电机

第一种关闭方法:我在lab 10a.c 文件中的中断函数interrupt void mainISR(void){}里面关闭电机,关闭语句为:gMotorVars.Flag_enableSys=0和gMotorVars.Flag_enableSys = 0。执行完这两条语句后,电机其实还没真正关掉,那么电机是怎么关掉的?也就是电机具体是执行到程序哪一条语句才真正关闭?(是不是执行HAL_disablePwm(halHandle);后才真正关闭电机如果是,程序是怎么运行到这里的?)

第二种关闭方法:我在lab 10a.c 文件中的主循环while(gMotorVars.Flag_enableSys){}里面关闭电机,关闭语句为:gMotorVars.Flag_enableSys=0和gMotorVars.Flag_enableSys = 0。执行完这两条语句后,电机其实还没真正关掉,那么电机是怎么关掉的?也就是电机具体是执行到程序哪一条语句才真正关闭?(是不是执行HAL_disablePwm(halHandle);后才真正关闭电机,如果是,程序是怎么运行到这里的?)

才是真的以上两种关闭电机的方法有什么区别?谢谢。

user4708725:

回复 Igor An:

我修改过代码。

电机扭矩值设定方法:假设设定35N.cm扭矩,我的语句如下:USER_MOTOR_MAX_CURRENT=5;

当速度指令设为0时,当我给电机施加动态负载时,电机会在我设定的扭矩值(比如说设定为35N.cm)35N.cm和-35N.cm之间缓慢移动:电机正向缓慢到达35N.cm时会反向运行,直到扭矩达到-35N.cm,电机又正向缓慢移动,直到扭矩达到35N.cm,如此往复运动。

为什么会产生这样的现象?

即使我改变加速度的大小,电机正向移动到35N.cm和反向移动到-35N.cm的时间都不发生改变,如果由速度环控制降速,自动调节产生的制动力矩,加速度改变,电机移动的时间应该要变化,这是为什么?

赞(0)
未经允许不得转载:TI中文支持网 » InstaSPIN FOC算法电机关闭问题
分享到: 更多 (0)