步进电机S曲线的生成

news/2024/11/22 4:39:43/

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;
}

源码下载


http://www.ppmy.cn/news/453737.html

相关文章

基于simulink车辆动力学可视化仿真(附源码)

一、前言 车辆动力学是研究汽车在行驶过程中的运动学和力学特性的学科。它研究车辆在不同路面条件、不同驾驶情况下的加速、制动、转向等运动状态&#xff0c;并通过建立数学模型来分析和优化车辆的性能和安全性。车辆动力学是汽车工程、机械工程和物理学等学科的交叉领域&…

阿里月薪23k软件测试工程师:必备的6大技能(建议收藏)

随着软件开发行业的日益发展&#xff0c;岗位需求量和行业薪资都不断增长&#xff0c;想要入行的人也是越来越多&#xff0c;但不知道从哪里下手&#xff0c;今天&#xff0c;就给大家分享一下&#xff0c;软件测试行业都有哪些必会的方法和技术知识点&#xff0c;作为小白该从…

中国十大系统软件外包公司排名:互联网十大外包公司

中国十大系统软件外包公司排名:互联网十大外包公司 2022中国互联网软件外包公司名单 一线 华盛恒辉、五木恒润、北京华盛恒辉、北京五木恒润、中科软、 博彦科技、浪潮、亚信科技、新致软件&#xff1b; 二线 华盛恒辉、五木恒润、法本、德科 、东软集团、海隆软件、宇信…

基于html的明星网站

首页index.html 首页页面效果&#xff1a; 首页代码&#xff1a; <!doctype html> <html> <head> <meta charset"utf-8"> <title>迪丽热巴</title> <link href"css/style.css" rel"stylesheet" type&qu…

Python入门教程NO.4 用python给歌手华晨宇打分并求平均值

本文涉及 python 元组的运算及函数方法 元组 元组与列表类似&#xff0c;都是一种序列&#xff0c;但是列表可以被修改&#xff0c;而元组不能被修改&#xff1b;元组用( )创建,列表用[ ]创建。 元组的索引与字符串类似&#xff0c;都是从 0 开始 元组中的元素是不允许修改的&…

华晨宇计算机音乐,闭关的底气!华晨宇音乐平台歌曲数据新鲜出炉,网友直呼:太可怕...

华晨宇也是选秀节目出身&#xff0c;不管是作为歌手还是制作人都具备超强的实力&#xff0c;每一张专辑或者新歌热度都非常高&#xff0c;路人盘非常大。 近日有网友曝光华晨宇在音乐平台的歌曲数据&#xff0c;单曲最高收听达13.7亿&#xff0c;破亿的单曲多达11首&#xff0c…

华晨宇自创潮流品牌产品引入区块链加密技术

日前&#xff0c;华晨宇自创潮流品牌火星空间站发布首款产品BORN TO LOVE。该品牌创新引入NFC物联网芯片及区块链加密技术&#xff0c;赋予每一件单品不可复制的身份证明。 作为区块链技术提供方&#xff0c;唯链携手矿APP共同打造“物联网区块链”无缝衔接的产品追溯解决方案&…

今年夏天有种病,重新定义了流行。

又到了一如既往忙碌的周六&#xff0c;早上七点就起了。因为一个人看更容易酝酿感情。毫无疑问这届快男是我认为最成功的了。我承认我是芒果粉&#xff0c;最好的体现就是我特别喜欢《一起来看流星雨》。大一暑假在家开着空调&#xff0c;打开电视&#xff0c;放着一起来看流星…