The below script can be used to test the functionality of the Hall and Encoder sensors of a motor. To run it, the motor together with its sensors must be connected to the controller.


Steps


1. Copy - paste the below script in the script tab


 

'Disclaimer:

'----------

'The script is tested and validated by Roboteq and is believed to be fault-free. 

'The possibility always exists, however, that the particular configuration and/or use 

'condition uncovers a fault that escaped our validation test coverage. Always 

'extensively test the script under your use conditions prior to deploying it in the field. 

 

option explicit

 

'************************************************************

'                  ADD BELOW THE 

'                   ENCODER PPR

'************************************************************

#define PPR 4096  '<--- Encoder pulses per revolution

'************************************************************

'                  ADD BELOW THE 

'               MPOTOR NOMINAL CURRENT

'************************************************************

#define REFERENCE_POWER 70 '< --- Amps used during calibration. 

'                            Must be equal to nominal current. 

'                            Value in amps*10         

'************************************************************

'                 ADD BELOW THE 

'               MPOTOR POLE PAIRS

'************************************************************

#define POLE_PAIRS 5 '< --- Pole pairs of the motor. 

'                           Value is pole number divided by 2 

'************************************************************                                   

 

' Script starts here. DON'T MODIFY BELOW

 

 

#define CHANNELS 2               'Number of channels to be tested       

#define HALL_UP_LIMIT 90         'Maximum allowed electrical angle between two Hall transitions. Nominal is 85. Value in degrees*512/360

#define HALL_DOWN_LIMIT 80       'Minimum allowed electrical angle between two Hall transitions. Nominal is 85. Value in degrees*512/360

#define HALL_ZERO_MARGIN 14      'The acceptable error for the HALL_ZERO value. Default value is 14 that corresponds to 10 degrees. Value in degrees*512/360

 

 

#define ENCODER_MIN 15768        'Minumum allowed encoder counts per one rotation. Nominal is 16384

#define HALL_ERROR 2             'Maximum allowed Hall error counts in one rotation

 

 

'Script parameters. Do not modify

 

 

dim channel as integer

dim timeout as integer

dim power as integer

dim command as integer

dim encoderError as integer

 

 

dim hStatus as integer

dim statusCounter as integer

dim encoderCounter as integer

dim hallCounter as integer

 

dim motorConnected as boolean

dim sensorsOk as boolean

dim setupOk as boolean

 

motorConnected = false

sensorsOk = false

setupOk = false

 

 

'check sensors vars

 

dim isOneOnce as boolean

isOneOnce = false

'Check alignment vars

 

dim positive[6] as integer

dim negative[6] as integer

 

dim isAligned as boolean

 

isAligned = false

 

'Open Loop vars

 

dim motorRotates as boolean

dim swapHall as boolean

dim swapEnc as boolean

dim isOpenLoopOk as boolean

 

dim maxCurrentFw as integer

dim maxTorqueFw as integer

dim maxFluxFw as integer

 

dim maxEncSpeedFw as integer

dim maxHallSpeedFw as integer

dim minEncSpeedFw as integer

dim minHallSpeedFw as integer

 

dim maxCurrentRv as integer

dim maxTorqueRv as integer

dim maxFluxRv as integer

 

dim maxEncSpeedRv as integer

dim maxHallSpeedRv as integer

dim minEncSpeedRv as integer

dim minHallSpeedRv as integer

 

 

isOpenLoopOk = false

motorRotates = false

swapHall = false

swapEnc = false

 

maxCurrentFw = 0

maxTorqueFw = 0

maxFluxFw = 0

maxCurrentRv = 0

maxTorqueRv = 0

maxFluxRv = 0

maxHallSpeedFw = 0

maxEncSpeedFw = 0

minEncSpeedFw = 5000

minHallSpeedFw = 5000

maxHallSpeedRv = 0

maxEncSpeedRv = 0

minEncSpeedRv = 5000

minHallSpeedRv = 5000

 

encoderError = 4*PPR/30

 

 

' closed Loop vars

 

dim isClosedLoopOk as boolean

 

isclosedLoopOk = false

 

' wait until released vars

 

dim isreleased as boolean

isreleased = false

 

'Load test vars

 

dim isLoadOk as boolean

dim pha[2] as integer

 

isLoadOk= false

pha[0] = 0

pha[1] = 0

 

'general vars

 

dim temp as integer

dim i as integer

dim j as integer

dim speed[2] as integer

dim steps[2] as integer

dim error[60] as integer

dim warnings[20] as integer

dim current as integer

 

temp = i = j = 0 

current = 0 

speed[0] = 0

