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编写界面来生成这个数组及曲线。如下图:

软件界面需要设置的数据有:晶振频率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;
}

源码下载

步进电机S曲线的生成相关推荐

  1. 单片机步进电机加减速表生成软件

    单片机步进电机加减速表生成软件 介绍 功能细节 使用步骤 匀加速效果 平滑效果 软件链接 介绍 使用场景: 基于中断的查表法步进控制程序: 每中断一次就更新一次比较值,并输出一个步进(若翻转电平,速度 ...

  2. 计算机图形学曲线生成原理,计算机图形学_曲线及生成.ppt

    计算机图形学_曲线及生成 华中理工大学计算机学院 陆枫 99-7 1999年7月 7.2.1 曲线的表示要求 1)唯一性 2)几何不变性 3)易于定界 4)统一性 5)易于实现光滑连接 6)几何直观 ...

  3. Bezier曲线的生成算法

    Bezier曲线的生成方法 生成一条Bezier曲线实际上就是要求出曲线上的点. 1.根据定义直接生成Bezier曲线 定义: 其中 那么生成步骤为: ①首先给出  的递归计算式: ②:将表示成分量形 ...

  4. 贝塞尔曲线打断生成两个贝塞尔曲线

    问题:如何将一个三阶贝塞尔曲线打断生成两个三阶贝塞尔曲线,生成的两条贝塞尔曲线与原来的贝塞尔曲线重合? 输入:一条贝塞尔曲线的四个控制点P1,C1,C2,P2,和一个打断点E(E在曲线上) 输出:两条 ...

  5. 单片机控制步进电机-VB上位机生成S曲线

    程序下载地址: https://download.csdn.net/download/ludantongxue/10971448 对应硬件线路连接见上章: https://blog.csdn.net/ ...

  6. 步进电机S曲线加减速控制生成器-VB6.0实现

    程序功能:生成步进电机S曲线运动数组代码 程序语言:VB6.0 对应硬件线路连接见上章: https://blog.csdn.net/LuDanTongXue/article/details/8786 ...

  7. 基于51单片机+ULN2003控制步进电机S曲线加减速

    目录 1.ULN2003功能简介 2.28BYJ48简介 3.S曲线加减速方法 4.proteus仿真及实物测试 1.ULN2003功能简介 ULN2003比较简单,相关资料也比较多.可以用来驱动四线 ...

  8. 步进电机--S 曲线的C算法

    Created with Raphaël 2.1.0Foo1Foo1Foo2Foo2Foo3Foo3Foo4Foo4Foo5Foo5To boundaryTo controlTo entityTo d ...

  9. 步进电机梯形曲线加减速运动算法实现

    目录 1. 使用加减速的理由 2. 梯形加减速算法特点 3. 算法基础 4. 梯形算法要求的变量 4.1 在加速阶段: 4.2匀速阶段 5. 加减速算法推导过程 5.1 电机转过的角度θ的计算: 5. ...

最新文章

  1. 「仅凭照片就能判断一个人是否犯罪」?这样的研究能发表,LeCun、MIT谷歌等机构的1700名研究者怒了...
  2. vectornator安卓_Vectornator Pro
  3. Linux配置keepalived实现nginx高可用安装过程记录
  4. java参数传入泛型类型_Java 泛型(参数化类型)
  5. a类论文 计算机视觉,【科研新进展】(21)我校教师首次在计算机视觉领域A类会议上发表论文...
  6. centos7 配置静态ip时出现双ip问题解决
  7. php.c drcom,校园网绕过Drcom安装自动登录程序到路由器
  8. 【SAP业务模式】之ICS(四):组织单元的配置
  9. 【广告技术】用张量分解预测广告库存,广告投放更可靠!
  10. CListCtrl使用指南
  11. Ehcahe spring
  12. 利用jsoup 如何从网页中下载图片
  13. 最全面的安卓编码规范
  14. [0CTF 2016]piapiapia
  15. 2020阿里巴巴社招面试题
  16. clip-summary
  17. 说一说场内基金和场外基金的区别
  18. 简单运算器的设计与仿真
  19. 如何使用ABBYY FineReader 14填写表格
  20. css基础--段落样式

热门文章

  1. VUE + tiff.js 加载 tiff,tif 图片
  2. rk3288编译android,RK3288 源码编译Android 7.1.2 自动编译
  3. MC最强辅助模组,有了它从此下矿再也不怕了
  4. 模型损失函数变化曲线图_第3章 第6节 模型融合和提升的算法
  5. cortex M7 MPU 总结
  6. django.db.utils.OperationalError: (2003, Can't connect to MySQL server on ‘127.0.0.1’)
  7. opencv里的THRESH_TRIANGLE的原理
  8. Arcgis js featureLayer加载完成之后,对其加载的要素重新定义样式
  9. c语言解除宏定义_3.3.5 取消宏定义和重新定义宏
  10. C#最小二乘法进行曲线拟合及相关系数