步进电机S曲线的生成

S型曲线公式
步进电机的速度从0变为一个比较大的速度,需要一个加速过程,否则会产生振动或是电机的堵转。电机加速通常有T型曲线和S型曲线两种方式。S型曲线相对于T型曲线,S型曲线的速度不会突变。S型曲线的原始公式如下:
y=K/(1+Exp(a-b*x))(K>0,b>0)

Exp是指数函数,由这个公式可以看出y会随着x的增大,逼近K。把这个公式应用到电机控制之中,K看成最大的速度Vmax,x看成时间t的变量,那么t=0时,就是电机的初始速度,即V0=Vmax/(1+Exp(a-b*(0)))=Vmax/(1+Exp(a));反推求出a与V0,Vmax之间的关系,a=In((Vmax-V0)/V0).b决定曲线的快慢,b越大V变化越快,也就越快接近Vmax。

单片机一般采用定时器来产生脉冲控制电机的转动,产生脉冲的频率决定电机转动的快慢,这个频率与单片机的晶振的频率nXtal,定时器的预分频nPrevXtal,定时器的自动重装载寄存器的数据Xload有关,晶振的频率由硬件决定,定时器的预分频在单片机的初始化的时候设置,那么我们要改变电机的运行速度,就只能通过改变定时器的的自动重装载寄存器的数据。通常的做法是把自动重装载寄存器的数据放到一个数组里面,现在要做的是如何生成这个数组的数据。我这里介绍使用上位机VC编写界面来生成这个数组及曲线。如下图:
自动重装载寄存器数据

S型变化曲线

软件界面需要设置的数据有:晶振频率nXtal,预分频nPrevXtal,步进电机驱动器细分nPrevMotor,运行的最大速度nMaxSpeed,达到最大速度时的位置坐标(对应界面上的极限)nMaxPoint以及a,b参数是通过滑动条设置,a对应起始速度,b对应加速快慢.

速度与自动重装载寄存器的关系
电机的转速的单位一般是rpm,即一分钟多少转.如果电机的转速是V(rpm),那么自动重装载寄存器的数据应该是多少?步进电机驱动器细分为nPrevMotor,那么单片机发脉冲的速度是nPrevMotorV/60每秒,即定时器一秒钟产生中断的个数。
**1/(Xload/(nXtal/nPrevXtal))=(nPrevMotor
V/60)**
Xload=60nXtal/(nPrevXtalnPrevMotor*V)
其中V=Vmax/(1+Exp(a-bt)),即
**Xload=60
nXtal*(1+Exp(a-bt))/(nPrevXtalnPrevMotor*Vmax)**

Xload是自动重装载寄存器的数据,nXtal是晶振频率,nPrevXtal是预分频系数。

VC生成数组的代码如下:

int nMaxPoint,nXtal,nPrevXtal,nPrevMotor,nMaxSpeed;
nMaxPoint = GetDlgItemInt(IDC_EDIT_MAX_POINT);
nXtal = GetDlgItemInt(IDC_EDIT_XTAL);
nPrevXtal = GetDlgItemInt(IDC_EDIT_PREV_XTAL);
nPrevMotor = GetDlgItemInt(IDC_EDIT_MOTOR_F);
nMaxSpeed = GetDlgItemInt(IDC_EDIT_SPEED_MAX);
double k;
k= (double)nMaxSpeed;
CString strArray;
unsigned short nTimerCount;

strArray.AppendFormat(_T("/*============================================================================\r\n"));
strArray.AppendFormat(_T("晶振频率        = %d;\r\n"),nXtal);
strArray.AppendFormat(_T("预分频频率	= %d;\r\n"),nPrevXtal);
strArray.AppendFormat(_T("极限点		= %d;\r\n"),nMaxPoint);
strArray.AppendFormat(_T("极限转速   	= %d;\r\n"),nMaxSpeed);
strArray.AppendFormat(_T("周脉冲数   	= %d;\r\n"),nPrevMotor);
strArray.AppendFormat(_T("S型曲线\r\n"));
strArray.AppendFormat(_T("============================================================================*/\r\nunsigned int code WaitTable[]={\r\n"));

