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

📄 1.txt

📁 pic得电机控制程序
💻 TXT
📖 第 1 页 / 共 3 页
字号:
    stepper_acc1 (_stepper2_acc_index,_stepper2_period_preset)
    stepper_acc1N (_stepper2_acc_index,_stepper2_acc_count)
    stepper2_status = _stepper_status_continuous
  end if
end procedure
-- ---------------------------------------------------------------------



-- ---------------------------------------------------------------------
-- Runs motor to the specified target position,
-- using the current direction, speed and accereration settings
-- This routine can also be called as a macro,
-- allowing to use large integer values
--     stepper_run_into  1,23300
-- ---------------------------------------------------------------------
procedure stepper_run_into (byte in motor_nr = 1,
                       byte in target_pos1 = 0,
                       byte in target_pos2 = 0,
                       byte in target_pos3 = 0,
                       byte in target_pos4 = 0) is
  if motor_nr == 1 then
    stepper1_status = _stepper_status_running
    -- it's not necessary to disable interrupts here !!
    ;;;;;<;mac> byte4_assign _stepper1_target_pos = target_pos
    _stepper1_target_pos1 = target_pos1
    _stepper1_target_pos2 = target_pos2
    _stepper1_target_pos3 = target_pos3
    _stepper1_target_pos4 = target_pos4
;;;;;<;/mac>
  else
    stepper2_status = _stepper_status_running
    -- it's not necessary to disable interrupts here !!
    ;;;;;<;mac> byte4_assign _stepper2_target_pos = target_pos
    _stepper2_target_pos1 = target_pos1
    _stepper2_target_pos2 = target_pos2
    _stepper2_target_pos3 = target_pos3
    _stepper2_target_pos4 = target_pos4
;;;;;<;/mac>
  end if
end procedure
-- ---------------------------------------------------------------------



-- ---------------------------------------------------------------------
-- Runs motor for the specified HALF-STEPS !!
-- using the current direction, speed and accereration settings
-- If motor is running, the specified steps will be added to the target position
-- This routine can also be called as a macro,
-- allowing to use large integer values
--     stepper_do_steps  1,23300
-- ---------------------------------------------------------------------
procedure stepper_do_steps (byte in motor_nr = 1,
                       byte in n_steps1 = 0,
                       byte in n_steps2 = 0,
                       byte in n_steps3 = 0,
                       byte in n_steps4 = 0) is
  -- interrupts must be disabled, because target-position is changes
  T0IE = false
  if motor_nr == 1 then
    if stepper1_forward then
      ;;;;;<;mac> byte4_add  _stepper1_target_pos = _stepper1_target_pos , n_steps
      Y1 = _stepper1_target_pos1
      Y2 = _stepper1_target_pos2
      Y3 = _stepper1_target_pos3
      Y4 = _stepper1_target_pos4
      X1 = n_steps1
      X2 = n_steps2
      X3 = n_steps3
      X4 = n_steps4
      byte4_add
      _stepper1_target_pos1 = Y1
      _stepper1_target_pos2 = Y2
      _stepper1_target_pos3 = Y3
      _stepper1_target_pos4 = Y4
;;;;;<;/mac>
    else
      ;;;;;<;mac> byte4_sub  _stepper1_target_pos = _stepper1_target_pos , n_steps
      Y1 = _stepper1_target_pos1
      Y2 = _stepper1_target_pos2
      Y3 = _stepper1_target_pos3
      Y4 = _stepper1_target_pos4
      X1 = n_steps1
      X2 = n_steps2
      X3 = n_steps3
      X4 = n_steps4
      byte4_sub
      _stepper1_target_pos1 = Y1
      _stepper1_target_pos2 = Y2
      _stepper1_target_pos3 = Y3
      _stepper1_target_pos4 = Y4
;;;;;<;/mac>
    end if
    stepper1_status = _stepper_status_running
  else
    if stepper2_forward then
      ;;;;;<;mac> byte4_add  _stepper2_target_pos = _stepper2_target_pos , n_steps
      Y1 = _stepper2_target_pos1
      Y2 = _stepper2_target_pos2
      Y3 = _stepper2_target_pos3
      Y4 = _stepper2_target_pos4
      X1 = n_steps1
      X2 = n_steps2
      X3 = n_steps3
      X4 = n_steps4
      byte4_add
      _stepper2_target_pos1 = Y1
      _stepper2_target_pos2 = Y2
      _stepper2_target_pos3 = Y3
      _stepper2_target_pos4 = Y4
;;;;;<;/mac>
    else
      ;;;;;<;mac> byte4_sub  _stepper2_target_pos = _stepper2_target_pos , n_steps
      Y1 = _stepper2_target_pos1
      Y2 = _stepper2_target_pos2
      Y3 = _stepper2_target_pos3
      Y4 = _stepper2_target_pos4
      X1 = n_steps1
      X2 = n_steps2
      X3 = n_steps3
      X4 = n_steps4
      byte4_sub
      _stepper2_target_pos1 = Y1
      _stepper2_target_pos2 = Y2
      _stepper2_target_pos3 = Y3
      _stepper2_target_pos4 = Y4
;;;;;<;/mac>
    end if
    stepper2_status = _stepper_status_running
  end if
  -- enable interrupts again
  T0IE = true
end procedure
-- ---------------------------------------------------------------------



