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

Sensorless FOC of ACI_2833x例程如何实现电机自动正反转

各位老师好,我有几个问题想不通,还望不吝赐教。我用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

赞(0)
未经允许不得转载:TI中文支持网 » Sensorless FOC of ACI_2833x例程如何实现电机自动正反转
分享到: 更多 (0)