for(int i= 0;i<nMaxPoint;i++)
{
	nTimerCount = (nXtal)*(1+exp(a-b*i))/(nPrevXtal*nPrevMotor*nMaxSpeed);
		
	strArray.AppendFormat(_T("0x%04X, "),nTimerCount);
	if (((i+1)%10)==0)
	{
		strArray.AppendFormat(_T("  // %d\r\n"),(i/10+1)*10);
	}
	
}
	strArray.AppendFormat(_T("};\r\n"));
	SetDlgItemText(IDC_EDIT_DISPLAY,strArray);

就这样生成一个S曲线的数据数组,只需要把这个这个数组拷贝到你的单片机程序里面,定时器使用比较中断的方式,在中断处理函数里面,移动数组的下标即可。当然如果单片机是stm32,还可以使用DMA的方式来做,这样可以减少中断.
S型曲线界面的绘制

这个S曲线的显示使用的是一个Picture控件显示,根据输入晶振频率,预分频,最大速度,极限点。。来绘制,使用GDI相关接口在Picture控件窗口面绘制.代码如下:

int CSCurveDlg::DrawCurve(void)
{
	CWnd* pWnd = GetDlgItem(IDC_EDIT_DISPLAY);
	if(NULL!=pWnd)
	{
		RECT rect;
		pWnd->GetClientRect(&rect);
		int nHeight = rect.bottom-rect.top-4;
		int nWidth = rect.right-rect.left-4;
		CDC* pDC = pWnd->GetDC();
		pDC->FillSolidRect(&rect,RGB(255,255,255));
		POINT p1,p2;

		int i;
		double y1,y2;
		double k;
		k = (double)GetDlgItemInt(IDC_EDIT_SPEED_MAX);
		int nYmax=DrawTable(pDC,nWidth,nHeight);
		int nMaxPoint = GetDlgItemInt(IDC_EDIT_MAX_POINT);
		CSliderCtrl* pSlider1 = (CSliderCtrl*)GetDlgItem(IDC_SLIDER_ACC);
		b=(double)(((double)pSlider1->GetPos())/20);
		
		for (i=0;i<nMaxPoint;i++)
		{
			y1 = (nYmax-5)/(1+exp(a-(b*i)));
			y2 = (nYmax-5)/(1+(exp(a-b*(i+1))));
			p1.x=i*nWidth/nMaxPoint;
			p2.x=(i+1)*nWidth/nMaxPoint;
			p1.y = nHeight-y1;
			p2.y = nHeight-y2;
			pDC->MoveTo(p1);
			pDC->LineTo(p2);
		}
		
	}
	return 0;
}

源码下载

  • 17
    点赞
  • 98
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
步进电机s曲线生成器是一种用于控制步进电机的电路或系统。步进电机是一种特殊类的电机,通过逐步变化的电脉冲控制旋转角度。s曲线生成器是一种用于生成特定类曲线形状的电路或算法。 在步进电机控制中,常常需要让电机以平滑的方式加速和减速,避免突然变化造成机械冲击或振动。s曲线生成器的作用就是在控制步进电机加速和减速过程中,根据预设的速度曲线生成生成一条平滑的曲线。通过在每个步进脉冲之间逐渐变化脉冲频率和幅值,使步进电机实现平稳运动。 s曲线生成器的实现可以采用各种不同的方法,包括使用微处理器或专用的数字信号处理器(DSP)。在s曲线生成器中,需要使用一些数学函数和算法,例如加速度曲线、速度曲线和位移曲线的计算。通过这些数学函数和算法,可以根据预设的加速度和减速度,生成平滑的曲线形状。 s曲线生成器在步进电机控制中有着广泛的应用。它可以用于各种步进电机应用,例如工业自动化、机器人控制、医疗设备和印刷设备等。通过使用s曲线生成器,可以实现高精度、平稳运动的步进电机控制,提高系统的性能和稳定性。 总之,步进电机s曲线生成器是一种用于控制步进电机加速和减速过程中生成平滑曲线形状的电路或系统。它在步进电机控制中有着重要的应用,可以提高系统的性能和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值