⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 function_define.bas

📁 步进电机控制程序
💻 BAS
字号:
Attribute VB_Name = "Function_Define"
' 功能函数定义模块
' -----------------------------------------------------------
Option Explicit

' -----------------------------------------------------------
' 产生动作脉冲
' -----------------------------------------------------------
Function moveRel(distance As Long)
    
    Dim i As Integer, j As Integer
    Dim d As Long, s As Long
    
    ' 移动的步数总是正的,方向不同而已
    d = Abs(distance)
    
    If distance > 0 Then
        WriteChannel DirChannel, CW
    ElseIf distance < 0 Then
        WriteChannel DirChannel, CCW
    End If
    
    ' 先重置所有参数
    realAccPC = 0
    realDecPC = 0
    realPatrolPC = 0
        
    If d > 0 Then
    
        ' 有加速、匀速、减速时的情形
        If d >= accPC + decPC Then
            realAccPC = accPC
            realDecPC = decPC
            realPatrolPC = d - accPC - decPC
            
            ' 产生动作脉冲
            For i = 1 To FQSubdiv
                pulseGenerator accPCTable(i), accFQTable(i)
            Next
            
            pulseGenerator realPatrolPC, patrolFQ
            
            For i = 1 To FQSubdiv
                pulseGenerator decPCtable(i), decFQtable(i)
            Next
        
        ' 行程较短时的情形
        Else
        
            s = 0
            For i = 1 To FQSubdiv
                
                s = s + accPCTable(i) + decPCtable(FQSubdiv - i + 1)
                
                If s > d Then
                    
                    For j = 1 To i - 1
                        realAccPC = realAccPC + accPCTable(j)
                        realDecPC = realDecPC + decPCtable(FQSubdiv - j + 1)
                    Next
                    
                    ' 产生动作脉冲
                    For j = 1 To i - 1
                        pulseGenerator accPCTable(j), accFQTable(j)
                    Next
                        
                    pulseGenerator d - realDecPC - realAccPC, accFQTable(i)
                    
                    For j = (FQSubdiv - i + 1) + 1 To FQSubdiv
                        pulseGenerator decPCtable(j), decFQtable(j)
                    Next
                    
                    realAccPC = realAccPC + (d - realDecPC - realAccPC)
                    
                    Exit For
                End If
                
            Next
        
        End If
        
    End If
    
End Function

' -----------------------------------------------------------
' 脉冲产生函数,n为脉冲个数,f为脉冲频率
' -----------------------------------------------------------
Function pulseGenerator(ByVal n As Long, ByVal f As Long)
    
    Dim i As Long
    Dim s As Long, c As Double
    
    Debug.Print f, n
    '错误保护
    If f < 1 Or n < 1 Then Exit Function
    
    Dim QPC As LARGE_INTEGER
    Dim QPF As LARGE_INTEGER
    
    QueryPerformanceFrequency QPF
    c = (QPF.lowpart / f) / 2
    
    For i = 1 To n
        
        ' 设置高电平
        WriteChannel PulseChannel, 1
        
        ' QueryPerformanceCounter可以达到微秒级的精度
        QueryPerformanceCounter QPC
        s = QPC.lowpart
        Do While True
            QueryPerformanceCounter QPC
            If (QPC.lowpart - s) >= c Then
                Exit Do
            End If
        Loop
        
        ' 设置低电平
        WriteChannel PulseChannel, 0
        
        QueryPerformanceCounter QPC
        s = QPC.lowpart
        Do While True
            QueryPerformanceCounter QPC
            If (QPC.lowpart - s) >= c Then
                Exit Do
            End If
        Loop
        
        DoEvents
        
    Next
    
End Function

'############################################################
'############################################################

' -----------------------------------------------------------
' 初始化系统
' -----------------------------------------------------------
Sub initSystem()
    
    getConfigParameters
    
    ' reset hardware
    WriteChannel PulseChannel, 0
    WriteChannel DirChannel, 0
    
    pulseSendCount = 0
    
End Sub

' -----------------------------------------------------------
' 进行频率细分,并计算各个频率的脉冲数
' -----------------------------------------------------------
Sub FQSubdivision()
    
    Dim i As Integer, s As Long
    Dim k As Double
    
    ReDim accFQTable(1 To FQSubdiv) As Long
    ReDim decFQtable(1 To FQSubdiv) As Long
    ReDim accPCTable(1 To FQSubdiv) As Long
    ReDim decPCtable(1 To FQSubdiv) As Long
    
    '计算加速频率细分表
    k = (patrolFQ - startFQ) / (FQSubdiv)
    s = 0
    For i = 1 To FQSubdiv
        accFQTable(i) = Round(k * (i - 1) + startFQ)
        accPCTable(i) = Round(accFQTable(i) * accDura / FQSubdiv)
        s = s + accPCTable(i)
    Next
    accPC = s
    
    '计算减速频率细分表
    k = patrolFQ / (FQSubdiv + 1)
    s = 0
    For i = 1 To FQSubdiv
        decFQtable(i) = Round(patrolFQ - k * i)
        decPCtable(i) = Round(decFQtable(i) * decDura / FQSubdiv)
        s = s + decPCtable(i)
    Next
    decPC = s
    
End Sub

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -