|
本帖最后由 myqiang1990 于 2013-2-23 13:00 编辑
大家看看上面的参数,然后对照程序,自己可以仿制一个,程序生存的数据是将3段S曲线,包括加加速和加减速段,这个程序是将S曲线离散成你想要的升频和对应频段内步值,然后分段升频,程序中查表加速就OK了~~(支持变细分哦!!!!抵挡单片机跑高速的福音~~~ )软件是delphi7啊~~没有大家就去网上下巴~~
不懂的,大家可以讨论讨论哈~~~因为版权问题,这个软件就不公开了,大家对照我贴的图片的参数,然后对照下面的代码,就懂了,子不过是自己自己建一个新工程而已,注意我用了iocmp控件,没有的童鞋,在这里下载~~http://www.amobbs.com/thread-5267464-1-1.html
- //////////////////////////////////S曲线生产////////////////////////////////
- //////////////////////////////////S曲线生产////////////////////////////////
- //////////////////////////////////S曲线生产////////////////////////////////
- //////////////////////////////////S曲线生产////////////////////////////////
- procedure TForm1.SCurve();
- var
- aa:double;//加加速度
- v1:integer;//拐点速度
- t1:double;//拐点时间
- dt:double;//时间间隔
- vstart, vend:integer;//起始速度(HZ)
- xifen:integer;//细分数
- freq:integer;//定时器频率
- i,j, allsteps:integer;//脉冲个数
- T, time:double;
- freqleves:array[0..20000] of integer;
- freqsteps:array[0..20000] of integer;
- timerdata:array[0..20000] of integer;
- showstr : string;
- begin
- aa := StrToFloat(edit17.Text);//加加速度
- vstart := StrToInt(edit18.Text);//启动频率
- vend := StrToInt(edit19.Text);//启动频率
- xifen := StrToInt(edit37.Text);//细分数
- freq := StrToInt(edit16.Text) ;//定时器频率
- time := StrToFloat(edit20.Text);//频段保持时间
- T := 0;
- i := 0;
- allsteps := 0;
- showstr := ' ';
- v1 := trunc((vstart + vend) / 2);//求出拐点频率
- t1 := Sqrt(2 * (v1 - vstart) / aa);//求出拐点时间(s)
- dt := time / 1000; //求出时间间隔 (s)
- //////////////调试模式 /////
- if checkbox12.Checked then
- begin
- memo1.Lines.Add('v1(拐点频率)------->' + InttoStr(v1));
- memo1.Lines.Add('t1(拐点时间)------->' + FloattoStr(t1));
- memo1.Lines.Add('dt(减速间隔)------->' + FloattoStr(dt) + #13);
- memo1.Lines.Add( #13);
- end;
- //求出运加速度段
- while (T <= t1) do
- begin
- freqleves[i] := trunc(vstart + 1 / 2 * aa * T * T);
- freqleves[i] := freqleves[i];//按细分数扩大倍速
- freqsteps[i] := trunc(dt * freqleves[i]);//求出频点的内部步数
- //allsteps := allsteps + freqsteps[i]; //求出总脉冲数
- //if freqsteps[i] = 0 then
- //freqsteps[i] := freqsteps[i]+ 1;
- timerdata[i] := trunc(freq / (freqleves[i] * xifen) + 0.5);//求出定时器初值
- //调试模式
- if checkbox12.Checked then
- begin
- memo1.Lines.Add('freqleves(台阶频率)'+IntToStr(i)+'------->' + inttoStr(freqleves[i]));
- memo1.Lines.Add('freqsteps(台阶步数)'+IntToStr(i)+'------->' + inttoStr(freqsteps[i]));
- memo1.Lines.Add('timerdata(定时器初值)'+IntToStr(i)+'------->' + inttoStr(timerdata[i]));
- memo1.Lines.Add('T(已累加时间)------->' + Format('%.3f', [T]) + #13);
- memo1.Lines.Add( #13);
- end;
- iXYPlot1.Channel[0].AddXY(i, freqleves[i]); //画出频率曲线
- iXYPlot1.Channel[1].AddXY(i, freqsteps[i]); //步值曲线
- if not checkbox13.Checked then
- iXYPlot1.Channel[10].AddXY(i, timerdata[i]); //定时器初值曲线
- T := T + dt;//递增到下一个频点的时间
- i := i + 1;
- end;
- //求出运减速段
- i :=i - 1 ;
- while (freqleves[i] <= vend) do
- begin
- i :=i + 1 ;
- freqleves[i] := trunc((2 * aa * T * Sqrt(2* (v1 - vstart) / aa))-(1 / 2 * aa * T * T) - (2 * v1) + (3 * vstart));
- freqleves[i] := freqleves[i];//按细分数扩大倍速
- freqsteps[i] := trunc(dt * freqleves[i]);//求出频点的内部步数
- //allsteps := allsteps + freqsteps[i]; //求出总脉冲数
- //if freqsteps[i] = 0 then
- // freqsteps[i] := freqsteps[i]+ 1;
- timerdata[i] := trunc(freq / (freqleves[i] * xifen) + 0.5);//求出定时器初值
- //调试模式
- if checkbox12.Checked then
- begin
- memo1.Lines.Add('freqleves(台阶频率)'+IntToStr(i)+'------->' + inttoStr(freqleves[i]));
- memo1.Lines.Add('freqsteps(台阶步数)'+IntToStr(i)+'------->' + inttoStr(freqsteps[i]));
- memo1.Lines.Add('timerdata(定时器初值)'+IntToStr(i)+'------->' + inttoStr(timerdata[i]));
- memo1.Lines.Add('T(已累加时间)------->' + Format('%.3f', [T]) + #13);
- memo1.Lines.Add( #13);
- end;
- iXYPlot1.Channel[0].AddXY(i, freqleves[i]); //画出频率曲线
- iXYPlot1.Channel[1].AddXY(i, freqsteps[i]); //步值曲线
- if not checkbox13.Checked then
- iXYPlot1.Channel[10].AddXY(i, timerdata[i]); //定时器初值曲线
- T := T + dt;//递增到下一个频点的时间
- if(trunc((2 * aa * T * Sqrt(2* (v1 - vstart) / aa))-(1 / 2 * aa * T * T) - (2 * v1) + (3 * vstart)) < freqleves[i]) then
- break;
- end;
- /////////////////////////// 统计总步数
- for j:=0 to i do
- begin
- if freqsteps[j] = 0 then
- freqsteps[j] := freqsteps[j]+ 1;
- allsteps := allsteps +freqsteps[j];
- end;
- //变细分处理---->主要处理频率
- if checkbox13.Checked = true then
- begin
- j := 0;
- //安细分调节第一段
- while((freqleves[j] <= StrToInt(edit50.Text)) and (j <= i)) do
- begin
- timerdata[j] := trunc(freq / (freqleves[j] * StrToInt(edit51.Text)) + 0.5);//求出定时器初值
- iXYPlot1.Channel[10].AddXY(j, timerdata[j]); //定时器初值曲线
- j := j+1;
- end;
- //调节第二段
- while((freqleves[j] <= StrToInt(edit47.Text)) and (j <= i)) do
- begin
- timerdata[j] := trunc(freq / (freqleves[j] * StrToInt(edit48.Text)) + 0.5);//求出定时器初值
- iXYPlot1.Channel[10].AddXY(j, timerdata[j]); //定时器初值曲线
- j := j+1;
- end;
- //调节第三段
- while((freqleves[j] <= StrToInt(edit44.Text)) and (j <= i)) do
- begin
- timerdata[j] := trunc(freq / (freqleves[j] * StrToInt(edit45.Text)) + 0.5);//求出定时器初值
- iXYPlot1.Channel[10].AddXY(j, timerdata[j]); //定时器初值曲线
- j := j+1;
- end;
- //调节第四段
- while((freqleves[j] <= freqleves[i]) and (j <= i)) do
- begin
- timerdata[j] := trunc(freq / (freqleves[j] * StrToInt(edit54.Text)) + 0.5);//求出定时器初值
- iXYPlot1.Channel[10].AddXY(j, timerdata[j]); //定时器初值曲线
- j := j+1;
- if j > i then
- break;
- end;
- end;
- //非调试模式显示数据
- if not checkbox12.Checked then
- begin
- ////生成数据//////////////////////////////////
- showstr := showstr + '//////////////////////////////////////////三段式S加速曲线///////////////////////////////'+#13;
- showstr := showstr +'//启动频率:' + Format('%d', [vstart]) + 'HZ'+#13;
- showstr := showstr +'//最高频率:' + Format('%d', [vend]) + 'HZ'+#13;
- showstr := showstr +'//加加速度:' + Format('%.3f', [aa]) + 'm*s^-3'+#13;
- showstr := showstr +'//频段保持时间:' + Format('%.3f', [dt]) + 's'+#13;
- showstr := showstr +'//定时器频率:' + Format('%d', [freq]) + 'HZ'+#13;
- showstr := showstr +'//加速频率总段数:' + Format('%d', [i+1]) + '段'+#13;
- showstr := showstr +'//加速总脉冲数:' + Format('%d', [allsteps]) + '个'+#13;
- showstr := showstr +'//最高运行速度(按电机步距角为1.8度算):' + Format('%d', [trunc(freqleves[i] / (360 /1.8) * 60)]) + 'RPM(转/分)'+#13;
- if checkbox13.Checked = true then//变细分
- begin
- showstr := showstr + '//'+edit49.Text+'HZ--->'+edit50.Text+'HZ--->'+edit51.Text+'细分'+#13;
- showstr := showstr + '//'+edit46.Text+'HZ--->'+edit47.Text+'HZ--->'+edit48.Text+'细分'+#13;
- showstr := showstr + '//'+edit43.Text+'HZ--->'+edit44.Text+'HZ--->'+edit45.Text+'细分'+#13;
- showstr := showstr + '//'+edit52.Text+'HZ--->'+edit53.Text+'HZ--->'+edit54.Text+'细分'+#13;
- end
- else
- showstr := showstr +'//细分数:' + Format('%d', [xifen]) + '细分'+#13;
- showstr := showstr +'//////////////////步值表//////////////////////////////'+#13;
- showstr := showstr +'const u16 MX_LevesStepsTable[]='+#13;
- showstr := showstr +'{'+#13;
- for j := 0 to i do
- begin
- if not checkbox11.Checked then //10进制显示
- showstr := showstr + format('%d,', [freqsteps[j]])//+#13;
- else //16进制显示
- showstr := showstr +format('0x%.4x,', [freqsteps[j]]);//+#13;
- if (j+1) mod 30 = 0 then
- showstr := showstr + #13;
- end;
- showstr := showstr +#13+'};'+#13;
- showstr := showstr +#13;
- showstr := showstr +'//////////////////定时器初值表///////////////////////////'+#13;
- showstr := showstr +'//启动频率:' + Format('%d', [vstart]) + 'HZ'+#13;
- showstr := showstr +'//最高频率:' + Format('%d', [vend]) + 'HZ'+#13;
- showstr := showstr +'//加加速度:' + Format('%.3f', [aa]) + 'm*s^-3'+#13;
- showstr := showstr +'//频段保持时间:' + Format('%.3f', [dt]) + 's'+#13;
- showstr := showstr +'//定时器频率:' + Format('%d', [freq]) + 'HZ'+#13;
- showstr := showstr +'//加速频率总段数:' + Format('%d', [i+1]) + '段'+#13;
- showstr := showstr +'//加速总脉冲数:' + Format('%d', [allsteps]) + '个'+#13;
- showstr := showstr +'//最高运行速度(按电机步距角为1.8度算):' + Format('%d', [trunc(freqleves[i] / (360 /1.8) * 60)]) + 'RPM(转/分)'+#13;
- if checkbox13.Checked = true then//变细分
- begin
- showstr := showstr + '//'+edit49.Text+'HZ--->'+edit50.Text+'HZ--->'+edit51.Text+'细分'+#13;
- showstr := showstr + '//'+edit46.Text+'HZ--->'+edit47.Text+'HZ--->'+edit48.Text+'细分'+#13;
- showstr := showstr + '//'+edit43.Text+'HZ--->'+edit44.Text+'HZ--->'+edit45.Text+'细分'+#13;
- showstr := showstr + '//'+edit52.Text+'HZ--->'+edit53.Text+'HZ--->'+edit54.Text+'细分'+#13;
- end
- else
- showstr := showstr +'//细分数:' + Format('%d', [xifen]) + '细分'+#13;
- if Combobox4.ItemIndex = 1 then //显示模式1
- begin
- showstr := showstr +'const u16 MX_SpeedLevesTable[][2]='+#13;
- showstr := showstr +'{'+#13;
- for j := 0 to i do
- begin
- if not checkbox11.Checked then //10进制
- showstr := showstr +format('%d, ', [timerdata[j]])
- else //16进制
- showstr := showstr + format('0x%.4x, ', [timerdata[j]]);
- if (j+1) mod 15 = 0 then
- showstr := showstr + #13;
- end;
- showstr := showstr +#13+'};'+#13;
- end
- else
- begin
- showstr := showstr +'const u16 MX_SpeedLevesTable[][3] ={'+#13;
- showstr := showstr +'//{频率,定时器初值,台阶步数}'+#13;
- for j := 0 to i do
- begin
- if not checkbox11.Checked then //10进制
- showstr := showstr +'{'+ format('%d', [freqleves[j]])+ ', '+ format('%d',[timerdata[j]])+', '+format('%d', [freqsteps[j]])+'},'+'//'+format('%d',[j])+#13
- else //16进制
- showstr := showstr +'{'+ format('%d', [freqleves[j]])+ ', '+ format('0x%.4x',[timerdata[j]])+', '+format('0x%.4x', [freqsteps[j]])+'},'+'//'+format('%d',[j])+#13;
- end;
- showstr := showstr +#13+'};'+#13;
- end;
- end;
- memo1.Lines.Text := showstr;
- end;
复制代码 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|