平台:利用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的时间都不发生改变,如果由速度环控制降速,自动调节产生的制动力矩,加速度改变,电机移动的时间应该要变化,这是为什么?
TI中文支持网


