具有ASEK DLL谐波线性化功能的先进编程算法
具有ASEK DLL谐波线性化功能的先进编程算法
作者:K。罗伯特•软化
亚博棋牌游戏快板微系统公司有限责任公司
介绍
“工业自动化和机器人技术”,即电动压力转向和电机位置传感,详细使用都都监测转轴(以以上或离轴排列形式)的角度。
在设计中使用繁体时,磁场输入在整个旋转范围很可口不行,它这些输入误差会系统内测测测。
A1332和A1335可采用的谐波线性化能以更多15种种正谐波的形式应用力化,利用快速傅立叶变换(fft)可确定它们的相位和振幅,根据磁体在角度角度仪器中,在角度角度器in oc ocke的一次发产物的数据可口fft。通用ant allegro提供的软件软件数,并对片内EEPROM进行程,可用这种技术。本发明用途明显了,当allegro提供的软件灵活要使定制时,客户客户使使使使能能流手机。
编程要求
所有软件都是在使用。net 4.0的微软Visual Studio 2010环境下开发的。请为您要使用的器件下载命令库(c# / . net),并添加到其所含的3个DLL的项目参考中。
收集数据
首先,关键词有钢铁锰化法管理;这这零点偏移,钢丝性化(ro),短行程反转(iv)和旋转晶片位元(rd)。驾驶型性化调节元(Rd)。预预性化可口保持开启,如orate设置,IIR过滤仪(FI)和载线性旋转(LR)。
沿角度增加的位置移动编码器。如果角度传感器集成电路的输出未相应增大,可设置LR位元以反转角度传感器IC输出的反向,或在校准时沿反方向转动编码器,在此情况下,可能需要设置后线性化旋转位元(RO)。参阅“A1332 / A1335编程参考”了解更多详情。
最佳最佳方法是空间距相等的数量旋转,这样产出的数量数量是2的次数。通行,32或44空间距的数据就足够了。如果不再,可是数码,然后然后必须按节节介绍的方法预致理性数据。
另一种收集所需数据点的方法是多次旋转目标,然后按预定义的间隔收集数据。当收集到足够的数据点覆盖目标的整个旋转范围时,接下来必须按下节介绍的方法预处理数据。
预处理数据
如果收集的数据点数量不是 2 的幂数,或者收集的数据点间距不等,必须调整数据点数组的长度并/或使它们间距相等。要对数据执行此操作,可调用ResizePointArray例程。
参数x是编码器数量的数量,幂y是在该编码器数码中的器材。当前newsize是更新调整的数量大小。如果如果x设置为主,则假设已按从0开始360结束的相等间距收集数。如果偏x不是空,则需要在调整数组大小,为输入数组。
double[] ResizePointArray(double[] x, double[] y, int newSize)
此此程会在输入数组上行三次插值,以采用所需的数量,生成间距的数量。
初始经理
数据收集完毕,并形成长度为 2 的幂数的数组后,就可以计算谐波系数了。要计算谐波系数,可调用CalculateHarmonicLinearCoefficients例程。
HarmonicCoeffient [] CalculateHarmonicLoceAlcofience(Double []点,Bool PigetError)
其输入是已收集的角度数组。此例程会执行FFT,并会返回系数数组和一个警告标记。当一个或多个输入角比例程计算的角度大 20 度时,需要设置点误差警告标记。
以一个包含 8 个输入项的数组为例,例程计算的角度应为 [0, 45, 90, 135, 180, 225, 270, 315]。如果输入数组是[0,90,135,180,204,270,315],则例程会设置pointError,因为第6个输入项的误差超过20度。
选择谐波
当所有谐波系数已计算完毕后,必须选择所需的谐波。通常,计算例程生成的谐波数量会超过器件能支持的谐波数量,所以,必须选择一些算法以选择相关的谐波。
使用谐波的数量重量所所件种类和功能.a1332的谐波最大数数卷重,但但使使最,一体可操作的师会使用默认值,如如行程和特性的i2c与spi设置。不用使用默认值时,这些可程度功能的谐波大数数量是9.a1335的谐波大数数量是11,但要达到数量,一定可操作功能会使用默认值,如如行程设置。不使用默认值时,这些可程程功能的谐波大数是8。
最简单的算法是按照所需的谐波数量选择第一个谐波。这种方法很简单,它选择的谐波不会对输出产生显著的影响。
Allegro A1335的示例程器目前使用的语法是选择振幅大约0.3的谐波。需要注意的是,当前软件的一个,在所选之间的一起来是过跳过过4个谐波。谐波超过4个,还需要选择最后一个选定和所需谐波之间的没有谐波。
器械程程
谐波选择完毕后,可调用例程GenerateHarmonicLinearizationDeviceValues生成要写入器件的数的值。
HarmonicDeviceValues[] GenerateHarmonicLinearizationDeviceValues (HarmonicCoefficients[] coefficients)
谐波跑数传递此此程中,它会返回器材件需程抛出的唯编。在例程中的第一次是在所例数分数的过过。
要对器材传导谐波钢化碳作业,必须设置HL标记,必须将har_max字段字段要要使用的数量,同时必须编写relmonic_phase_n,adv_n和almonic_amplitude_n字段。
代码实例
使用系统;
使用Allegro.asek;
命名空间handoniclinearizationexample.
{
公开课HarmonicLinearizationExample
{
公共HandonicLizationExample()
{
}
public void ProgramHarmonicLinearization(string filePath, ASEK asekProgrammer)
{
尝试
{
HasbonicCoeffients [] HC;
bool pointerror = false;
Double [] points = null;
字符串FieldBuffer = file.ReadAllText(FILEPATH);
字符串行;
列表
list
/ / 1.1收集数据
// 从文本文件中读取角度。忽略空白行或以#打头的行。
if(!string.isnulloremaly(fieldbuffer))
{
使用StringReader sr = new StringReader(fieldBuffer)
{
while ((line = sr.ReadLine()) != null)
{
行= line.Trim ();
if(string.isnulloremaly(line)|| line.startswith(“#”))
{
继续;
}
// 每行可采用 2 种格式中的 1 种。
/ /首行包含编码器角度,其次是逗号隔开的器件角度(22.125,23.543)
//或只有器材角度(23.543)
//如果角度的间距不等,则两个数码都需要。
String []值= line.split(',');
如果值。长度> 1)
{
double encoder = convert.todouble(值[0]);
而(编码器> = 360.0)
{
编码器- = 360.0;
}
而(编码器<0.0)
{
编码器+ = 360.0;
}
Encoderreadings.add(编码器);
deviceReadings.Add (Convert.ToDouble(值[1]));
}
别的
{
deviceReadings.Add (Convert.ToDouble(值[0]));
}
}
}
/ / 1.2预处理数据
如果(! powerOfTwo (deviceReadings.Count ()))
{
//如果数据量差,只只最后一个,
if (powerOfTwo(deviceReadings.Count() - 1))
{
deviceReadings.RemoveAt (deviceReadings.Count () - 1);
点= devicereadings.toArray();
}
别的
{
//否则应计算所所的基本数量。
// 如果样本数量小于 64,
//可四舍五入至接近2的数码的数码,否则否则向下取数。
int iscandsamples = 8;
虽然(所探伤的
潜水* = 2;
}
if (deviceReadings.Count() > 64)
{
jailenceSamples / = 2;
}
//如果销有仪器偏分数,可器材销量的间隙。
如果(EncodErreadings.Count()!= devicereadings.count())
{
// 将角度列表转换为数组,然后调整其长度。
点=((iHarmoniclineArization)ASekprogrammer).resizepointarray(null,devicereadings.toArray(),希望的arample);
}
别的
{
// 将角度列表转换为数组,然后调整其长度。
points = ((IHarmonicLinearization)asekProgrammer).ResizePointArray(encoderreads . toarray (), deviceReadings.ToArray(), desiredSamples);
}
}
}
别的
{
// 将角度列表转换为数组
点= devicereadings.toArray();
}
// 1.3初始管理
// 通过数据点数组计算系数。
HC =((IharmoniclineArization)Asekprogrammer).CalculateHarmonicLineAlcoefiers(点,out PointRor);
//当一个更多个比例程程的计算结果大20次,就会出现数码误差。
// 以包含 8 个数值的数组为例 [0, 45, 90, 135, 180, 204, 270, 315],计算例程会为
// 第 6 个输入项发放警告标记,因为它应该接近 225。
if(pointerror)
{
对话框。显示(“其中一个入射角比预期值大20度。”);
}
// 1.4选择谐波
// 一组谐波系数计算完毕后,需要选择系数。计算例程
//返回的系数数量通常会超过器件能支持的系数数量,因此需要
// 需要使用一些限制系数数量的方法。可以先选出前 8 个,也可使用其他方法。
int numberOfHarmonicComponents = hc.Length;
int numberofselectedharmoniccomponents = 0;
int lastharmoniccomponentselected = 0;
int maxharmoniccomponents选择= 8;//在影响器材的其他其他前,可用谐波的体重数量
/ /就此例而言,选择前8个振幅超过0.3的谐波。
For (int index = 0;指数< numberOfHarmonicComponents;+ +指数)
{
如果(hc(指数)。振幅> 0.3)&& (numberOfSelectedHarmonicComponents < maxHarmonicComponentsSelected))
{
//如果要选择的谐波和选择的最后谐波
// 之间的谐波数量大于 4,还需要
// 选择它们之间的一些谐波。
int skip = index - lastharmoniccomponentselect;
If (skip > 4)
{
// 确保要选择的谐波数量
//不含所需的数量。
INT NummumNeeded = Skip / 4;
if ((numberNeeded + numberOfSelectedHarmonicComponents) <= maxHarmonicComponentsSelected)
{
For (int jndex = 1;jndex < = numberNeeded;+ + jndex)
{
hc [jndex]。选择= true;
++ numberofselectedharmoniccomponents;
}
hc(指数)。选择= true;
++ numberofselectedharmoniccomponents;
}
别的
{
// 代码在选择所需的谐波时,超过
//所选选数的体重数量,因此它会停止选择。
打破;
}
}
别的
{
hc(指数)。选择= true;
++ numberofselectedharmoniccomponents;
}
lastHarmonicComponentSelected =指数;
}
}
// 如果未选择谐波,可选择前 8 个。
if(numberofselectedharmoniccomponents == 0)
{
for(int i = 0;(i
HC [i] .select = true;
++ numberofselectedharmoniccomponents;
}
}
// 1.5器械录入程度
/ /生成需要写入eepm的数的值。
[] eepromValues = ((IHarmonicLinearization)asekProgrammer).GenerateHarmonicLinearizationDeviceValues(hc);
// 确保器件通电
asekprogrammer.setvcc(5.0);
//确保写入器材的EEPROM,这这使SRAM结构可以,并关键词处理器
((ISRAMWriteAccessMode) asekProgrammer) .SetSRAMWriteAccessMode ();
((IProcessorMode) asekProgrammer) .SetProcessorIdle ();
//在EEPROM中开启谐钢筋化
((IRegisterAccess) asekProgrammer) .WritePartialRegister (MemoryAccessType。扩展,0x306, 1,15,15);//输出
// 设置要使用的谐波数量
((IRegisterAccess) asekProgrammer) .WritePartialRegister (MemoryAccessType。0 x309 eepromValues扩展。19岁的长度16);/ / HAR_MAX =谐波数量
//对于谐波
for(uint index = 0; index
UINT RegisterValue =(UINT)(((EEPROMVALUES [index] .phase << 12)&0x0fff000)+
((eepromValues(指数)。advance << 10) & 0x0C00) +
(EEPROMVALUES [索引] .AMPLUTY&0x03FF));
((iRegisterAccess)ASekprogrammer).writeRegister(MemedumentAccessType.extended,0x30c + index,procestervalue);// almonic_phase,adv和harmonic_amplitude
}
//关键字电阻,然后然后再通,确保器材使使使用新型的线析。
asekProgrammer.SetVccOff ();
asekprogrammer.setvcc(5.0);
}
}
捕获(例外EX)
{
MessageBox.Show (ex.Message);
}
}
private bool powerOfTwo(int值)
{
int log2npoints = 0;
int j =值;
在((j > 0) & & ((j & 1) = = 0)) / /计算输入值的对数底数2
{
log2npoints + +;
j > > = 1;
}
If ((value < 2) | (value != (1 << log2npoints)))
{
返回错误;
}
返回真;
}
}
}
角度输入文件的格式
此文件包含一个角度值列表。如果有两个数值被逗号隔开,则第一个数值是编码器角度,第二个数值是器件角度。行可以是空白的,如果它们以 # 打头,则可将其视为注释。
角度输入文库实例:
329.59
354.81
6.832
13.566
17.592
20.228
22.638
24.638
25.956
27.454
28.77
30.054
30.966
包含两列时:
0123年
22.5,145.5
45168年
67.5,190.5
90213年
112.5,235.5.
135,258
157.5,280.5
180303年
202.5,325.5
225348年
247.5, 10.5
270,33
292.5,55.5.
315年,78年
337.5,100.5