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

程序功能:生成步进电机S曲线运动数组代码
程序语言:VB6.0

对应硬件线路连接见上章:
https://blog.csdn.net/LuDanTongXue/article/details/87869557
对应单片机程序见上章(PC端程序显示正常,手机端程序后半段显示不出来):
https://blog.csdn.net/LuDanTongXue/article/details/87869806
程序详细使用方法请见:
https://blog.csdn.net/LuDanTongXue/article/details/87886580
程序下载地址:
https://download.csdn.net/download/ludantongxue/11114203

程序界面如下:
步进电机S曲线+VB6
S曲线算法参照该博文:
https://blog.csdn.net/pengzhihui2012/article/details/52228822
源码如下:

Option Explicit
    Dim BuJuJiao As Double '步进电机步距角
    Dim F0 As Double '硬件频率
    Dim Nf As Double '定时器分频
    Dim v0 As Double '加速段启动速度
    Dim vt As Double '加速段最大速度
    Dim JSBuShu As Long '加速步数
    Dim JSJiaoDu As Double '加速段角度
    Dim XiFen As Double '驱动器细分
    Dim JSKuaiMan As Double '加速快慢,数值越大越慢
    Dim JSshijian As Double '加速时间
    Dim FenDuan As Double '将曲线分成梯形图
    Dim MCCiShu As Long '每个速断段脉冲次数
    Dim MCYuShu As Integer '分段不整除时最后的余数
    
    Dim Fmin As Double 'V0对应的脉冲频率
    Dim Fmax As Double 'Vt对应的脉冲频率
    Dim Fcurrent As Double '实时频率
    
    Dim DSChuZhi As Long '定时器1初值,采用溢出中断
    Dim i As Integer '计数
    Dim a0 As Long 'A0第一个脉冲的初值
    Dim DingShiQiFenPing As Integer '定时器1预分频数
    Dim ZhuanXiang As String '电机转动方向
    Public Function Max(a As Double, b As Double) As Double '求最大值
        If a < b Then
            Max = b
        ElseIf a >= b Then
            Max = a
        End If
    End Function
    Public Function ST(ax As Double, ay As Double, n As Double, m As Double) '图框初始化
    '图框初始化
        Dim Kuandanwei As Double
        Picture1.ScaleMode = 6 '设置图片框单位
        Kuandanwei = Picture1.Width / 400
        Picture1.ScaleTop = -Picture1.Height / 2 '定义坐标原点x
        Picture1.ScaleLeft = -Picture1.Width / 2 '-10 * Kuandanwei '定义坐标原点y
        Picture1.Circle (0, 0), 1000
    'X轴
        Picture1.Line (-8 * Kuandanwei, 0)-(380 * Kuandanwei, 0)
        Picture1.Line (380 * Kuandanwei, 0)-(370 * Kuandanwei, 10 * Kuandanwei)
        Picture1.Line (380 * Kuandanwei, 0)-(370 * Kuandanwei, -10 * Kuandanwei)
        Picture1.CurrentX = 380 * Kuandanwei
        Picture1.CurrentY = 0
        Picture1.Print "t"
    'Y轴
        Picture1.Line (0, 0.45 * Picture1.Height)-(0, -0.45 * Picture1.Height)
        Picture1.Line (0, -0.45 * Picture1.Height)-(-10 * Kuandanwei, -0.45 * Picture1.Height + 10 * Kuandanwei)
        Picture1.Line (0, -0.45 * Picture1.Height)-(10 * Kuandanwei, -0.45 * Picture1.Height + 10 * Kuandanwei)
        Picture1.CurrentX = 0
        Picture1.CurrentY = -0.5 * Picture1.Height
        Picture1.Print "S"
    '绘制坐标点
        Picture1.PSet (n * Kuandanwei, -ax * m / 3), vbRed
        Picture1.PSet (n * Kuandanwei, -ay * m / 3), vbBlue
        n = n + 1
        If n >= 360 Then
            n = n - 360
            Picture1.Cls
        End If
    End Function
    Public Function QuXian() '曲线图框初始化,BS步进电机步数为x轴,vt为Y轴
    '图框初始化
        
        Picture1.Cls
        Picture1.DrawWidth = 1
        Dim Bili As Double '绘图比例
        Bili = 0.7
        Dim Kuandanwei As Double 'x方向图片放缩比例
        Dim Gaodanwei As Double 'y方向图片放缩比例
        Form1.ScaleMode = 6 '设置FORM框单位
        Picture1.ScaleMode = 6 '设置图片框单位
        Kuandanwei = Picture1.Width / (JSBuShu) '根据步进电机总时间计算图片放缩比例
        Gaodanwei = Picture1.Height / Max(v0, vt)
        Picture1.ScaleTop = -Picture1.Height + 5 * Kuandanwei '定义坐标原点y
        Picture1.ScaleLeft = -5 * Kuandanwei '定义坐标原点x
        Picture1.CurrentX = 0
        Picture1.CurrentY = 0
        Picture1.Print "0"
    'X轴
        Dim x1 As Double
        Dim y1 As Double
        Dim x2 As Double
        Dim y2 As Double
        Dim x3 As Double
        Dim y3 As Double
        x1 = Bili * (JSBuShu * Kuandanwei)
        y1 = Bili * 0
        x2 = Bili * (x1 - 3) ' 5 * Kuandanwei)
        y2 = Bili * (y1 + 3) '5 * Kuandanwei)
        x3 = x2
        y3 = -y2
        Picture1.Line (0, 0)-(x1, y1)
        Picture1.Line (x1, y1)-(x2, y2)
        Picture1.Line (x1, y1)-(x3, y3)
        Picture1.CurrentX = x1
        Picture1.CurrentY = y1
        Picture1.Print Int(JSshijian * 1000) & "ms"
    'Y轴
        Dim x4 As Double
        Dim y4 As Double
        Dim x5 As Double
        Dim y5 As Double
        Dim x6 As Double
        Dim y6 As Double
        x4 = Bili * 0
        y4 = Bili * (-Max(v0, vt) * Gaodanwei)
        x5 = Bili * (x4 - 3) '-5* Kuandanwei)
        y5 = Bili * (y4 - 3) '-5* Kuandanwei)
        x6 = -x5
        y6 = y5
        Picture1.Line (0, 0)-(x4, y4)
        Picture1.Line (x4, y4)-(x5, y5)
        Picture1.Line (x4, y4)-(x6, y6)
        Picture1.CurrentX = x4 + Kuandanwei
        Picture1.CurrentY = y4
        Picture1.Print Max(v0, vt) & "r/s"
        
    '绘制坐标点
        Picture1.DrawWidth = 5
        Dim i As Integer
        For i = 1 To JSBuShu
            Picture1.PSet (Bili * i * Kuandanwei, Bili * -Gaodanwei * (v0 + (vt - v0) / (1 + Exp(-JSKuaiMan * (i - JSBuShu / 2) / (JSBuShu / 2))))), vbRed
        Next
    End Function
    Private Sub Command1_Click()
    BuJuJiao = Text2.Text
    F0 = Text3.Text
    Nf = Text4.Text
    v0 = Text5.Text
    vt = Text6.Text
    JSJiaoDu = Text7.Text
    XiFen = Text8.Text
    JSKuaiMan = Text9.Text
    If Text4.Text = 1 Then
    DingShiQiFenPing = 1
    ElseIf Text4.Text = 8 Then
    DingShiQiFenPing = 2
    ElseIf Text4.Text = 64 Then
    DingShiQiFenPing = 3
    ElseIf Text4.Text = 256 Then
    DingShiQiFenPing = 4
    ElseIf Text4.Text = 1024 Then
    DingShiQiFenPing = 5
    End If
    
    JSBuShu = JSJiaoDu / (BuJuJiao / XiFen)
    Fmin = v0 * 360 / (BuJuJiao / XiFen)
    Fmax = vt * 360 / (BuJuJiao / XiFen)
    
    Text1 = ""
    JSshijian = 0
    
    ''''''''''''''''''''''''''''加速段A0数组生成'''''''''''
        For i = 1 To JSBuShu
            Fcurrent = Fmin + (Fmax - Fmin) / (1 + Exp(-JSKuaiMan * (i - JSBuShu / 2) / (JSBuShu / 2)))
            DSChuZhi = 65535 - 1 / (Fcurrent * 2) * F0 / Nf '16位定时器
            If i <> JSBuShu Then
                Text1 = Text1 & "0X" & Hex(DSChuZhi) & ","
            Else
                Text1 = Text1 & "0X" & Hex(DSChuZhi)
            End If
            JSshijian = JSshijian + 1 / Fcurrent
        Next
    
    a0 = 65535 - 1 / ((Fmin + (Fmax - Fmin) / (1 + Exp(-JSKuaiMan * (1 - JSBuShu / 2) / (JSBuShu / 2)))) * 2) * F0 / Nf
    Text10 = JSBuShu
    Text12 = JSshijian * 1000
    Text1 = "A[" & JSBuShu & "]={" & Text1 & "};" & vbCrLf & vbCrLf
    
    ''''''''''''''''''''''''''''
    Text11.Text = (2 * F0 * BuJuJiao) / (65535 * Nf * 360 * XiFen) '计算最小启动速度
    
    QuXian '绘制速度曲线
    End Sub

微信/QQ:pph846375164

步进电机s曲线减速控制生成器是用来控制步进电机实现平滑运动的一种设备。它能够根据需要生成符合S曲线减速控制信号,使得步进电机在启动、速、匀速、减速和停止过程中的运动更平稳。 在使用步进电机进行运动控制时,常常需要考虑到速度和减速度对电机性能和运动过程的影响。传统的简单控制方式往往无法实现平滑的运动,容易产生振动和震荡。而步进电机s曲线减速控制生成器能够根据设定的运动曲线生成合适的控制信号,实现步进电机运动的平滑减速过程。 该生成器一般包括减速控制电路和电源驱动电路两部分。减速控制电路负责根据设定的速时间、减速时间和目标位置生成相应的控制信号。电源驱动电路则负责将控制信号转换为合适的电压和电流供给步进电机实现步进电机的精确控制。 在使用步进电机s曲线减速控制生成器时,需要根据具体的应用场景和需求设置合适的速度和减速度参数。利用该控制生成器步进电机的启动、停止和运动过程会更平稳顺畅,能有效减小运动过程中的振动和噪音,提高步进电机的运动精度和稳定性。 总之,步进电机s曲线减速控制生成器是一种用于生成符合S曲线减速控制信号的装置,它能够使步进电机的运动过程更平滑,提高步进电机的运动精度和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值