speed[1] = 0 

steps[0] = 0

steps[1] = 0

 

timeout = 0 

command = 0 

channel = 1

power = 0

hStatus = 0

statusCounter = 0 

encoderCounter = 0

hallCounter = 0

 

wait(2000) ' Add 2 second wait, in case of script crash

setcommand(_G,1,0) 'Make command to both motors zero, in case that previous command is running with RWD 0

setcommand(_G,2,0)

 

'*********************************************

'               MAIN PROGRAM

'*********************************************

 

wait(1000)

 

print("This script is used to test the motors having Hall sensors and ", PPR," resolution encoder\n \n")

 

wait(4000)

 

print("STARTING\n")

print("--------\n \n")

 

wait(2000)

 

print("1. Initializing profile... \n \n")

 

gosub initialize_profile

 

print("-Profile loaded! \n \n")

 

for channel = 1 andwhile (channel < (CHANNELS+1))

 

    gosub initialize_parameters

    

    wait(2000)

    

    print("2. Checking if motor ", channel," is connected... \n \n")

    

    wait(2000)

    

    gosub is_motor_connected

        

    if motorConnected

        

        wait(2000)

        steps[channel-1]++ 'step = 1

    

        print("3. Checking if sensors are present... \n \n")

    

        gosub check_sensors

        

    end if

    

    if sensorsOk

    

        wait(1000)    

        steps[channel-1]++ 'step = 2

        

        print("4. Performing motor/sensor setup... \n \n")

    

        gosub motor_setup

        

    end if

    

    if setupOk

 

        wait(1000)    

        steps[channel-1]++ 'step = 3            

        print("5. Checking Hall sensors alignment... \n \n \n")

            

        wait(3000)

        gosub check_alignment

        

    end if

    

    if (channel = 1)

        print("\n \nproceeding to channel 2\n \n")

        wait(2000)

    end if

    

 

 

next

 

 

wait(3000)

 

print("\n\nTest finished \n \n")

    

terminate

 

'*************************************************

'                      SUBS

'*************************************************

'*************************************************

'             0. Initialize profile

'-------------------------------------------------

' Initialize the controller's profile. I will 

' configure sinusoidal for both motors, configure

' the reference seek power, disable sensor error

' protection, reset the Hall angle table

'*************************************************

 

initialize_profile:

 

for channel = 1 andwhile channel < 3

 

setconfig(_MMOD,channel,0)

wait(1)

setconfig(_SED,channel,0)

wait(1)

setconfig(_BZPW,channel,REFERENCE_POWER)

wait(1)

setconfig(_BMOD,channel,1)

wait(1)

setconfig(_BPOL,channel,POLE_PAIRS)

wait(1)

setconfig(_EPPR,channel,PPR)

wait(1)

setconfig(_BFBK,channel,2)

wait(1)

setconfig(_BLFB,channel,0)

wait(1)

setconfig(_BLSTD,channel,0)

 

setconfig(_ALIM,channel,200)

wait(1)

 

next

 

setconfig(_RWD,0)

wait(1)

setconfig(_EMOD,1,18)

wait(1)

setconfig(_EMOD,2,34)

wait(1)

 

    

for i = 1 andwhile i <25

 

    setconfig(_HSAT,i,0)

    wait(1)

    

next

 

wait(250)

 

 

if((getvalue(_FF,1) and 16))

 

    setcommand(_MG,1)

    

end if

 

wait(50)

 

channel = 1

 

return

 

'*************************************************

'             1. Initialize parameters

'-------------------------------------------------

' Checks if at least two of the motor phases are 

' connected by giving a PWM voltage to the motor 

' and measuring the motor current 

'*************************************************

 

initialize_parameters:

 

    maxCurrentFw = 0

    maxTorqueFw = 0

    maxFluxFw = 0

    maxCurrentRv = 0

    maxTorqueRv = 0

    maxFluxRv = 0

    maxHallSpeedFw = 0

    maxEncSpeedFw = 0

    minEncSpeedFw = 5000

    minHallSpeedFw = 5000

    maxHallSpeedRv = 0

    maxEncSpeedRv = 0

    minEncSpeedRv = 5000

    minHallSpeedRv = 5000

    timeout = 0 

    command = 0 

    power = 0

    hStatus = 0

    statusCounter = 0 

    encoderCounter = 0

    hallCounter = 0    

        

    isAligned = false    

    isOpenLoopOk = false

    motorRotates = false

    swapHall = false

    swapEnc = false

    isclosedLoopOk = false

    isreleased = false

    motorConnected = false

    sensorsOk = false

    setupOk = false     

    isOneOnce = false

    isLoadOk = false

        

