noka @willow-micro / AsyncStepper
Committer:
babylonica
Date:
Sat Jul 28 18:22:05 2018 +0000
Revision:
1:0f8209567b7d
Parent:
0:26fa30c35f74
minor changes

Who changed what in which revision?

UserRevisionLine numberNew contents of line
babylonica 0:26fa30c35f74 1 // -*- coding:utf-8-unix -*-
babylonica 0:26fa30c35f74 2 /*!
babylonica 0:26fa30c35f74 3 @file AsyncStepper.hpp
babylonica 0:26fa30c35f74 4
babylonica 0:26fa30c35f74 5 @brief Drive a stepper motor using A4988 with asynchronous.
babylonica 0:26fa30c35f74 6
babylonica 0:26fa30c35f74 7 @author T.Kawamura
babylonica 0:26fa30c35f74 8 @version 1.0
babylonica 0:26fa30c35f74 9 @date 2018-07-12 T.Kawamura Written for C++/mbed.
babylonica 0:26fa30c35f74 10 @see
babylonica 0:26fa30c35f74 11 Copyright (C) 2018 Takuma Kawamura.
babylonica 0:26fa30c35f74 12 Released under the MIT license.
babylonica 0:26fa30c35f74 13 http://opensource.org/licenses/mit-license.php
babylonica 0:26fa30c35f74 14 */
babylonica 0:26fa30c35f74 15 #ifndef ASYNCSTEPPER_H
babylonica 0:26fa30c35f74 16 #define ASYNCSTEPPER_H
babylonica 0:26fa30c35f74 17
babylonica 0:26fa30c35f74 18 #include "mbed.h"
babylonica 0:26fa30c35f74 19
babylonica 1:0f8209567b7d 20 /**
babylonica 1:0f8209567b7d 21 Disable all interuupts and save the status of interrupts.
babylonica 1:0f8209567b7d 22 This macro is usable at ONLY Cortex-M Series.
babylonica 1:0f8209567b7d 23 */
babylonica 1:0f8209567b7d 24 #define DISABLE_INTERRUPTS uint32_t primask = __get_PRIMASK(); __disable_irq()
babylonica 1:0f8209567b7d 25 /**
babylonica 1:0f8209567b7d 26 Enable all interuupts when the status of interrupts is ENABLED.
babylonica 1:0f8209567b7d 27 This macro is usable at ONLY Cortex-M Series.
babylonica 1:0f8209567b7d 28 */
babylonica 1:0f8209567b7d 29 #define RESTORE_INTERRUPTS if( !(primask & 1) ) __enable_irq()
babylonica 1:0f8209567b7d 30
babylonica 0:26fa30c35f74 31 using namespace std;
babylonica 0:26fa30c35f74 32
babylonica 0:26fa30c35f74 33 enum stepMode_e {
babylonica 0:26fa30c35f74 34 FULL, HALF, QUARTER, EIGHTH, SIXTEENTH
babylonica 0:26fa30c35f74 35 };
babylonica 0:26fa30c35f74 36 enum direction_e {
babylonica 0:26fa30c35f74 37 NEGATIVE, POSITIVE
babylonica 0:26fa30c35f74 38 };
babylonica 0:26fa30c35f74 39 enum stopMode_e {
babylonica 0:26fa30c35f74 40 FREE, LOCKED
babylonica 0:26fa30c35f74 41 };
babylonica 0:26fa30c35f74 42
babylonica 0:26fa30c35f74 43 /*!
babylonica 0:26fa30c35f74 44 @class AsyncStepper
babylonica 0:26fa30c35f74 45 @brief Drive a stepper motor using A4988 with asynchronous
babylonica 0:26fa30c35f74 46 */
babylonica 0:26fa30c35f74 47 class AsyncStepper{
babylonica 0:26fa30c35f74 48 private:
babylonica 0:26fa30c35f74 49 Ticker *ticker;
babylonica 0:26fa30c35f74 50 DigitalOut *enableOut;
babylonica 0:26fa30c35f74 51 DigitalOut *dirOut;
babylonica 0:26fa30c35f74 52 DigitalOut *stepOut;
babylonica 0:26fa30c35f74 53 BusOut *stepModeBus;
babylonica 0:26fa30c35f74 54
babylonica 0:26fa30c35f74 55 stepMode_e stepMode;
babylonica 0:26fa30c35f74 56 PinName ms1Pin;
babylonica 0:26fa30c35f74 57 PinName ms2Pin;
babylonica 0:26fa30c35f74 58 PinName ms3Pin;
babylonica 0:26fa30c35f74 59 uint32_t oneRotationFullSteps;
babylonica 0:26fa30c35f74 60 stopMode_e stopMode;
babylonica 0:26fa30c35f74 61 uint32_t oneRotationSteps;
babylonica 0:26fa30c35f74 62 uint64_t pulseWidth_us;
babylonica 1:0f8209567b7d 63 volatile uint32_t halfPulseCount;
babylonica 1:0f8209567b7d 64 volatile uint32_t currentMaxStepCount;
babylonica 1:0f8209567b7d 65 volatile bool stopPulseOut;
babylonica 0:26fa30c35f74 66
babylonica 0:26fa30c35f74 67 void ISR_PULSEOUT( void );
babylonica 0:26fa30c35f74 68
babylonica 1:0f8209567b7d 69
babylonica 0:26fa30c35f74 70 public:
babylonica 0:26fa30c35f74 71 /*!
babylonica 0:26fa30c35f74 72 @brief Create a new AsyncStepper port.
babylonica 0:26fa30c35f74 73
babylonica 0:26fa30c35f74 74 @param enablePin A4988 Enable pin
babylonica 0:26fa30c35f74 75 @param stepPin A4988 Step pin
babylonica 0:26fa30c35f74 76 @param dirPin A4988 Direction pin
babylonica 0:26fa30c35f74 77 @param rpm RPM
babylonica 0:26fa30c35f74 78 @param stepMode Division ratio
babylonica 0:26fa30c35f74 79 @param ms1Pin A4988 MS1
babylonica 0:26fa30c35f74 80 @param ms2Pin A4988 MS2
babylonica 0:26fa30c35f74 81 @param ms3Pin A4988 MS1
babylonica 0:26fa30c35f74 82 @param oneRotationFullSteps Steps per rotation of your stepper motor
babylonica 0:26fa30c35f74 83 @param stopMode Enable/Disable holding torque
babylonica 0:26fa30c35f74 84 */
babylonica 0:26fa30c35f74 85 AsyncStepper( PinName enablePin, PinName stepPin, PinName dirPin, uint32_t rpm, stepMode_e stepMode=FULL, PinName ms1Pin=NC, PinName ms2Pin=NC, PinName ms3Pin=NC, uint32_t oneRotationFullSteps=200, stopMode_e stopMode=FREE );
babylonica 0:26fa30c35f74 86
babylonica 0:26fa30c35f74 87 /*!
babylonica 0:26fa30c35f74 88 @brief Destrutor of AsyncStepper
babylonica 0:26fa30c35f74 89 */
babylonica 0:26fa30c35f74 90 virtual ~AsyncStepper();
babylonica 0:26fa30c35f74 91
babylonica 0:26fa30c35f74 92 /*!
babylonica 0:26fa30c35f74 93 @brief Set RPM of the stepper motor
babylonica 0:26fa30c35f74 94 @param rpm
babylonica 0:26fa30c35f74 95 */
babylonica 0:26fa30c35f74 96 virtual void SetRPM( uint32_t rpm );
babylonica 0:26fa30c35f74 97
babylonica 0:26fa30c35f74 98 /*!
babylonica 0:26fa30c35f74 99 @brief Set division ratio of the stepper motor
babylonica 0:26fa30c35f74 100 @param stepMode division ratio
babylonica 0:26fa30c35f74 101 */
babylonica 0:26fa30c35f74 102 virtual void SetStepMode( stepMode_e stepMode );
babylonica 0:26fa30c35f74 103
babylonica 0:26fa30c35f74 104 /*!
babylonica 0:26fa30c35f74 105 @brief Apply the current to the stepper motor
babylonica 0:26fa30c35f74 106 */
babylonica 0:26fa30c35f74 107 virtual void Enable( void );
babylonica 0:26fa30c35f74 108
babylonica 0:26fa30c35f74 109 /*!
babylonica 0:26fa30c35f74 110 @brief Stop the current to the stepper motor
babylonica 0:26fa30c35f74 111 */
babylonica 0:26fa30c35f74 112 virtual void Disable( void );
babylonica 0:26fa30c35f74 113
babylonica 0:26fa30c35f74 114 /*!
babylonica 0:26fa30c35f74 115 @brief Check the stepper motor stopping
babylonica 0:26fa30c35f74 116
babylonica 0:26fa30c35f74 117 @retval true Yes (Stopping)
babylonica 0:26fa30c35f74 118 @retval false No
babylonica 0:26fa30c35f74 119 */
babylonica 0:26fa30c35f74 120 virtual bool IsStopping( void );
babylonica 0:26fa30c35f74 121
babylonica 0:26fa30c35f74 122 /*!
babylonica 0:26fa30c35f74 123 @brief Rotate the stepper motor
babylonica 0:26fa30c35f74 124
babylonica 0:26fa30c35f74 125 @param direction POSITIVE or NEGATIVE
babylonica 0:26fa30c35f74 126 @param steps Steps of rotation
babylonica 0:26fa30c35f74 127 */
babylonica 0:26fa30c35f74 128 virtual void Rotate( direction_e direction, uint32_t steps );
babylonica 0:26fa30c35f74 129 };
babylonica 0:26fa30c35f74 130
babylonica 0:26fa30c35f74 131
babylonica 0:26fa30c35f74 132 #endif