前段时间研究步进电机的加减速(S曲线)控制,需要求出电机在不同脉冲对应的时刻值。
需要求出电机在1,2,3....N个时刻的时刻 t 的值,公式如下:
N( t) = ( f 0 + C) t + τC (exp(-t*τ) - 1) (1)
变形为f(t) = ( f 0 + C) t + τC (exp(-t*τ) - 1) - N,需要求出N为不同值 f(t) = 0对应的 t 值 N 可以为0,1,2,3......(2k+1),也可以是0,2,4,6......(2K)。
显然人工笔算不太现实,由此想到了牛顿迭代。
证明知(1)式收敛,满足牛顿迭代条件。
python代码如下:
# -*- coding: cp936 -*-
import math
tao = 0.00050 #加速时间常数
f0 = 50.0 #50 Hz
fm = 150000.0 #50 KHz
N = 1
Datanum = 200
table = [0.0]
timevalue = [0.0]
frequency = [0.0]
def f(x):
return (f0+fm)*x + tao*fm*(math.exp(-x/tao) - 1.0) - N
def fd(x):
return f0 + fm*(1.0 - math.exp(-x/tao))
def newtonMethod(k,assum):
time = k
x = assum
Next = 0
A = f(x)
B = fd(x)
#print('A = ' + str(A) + ',B = ' + str(B) + ',time = ' + str(time))
if f(x) == 0.000000000001:
return time,x
else:
Next = x - A/B
#print('Next x = '+ str(Next))
#if A == f(Next):
if math.fabs(Next - x) < 0.000000000001:
#if math.fabs(f(Next)) < 0.000000000001:
#print('Meet f(x) = 0,x = ' + str(Next))#设置迭代跳出条件,同时输出满足f(x) = 0的x值
table.append(x)#将时刻值保存在列表里
frequency.append(round(1/(table[N] - table[N-1]),2))#每个时刻对应的频率,保留小数点后两位
timevalue.append(int(80000000*(table[N] - table[N-1])+0.5))#求出每个脉冲的定时值,转化为整型数
else:
return newtonMethod(k+1,Next)
for N in range(1,Datanum+1,1):
newtonMethod(0,0.00001)
print ("不同脉冲对应的时刻值:")
print table[1:Datanum+1]
print ("不同脉冲对应的频率值:")
print frequency[1:Datanum+1]
print ("不同脉冲对应的计数值:")
print timevalue[1:Datanum+1]#定时器计数值
当然其他编程语言也可实现,例如C。