zddvszw 发表于 2018-1-8 14:31:46

DSPIC33EP汇编关于直线电机控制速度滤波求助

本帖最后由 zddvszw 于 2018-1-8 14:46 编辑

本人最近使用DSPIC33ep做同步直线电机控制,线性霍尔做速度反馈。偶然发现一种滤波算法,效果不错。未使用这种方法滤波,由于线性霍尔周期切换(直线电机一个周期组运行完,进入下一个周期),导致反馈速度的跳动。使用使用,反馈速度很光滑,就是有滞后。本人不太懂汇编,麻烦有经验的朋友帮忙解释下。到时候给大家共享结果。代码和效果图如下:
      
          .global   _CalcOmegaFltred
          .global   CalcOmegaFltred

_CalcOmegaFltred:
CalcOmegaFltred:

mov_SMC_OmegaFltred,w0
mov_SMC_Omega,w4
mov_SMC_FiltOmeCoef,w5

lac    w0,A
mpy    w4*w5,B
add    A

mov   _SMC_OmegaFltred,W4
mpy   w4*w5,B
neg   B
add   A

sac.r   A,#0,w0
mov   w0,_SMC_OmegaFltred

return

         .end

zddvszw 发表于 2018-1-8 14:33:29

补充下,_SMC_OmegaFltred是滤波输出的变量,_SMC_Omega为反馈速度输入,_SMC_FiltOmeCoef是一个系数

20061002838 发表于 2018-1-8 15:17:43

out = (1-k)out + k*in

zddvszw 发表于 2018-1-10 15:42:37

20061002838 发表于 2018-1-8 15:17
out = (1-k)out + k*in

neg不是取反的命令吗?这个公式没有体现吧?

20061002838 发表于 2018-1-10 15:53:09

out = out + k * in + (-k*out)

zddvszw 发表于 2018-1-10 16:10:57

20061002838 发表于 2018-1-10 15:53
out = out + k * in + (-k*out)

之前看错了,不好意思,neg是取补码的指令。

zddvszw 发表于 2018-1-10 16:12:03

20061002838 发表于 2018-1-8 15:17
out = (1-k)out + k*in

(out*k)补码是不是等于1-out*k?

20061002838 发表于 2018-1-10 16:21:56

就是取反,C语言‘-’的作用

zddvszw 发表于 2018-1-11 11:48:05

20061002838 发表于 2018-1-10 15:53
out = out + k * in + (-k*out)

不对,我按照这个公式用c表示,效果不同

flying_bai 发表于 2018-1-11 11:56:51

问个问题,为什么用DSPIC33ep?最近也被这个单片机搞得头大,做法都是汇编的,改成C就不能运行!{:sweat:}

K7toubleaz 发表于 2018-4-20 12:19:51

我也是用dsPIC33EP做馬達控制,不過我是接旋轉譯碼器1000pps的,利用MCU內部的QEI介面去讀取位置程式再去計算速度,用C語言寫的。

页: [1]
查看完整版本: DSPIC33EP汇编关于直线电机控制速度滤波求助