-- ---------------------------------------------------------------------
-- internal routine used by stop and null
-- stops the motor (sets also stopped mode)
-- if NULL, defines current-position as NULL
-- sets target-position to current-position
-- ---------------------------------------------------------------------
procedure _stepper_stop_null (byte in motor_nr, bit in null) is
  if motor_nr == 1 then
    stepper1_status = _stepper_status_stopped

    -- at this point interrupts have or will see the stop status and will do nothing
    -- so it's save to change the target-position

    -- define current position as NULLpoint
    if null then
      ;;;;;<;mac> byte4_assign   stepper1_pos = 0
    stepper1_pos1 = 0x00
    stepper1_pos2 = 0x00
    stepper1_pos3 = 0x00
    stepper1_pos4 = 0x00
;;;;;<;/mac>
    end if

    -- set target-position to current-position
    ;;;;;<;mac> byte4_assign   _stepper1_target_pos = stepper1_pos
    _stepper1_target_pos1 = stepper1_pos1
    _stepper1_target_pos2 = stepper1_pos2
    _stepper1_target_pos3 = stepper1_pos3
    _stepper1_target_pos4 = stepper1_pos4
;;;;;<;/mac>

  else
    stepper2_status = _stepper_status_stopped

    -- define current position as NULLpoint
    if null then
      ;;;;;<;mac> byte4_assign   stepper2_pos = 0
    stepper2_pos1 = 0x00
    stepper2_pos2 = 0x00
    stepper2_pos3 = 0x00
    stepper2_pos4 = 0x00
;;;;;<;/mac>
    end if

    -- set target-position to current-position
    ;;;;;<;mac> byte4_assign   _stepper2_target_pos = stepper2_pos
    _stepper2_target_pos1 = stepper2_pos1
    _stepper2_target_pos2 = stepper2_pos2
    _stepper2_target_pos3 = stepper2_pos3
    _stepper2_target_pos4 = stepper2_pos4
;;;;;<;/mac>

  end if
end procedure
-- ---------------------------------------------------------------------



-- ---------------------------------------------------------------------
-- stops motor directly
-- sets motor status to stopped
-- sets position target=current
-- ---------------------------------------------------------------------
procedure stepper_stop (byte in motor_nr = 1) is
  _stepper_stop_null (motor_nr, false)
end procedure
-- ---------------------------------------------------------------------



-- ---------------------------------------------------------------------
-- stops motor smoothly
-- ---------------------------------------------------------------------
procedure stepper_stop_smooth (byte in motor_nr = 1) is
  T0IE = false  ; disable interrupts
  if motor_nr == 1 then
    stepper1_accelerate_on = true
    _stepper1_acc_count = 1
    _stepper1_not_decelerating = false
  else
    stepper2_accelerate_on = true
    _stepper2_acc_count = 1
    _stepper2_not_decelerating = false
  end if
  T0IE = true  ; enable interrupts
end procedure
-- ---------------------------------------------------------------------



-- ---------------------------------------------------------------------
-- stops motor directly and nulls position
-- sets motor status to stopped
-- sets position current=0
-- sets position target=current
-- ---------------------------------------------------------------------
procedure stepper_set_null (byte in motor_nr = 1) is
  _stepper_stop_null (motor_nr, true)
end procedure
-- ---------------------------------------------------------------------



-- ---------------------------------------------------------------------
-- initializes all stepper motors
-- this procedure is automatic called by the include of this library
-- and should rarely be called be the user
-- ---------------------------------------------------------------------
procedure stepper_init is
var byte value

  stepper1_status = _stepper_status_stopped
  stepper_set_null (1)

  stepper1_full_steps = true
  stepper1_forward = true
  stepper1_full_force_2_winding = false
  stepper1_full_force_1_winding = true

  stepper1_accelerate_on = false
  _stepper1_index = 0
  _stepper1_not_decelerating = true

  -- get table value, output to port
  _get_stepper_value ( _stepper1_index, value )
  _stepper1_port_dir = all_output
  _stepper1_port = value
  
  if stepper_Nmotors == 2 then  -- compiler directive !!
    stepper2_status = _stepper_status_stopped
    stepper_set_null (2)

    stepper2_full_steps = true
    stepper2_forward = true
    stepper2_full_force_2_winding = false
    stepper2_full_force_1_winding = true

    stepper2_accelerate_on = false
    _stepper2_index = 0
    _stepper2_not_decelerating = true

    -- get table value, output to port
    _get_stepper_value ( _stepper2_index, value )
    _stepper2_port_dir = all_output
    _stepper2_port = value

  end if

  -- intialize TMR0 prescaler
  OPTION_REG = ( OPTION_REG & ! ( _b_T0CS ))   -- set TMR0 to main oscillator
  OPTION_REG = ( OPTION_REG & ! ( _b_PSA ))    -- enable prescaler for TMR0
  OPTION_REG = ( OPTION_REG & 0xF8 ) | 0x06    -- set prescaler to 6 = 1:128
  -- in that case a timer value of -39 will give 0.9984 msec

  -- enable interrupts
  T0IE = true   -- enable TMR0 interrupt
  GIE  = true   -- enable general interrupts
  T0IF = false  -- clear TMR0 interrupt flag
end procedure
-- ---------------------------------------------------------------------



-- ---------------------------------------------------------------------
-- perform the stepper intialisation
-- ---------------------------------------------------------------------
stepper_init





⌨️ 快捷键说明

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