各位老师好,我有几个问题想不通,还望不吝赐教。我用TI的controlSUITE 调试Sensorless FOC of ACI_2833x例程,LEVEL从1到6都调试通过了。电机的速度只能手动设置SpeedRef的值来更改,现在我想实现电机自动在一段时间正转然后另一段时间反转的功能。
1、我在程序的开头只定义了_iq SpeedRef;但去掉了赋值,然后在MainISR函数里加了一段程序,自定义了int 32 cnt1变量,想在一段时间内给SpeedRef赋正值,一段时间赋负值,实现电机自动正反转的功能。但是编译之后warning显示variable "SpeedRef" was declared but never referenced,下载运行之后也没有实现想要的功能。程序如下:
interruptvoidMainISR(void)
{
IsrTicker++;
cnt1++;
if (0<cnt1<3000000)
{
_iq SpeedRef = _IQ(0.3);
}
elseif (3000000<=cnt1<6000000)
{_iq SpeedRef = _IQ(-0.3);
}
else if(cnt1>=6000000)
{cnt1=1;
_iq SpeedRef = _IQ(0);
}
但是如果我直接在MainISR里赋定值的话电机可以按照给定的速度来运转。我想请问既然这里的SpeedRef没有被引用那么值是从哪里给出的?怎么样才能实现电机自动正反转的功能?
2、通过设置变量我了解到,先是执行main函数初始化部分然后进入for循环等待,中断先执行offsetISR然后在IsrTicker大于20000时跳到MainISR中断函数执行。直接在状态机函数里对SpeedRef赋值也显示warning为variable "SpeedRef" was declared but never referenced,实际运行对电机也是没有影响。那么我想请教这几个问题:for循环里的状态机函数起了什么作用?offsetISR应该是用来补偿ADC的偏移量,既然IsrTicker大于20000后就只执行MainISR函数,为什么不在main函数直接补偿?
谢谢各位老师!
FoCus Lai:
回复 Martin Yu:
试了还是不行,在循环里添加了一个变量cnt2
if (0<cnt1<1000000)
{
SpeedRef=_IQ(0.3);
cnt2++;
}
发现cnt1已经超出了1000000的范围但是cnt2仍在增加
各位老师好,我有几个问题想不通,还望不吝赐教。我用TI的controlSUITE 调试Sensorless FOC of ACI_2833x例程,LEVEL从1到6都调试通过了。电机的速度只能手动设置SpeedRef的值来更改,现在我想实现电机自动在一段时间正转然后另一段时间反转的功能。
1、我在程序的开头只定义了_iq SpeedRef;但去掉了赋值,然后在MainISR函数里加了一段程序,自定义了int 32 cnt1变量,想在一段时间内给SpeedRef赋正值,一段时间赋负值,实现电机自动正反转的功能。但是编译之后warning显示variable "SpeedRef" was declared but never referenced,下载运行之后也没有实现想要的功能。程序如下:
interruptvoidMainISR(void)
{
IsrTicker++;
cnt1++;
if (0<cnt1<3000000)
{
_iq SpeedRef = _IQ(0.3);
}
elseif (3000000<=cnt1<6000000)
{_iq SpeedRef = _IQ(-0.3);
}
else if(cnt1>=6000000)
{cnt1=1;
_iq SpeedRef = _IQ(0);
}
但是如果我直接在MainISR里赋定值的话电机可以按照给定的速度来运转。我想请问既然这里的SpeedRef没有被引用那么值是从哪里给出的?怎么样才能实现电机自动正反转的功能?
2、通过设置变量我了解到,先是执行main函数初始化部分然后进入for循环等待,中断先执行offsetISR然后在IsrTicker大于20000时跳到MainISR中断函数执行。直接在状态机函数里对SpeedRef赋值也显示warning为variable "SpeedRef" was declared but never referenced,实际运行对电机也是没有影响。那么我想请教这几个问题:for循环里的状态机函数起了什么作用?offsetISR应该是用来补偿ADC的偏移量,既然IsrTicker大于20000后就只执行MainISR函数,为什么不在main函数直接补偿?
谢谢各位老师!
FoCus Lai:
回复 Martin Yu:
if(cnt1<400000)
{
SpeedRef = _IQ(0.3);
}
else
{
if(400000<=cnt1<800000)
{
SpeedRef = _IQ(-0.3);
}
if(cnt1>=800000)
// else //用else不能把SpeedRef写进去
{
SpeedRef = _IQ(0.3);
cnt1=1;
}
}
添加上述代码之后电机可以正常的正反转。之前的问题出在_iq SpeedRef = _IQ(-0.3)对SpeedRef重复定义了,还有if函数写的有问题,写在else里的SpeedRef不能被读取。
各位老师好,我有几个问题想不通,还望不吝赐教。我用TI的controlSUITE 调试Sensorless FOC of ACI_2833x例程,LEVEL从1到6都调试通过了。电机的速度只能手动设置SpeedRef的值来更改,现在我想实现电机自动在一段时间正转然后另一段时间反转的功能。
1、我在程序的开头只定义了_iq SpeedRef;但去掉了赋值,然后在MainISR函数里加了一段程序,自定义了int 32 cnt1变量,想在一段时间内给SpeedRef赋正值,一段时间赋负值,实现电机自动正反转的功能。但是编译之后warning显示variable "SpeedRef" was declared but never referenced,下载运行之后也没有实现想要的功能。程序如下:
interruptvoidMainISR(void)
{
IsrTicker++;
cnt1++;
if (0<cnt1<3000000)
{
_iq SpeedRef = _IQ(0.3);
}
elseif (3000000<=cnt1<6000000)
{_iq SpeedRef = _IQ(-0.3);
}
else if(cnt1>=6000000)
{cnt1=1;
_iq SpeedRef = _IQ(0);
}
但是如果我直接在MainISR里赋定值的话电机可以按照给定的速度来运转。我想请问既然这里的SpeedRef没有被引用那么值是从哪里给出的?怎么样才能实现电机自动正反转的功能?
2、通过设置变量我了解到,先是执行main函数初始化部分然后进入for循环等待,中断先执行offsetISR然后在IsrTicker大于20000时跳到MainISR中断函数执行。直接在状态机函数里对SpeedRef赋值也显示warning为variable "SpeedRef" was declared but never referenced,实际运行对电机也是没有影响。那么我想请教这几个问题:for循环里的状态机函数起了什么作用?offsetISR应该是用来补偿ADC的偏移量,既然IsrTicker大于20000后就只执行MainISR函数,为什么不在main函数直接补偿?
谢谢各位老师!
Martin Yu:
回复 FoCus Lai:
之前的问题出在_iq SpeedRef = _IQ(-0.3)对SpeedRef重复定义了:
在函数内部,局部变量替代了全局变量,注意下语法就可以的。
各位老师好,我有几个问题想不通,还望不吝赐教。我用TI的controlSUITE 调试Sensorless FOC of ACI_2833x例程,LEVEL从1到6都调试通过了。电机的速度只能手动设置SpeedRef的值来更改,现在我想实现电机自动在一段时间正转然后另一段时间反转的功能。
1、我在程序的开头只定义了_iq SpeedRef;但去掉了赋值,然后在MainISR函数里加了一段程序,自定义了int 32 cnt1变量,想在一段时间内给SpeedRef赋正值,一段时间赋负值,实现电机自动正反转的功能。但是编译之后warning显示variable "SpeedRef" was declared but never referenced,下载运行之后也没有实现想要的功能。程序如下:
interruptvoidMainISR(void)
{
IsrTicker++;
cnt1++;
if (0<cnt1<3000000)
{
_iq SpeedRef = _IQ(0.3);
}
elseif (3000000<=cnt1<6000000)
{_iq SpeedRef = _IQ(-0.3);
}
else if(cnt1>=6000000)
{cnt1=1;
_iq SpeedRef = _IQ(0);
}
但是如果我直接在MainISR里赋定值的话电机可以按照给定的速度来运转。我想请问既然这里的SpeedRef没有被引用那么值是从哪里给出的?怎么样才能实现电机自动正反转的功能?
2、通过设置变量我了解到,先是执行main函数初始化部分然后进入for循环等待,中断先执行offsetISR然后在IsrTicker大于20000时跳到MainISR中断函数执行。直接在状态机函数里对SpeedRef赋值也显示warning为variable "SpeedRef" was declared but never referenced,实际运行对电机也是没有影响。那么我想请教这几个问题:for循环里的状态机函数起了什么作用?offsetISR应该是用来补偿ADC的偏移量,既然IsrTicker大于20000后就只执行MainISR函数,为什么不在main函数直接补偿?
谢谢各位老师!
Jason Wu4:
回复 FoCus Lai:
if的判断条件改为0<cnt1 && cnt1<1000000