return

 

 

'*************************************************

'             2. Is motor Connected

'-------------------------------------------------

' Checks if at least two of the motor phases are 

' connected by giving a PWM voltage to the motor 

' and measuring the motor current 

'*************************************************

 

is_motor_connected:

 

motorConnected = false

timeout = 0

command = 0 

 

while timeout < 5000 

 

    command ++

    timeout ++

    

    setcommand(_G,channel, command/4)

    

    current= abs(getvalue(_A,channel))

    

    if (current > 10) 

        

        setcommand(_G,channel,0)

        motorConnected = true

        

        print("-motor ", channel," is connected!\n \n")

        

        return

    

    end if 

    

    wait(1)

 

end while

 

setcommand(_G,channel,0)

 

 

print("-motor ",channel," is not connected!\n \n")

 

error[(channel-1)*30+1]=1

 

return

    

 

'*************************************************

'             3. Check sensors

'-------------------------------------------------

' Checks if at least two of the motor phases are 

' connected by giving a PWM voltage to the motor 

' and measuring the motor current 

'*************************************************

    

check_sensors:

 

timeout = 0

sensorsOk = false

isOneOnce = false

statusCounter = 0 

 

setcommand(_C,channel,0)

wait(250)

setcommand(_CB,channel,0)

wait(250)

setcommand(_VPM,channel,POLE_PAIRS)

 

while (timeout<1000)

    

    if (getvalue(_A,channel)>REFERENCE_POWER*2/3)

    

        setcommand(_C,channel,0)

        wait(1)

        setcommand(_CB,channel,0)

        wait(1)

        exit while

        

    end if

    

    timeout++

    

    wait(1)

    

end while

 

timeout = 0

 

while timeout < 10000

    

    power = getvalue(_P,channel)

    timeout++

    

    if ((timeout < 1000) and (power = 0))

        

        print("\n \n-VPM Error. Motor power is zero! \n")

        error[(channel-1)*30+2]=1

        setcommand(_VPM,channel,0)

        return

        

    end if    

        

    if ((timeout > 2000) and (power = 0))

    

        exit while

        

    end if

    

    if (timeout > 9000)

        

        print("\n \n-VPM Error. Rotation did not finish on time! \n")

        

        setcommand(_VPM,channel,0)

        error[(channel-1)*30+3]=1

        return    

            

    end if

    

    hStatus = getvalue(_HS,channel)

    

    if ((hStatus = 1) and (statusCounter = 0))

        statusCounter++

    elseif ((hStatus = 2) and (statusCounter = 1))

        statusCounter++

    elseif ((hStatus = 3) and (statusCounter = 2))    

        statusCounter++

    elseif ((hStatus = 4) and (statusCounter = 3))

        statusCounter++

    elseif ((hStatus = 5) and (statusCounter = 4))

        statusCounter++

    elseif ((hStatus = 6) and (statusCounter = 5))

        statusCounter++

    end if

    

    if(getvalue(_C,channel) = 1)

        isOneOnce = true

    end if

    

    wait(1)

 

end while

 

setcommand(_VPM,channel,0)    

 

encoderCounter = abs(getvalue(_C,channel))

hallCounter = abs(getvalue(_CB,channel))

 

if (encodercounter >= 4*PPR-encoderError) and (encodercounter <= 4*PPR+encoderError) and (hallCounter >= 6*POLE_PAIRS-HALL_ERROR) and (hallCounter <= 6*POLE_PAIRS+HALL_ERROR) and (statusCounter = 6)

    

    sensorsOk = true

    

    print ("-sensors ok!\n \n")

    

else

    if (encoderCounter = 0) and (not isOneOnce)

        print("\n \n-Encoder not present! \n")

        error[(channel-1)*30+4]=1        

    elseif (encoderCounter < 10) and isOneOnce

        print("\n \n-One of the Encoder signals not present! \n")

        error[(channel-1)*30+5]=1

    elseif ((encoderCounter < 4*PPR-encoderError) or (encoderCounter > 4*PPR+encoderError))

        print ("\n \n-Encoder is malfunctioning. Encoder counts are ",encoderCounter," instead of ", 4*PPR,"! \n")

        error[(channel-1)*30+6]=1

    end if

    

    if (getvalue(_HS,channel) = 7)

        print("\n \n-Hall is not present! \n")

        error[(channel-1)*30+7]=1        

    else

        

        if ((hallCounter < 6*POLE_PAIRS-HALL_ERROR) or (hallCounter > 6*POLE_PAIRS+HALL_ERROR))

            print ("\n \n- Hall is malfunctioning. Hall counts are ",hallCounter," instead of ", 6*POLE_PAIRS,"! \n")

            error[(channel-1)*30+8]=1

        end if

        

        if (statusCounter <> 6)

            print("- At least one of the Hall signals is missing! \n")

            error[(channel-1)*30+9]=1

        end if

    

    end if

    

