Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
AsyncStepper.hpp@1:0f8209567b7d, 2018-07-28 (annotated)
- 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?
| User | Revision | Line number | New 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 |