end if    

 

    

return

 

    

'*************************************************

'             4. Motor/Sensor setup

'-------------------------------------------------

' Checks if at least two of the motor phases are 

' connected by giving a PWM voltage to the motor 

' and measuring the motor current 

'*************************************************

    

motor_setup:

 

setupOk = false

timeout = 0

 

setcommand(_MSS,channel)

 

while(timeout < 4000)

 

    timeout++

    wait(1)

    

    if (getvalue(_P,channel)>50)

        exit while

    end if

    

end while

 

if (timeout = 4000)

    

    print("\n \n-Motor/Sensor setup timeout! \n")

    error[(channel-1)*30+10]=1

    return

    

end if    

 

timeout = 0 

 

print("HS \t A \t P \n")

 

while (timeout<2000)

    

    timeout++

    power= getvalue(_P,channel)

    

    if (power = 0)

    

        print("\n \n-Motor/Sensor setup ok!\n \n")

        setupOk = true

        return

        

    end if

    

    wait(10)

    

print(getvalue(_HS,channel),"\t",getvalue(_A,channel),"\t",getvalue(_P,channel),"\n")

        

end while

 

print("\n \n-Motor/Sensor setup timeout! \n")

error[(channel-1)*30+10]=1

 

return

 

 

'*************************************************

'             5. Check Hall Alignment

'-------------------------------------------------

' Checks if at least two of the motor phases are 

' connected by giving a PWM voltage to the motor 

' and measuring the motor current 

'*************************************************

 

check_alignment:

 

isAligned = true

 

' Read the HSAT

 

for i = 0 andwhile i < 6

 

    negative[i] = getconfig(_HSAT,((channel-1)*12)+i+1)

    positive[i] = getconfig(_HSAT,((channel-1)*12)+i+7)

    

next

 

'Sort the HSAT

 

for i = 0 andwhile i < 6

    for j = 0 andwhile j < (6 - i -1 )

        

        if negative[j]>negative[j+1]

            temp = negative[j]

            negative[j] = negative[j+1]

            negative[j+1] = temp

        end if

        

        if positive[j]>positive[j+1]

            temp = positive[j]

            positive[j] = positive[j+1]

            positive[j+1] = temp

        end if

    next

next

 

 

Print("Hall sensors negative direction:\n \n")

    

for i = 0 andwhile i < 6

 

    print(negative[i],"\t")

    

next    

 

wait(250)

 

Print("\n \nNegative direction angle difference:\n \n")

 

for i = 0 andwhile i < 5

    

    print(abs(negative[i]-negative[i+1]),"\t")

    

    if ((abs(negative[i]-negative[i+1])> HALL_UP_LIMIT) or (abs(negative[i]-negative[i+1]) < HALL_DOWN_LIMIT))

    

        isAligned = false     

        

    end if

    

next    

 

wait(250)

 

print("\n \n")

 

Print("Hall sensors positive direction:\n \n")

for i = 0 andwhile i < 6

 

    print(positive[i],"\t")

    

next    

 

print("\n")

 

wait(250)

 

Print("\n \nPositive direction angle difference:\n \n")

 

for i = 0 andwhile i < 5

    

    print(abs(positive[i]-positive[i+1]),"\t")

    if ((abs(positive[i]-positive[i+1])> HALL_UP_LIMIT) or (abs(positive[i]-positive[i+1]) < HALL_DOWN_LIMIT))

    

        isAligned = false    

        

    end if

next

 

wait(250)

 

print("\n")

 

if (isAligned = false)    

    print("\n \n \n-Hall sensors not well aligned!\n \n")

    error[(channel-1)*30+11]=1

    warnings[(channel-1)*10+0] = 1 'Update the first elemnt of the warnings array.

    

else

    print ("\n \n \n-Hall sensors are well aligned! \n \n")

end if

 

isAligned = true 'Made the flag again true so the motor test does not finish if the sensors are misaligned

 

return

 

 

 

2. Go at line 8 of the script and configure the encoder resolution (PPR), the motor nominal current and pole pairs. Note that the nominal current should be added in A/10, so 10 A for example should be written as 100. 



3. Click "to device" to download the script on the controller



4. Go at the console tab and clear the logs


5. Run script



6. Once the test is finished copy the logs and send them for evaluation