Library for handle a Stepper Motor Driver Borad

Committer:
dury
Date:
Sun Dec 16 16:39:40 2012 +0000
Revision:
1:b96435078d4d
Parent:
0:ce88091ae9fb
Library for move Stepper Motor using DIR and CLK pin of a control board.;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dury 1:b96435078d4d 1 /* mbed Stepper Motor Library
dury 1:b96435078d4d 2 * Copyright (c) 2012 Fabio Durigon
dury 1:b96435078d4d 3 *
dury 1:b96435078d4d 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
dury 1:b96435078d4d 5 * of this software and associated documentation files (the "Software"), to deal
dury 1:b96435078d4d 6 * in the Software without restriction, including without limitation the rights
dury 1:b96435078d4d 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
dury 1:b96435078d4d 8 * copies of the Software, and to permit persons to whom the Software is
dury 1:b96435078d4d 9 * furnished to do so, subject to the following conditions:
dury 1:b96435078d4d 10 *
dury 1:b96435078d4d 11 * The above copyright notice and this permission notice shall be included in
dury 1:b96435078d4d 12 * all copies or substantial portions of the Software.
dury 1:b96435078d4d 13 *
dury 1:b96435078d4d 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
dury 1:b96435078d4d 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
dury 1:b96435078d4d 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
dury 1:b96435078d4d 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
dury 1:b96435078d4d 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
dury 1:b96435078d4d 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
dury 1:b96435078d4d 20 * THE SOFTWARE.
dury 1:b96435078d4d 21 */
dury 1:b96435078d4d 22
dury 1:b96435078d4d 23 #ifndef STEPPERMOTOR_H
dury 1:b96435078d4d 24 #define STEPPERMOTOR_H
dury 1:b96435078d4d 25
dury 1:b96435078d4d 26 #include "mbed.h"
dury 1:b96435078d4d 27
dury 1:b96435078d4d 28 //!Library for handle Stepper Motor with a Power Module with Clock and Dir input
dury 1:b96435078d4d 29
dury 1:b96435078d4d 30 // Rotation direction
dury 1:b96435078d4d 31 #define CW 1
dury 1:b96435078d4d 32 #define CC 0
dury 1:b96435078d4d 33
dury 1:b96435078d4d 34 /** Library to control a Stepper Motor Driver Board with Clock and Dir input*/
dury 1:b96435078d4d 35 class StepperMotorDrv
dury 1:b96435078d4d 36 {
dury 1:b96435078d4d 37 public:
dury 1:b96435078d4d 38 /** Create a StepperMotorDrv Object
dury 1:b96435078d4d 39 *
dury 1:b96435078d4d 40 * @param PinDir Digital Output Pin to set Direction of motor
dury 1:b96435078d4d 41 * @param PinClk Pwm Output Pin for Clock signal
dury 1:b96435078d4d 42 */
dury 1:b96435078d4d 43 StepperMotorDrv(PinName PinDir, PinName PinClk);
dury 1:b96435078d4d 44
dury 1:b96435078d4d 45 /** Destroys an instance of StepperMotorDrv Object*/
dury 1:b96435078d4d 46 ~StepperMotorDrv();
dury 1:b96435078d4d 47
dury 1:b96435078d4d 48 /** Set duty cycle of clock pulse in Percentual
dury 1:b96435078d4d 49 *
dury 1:b96435078d4d 50 * @param PercentualValue Value 0-100%
dury 1:b96435078d4d 51 */
dury 1:b96435078d4d 52 void SetDutyCyclePerc(float PercentualValue);
dury 1:b96435078d4d 53
dury 1:b96435078d4d 54 /** Set duty cycle of clock pulse in decimal value
dury 1:b96435078d4d 55 *
dury 1:b96435078d4d 56 * @param DecimalValue 0.0 to 1.0 (0.5 = 50%)
dury 1:b96435078d4d 57 */
dury 1:b96435078d4d 58 void SetDutyCycle(float DecimalValue);
dury 1:b96435078d4d 59
dury 1:b96435078d4d 60 /** Set Motor Speed: frequency of clock pulse to apply on PinClk
dury 1:b96435078d4d 61 *
dury 1:b96435078d4d 62 * @param SpeedHz Frequency value in Hz
dury 1:b96435078d4d 63 */
dury 1:b96435078d4d 64 void SetSpeed(float SpeedHz);
dury 1:b96435078d4d 65
dury 1:b96435078d4d 66 /** Set MaxSpeed parameter used only by "Perc functions"
dury 1:b96435078d4d 67 * to calculate raw frequency to apply.
dury 1:b96435078d4d 68 *
dury 1:b96435078d4d 69 * @param MaxSpeedHz Frequency in Hz
dury 1:b96435078d4d 70 *
dury 1:b96435078d4d 71 *
dury 1:b96435078d4d 72 * Example:
dury 1:b96435078d4d 73 * @code
dury 1:b96435078d4d 74 * SetMaxSpeed(1000); // Max Speed is 1000 Hz
dury 1:b96435078d4d 75 * SetSpeedPerc(50); // Set Speed to 50% that means 500 Hz
dury 1:b96435078d4d 76 * @endcode
dury 1:b96435078d4d 77 *
dury 1:b96435078d4d 78 *
dury 1:b96435078d4d 79 */
dury 1:b96435078d4d 80 void SetMaxSpeed(float MaxSpeedHz);
dury 1:b96435078d4d 81
dury 1:b96435078d4d 82 /** Set Speed in Perc of MaxSpeed
dury 1:b96435078d4d 83 * @param PercValue 0 to 100 (in %)
dury 1:b96435078d4d 84 *
dury 1:b96435078d4d 85 *
dury 1:b96435078d4d 86 * Example:
dury 1:b96435078d4d 87 * @code
dury 1:b96435078d4d 88 * SetMaxSpeed(1000); // Max Speed is 1000 Hz
dury 1:b96435078d4d 89 * SetSpeedPerc(100); // Set Speed to 100% that means 1000 Hz
dury 1:b96435078d4d 90 * @endcode
dury 1:b96435078d4d 91 *
dury 1:b96435078d4d 92 *
dury 1:b96435078d4d 93 */
dury 1:b96435078d4d 94 void SetSpeedPerc(float PercValue);
dury 1:b96435078d4d 95
dury 1:b96435078d4d 96 /** Increment Speed by Hz value
dury 1:b96435078d4d 97 * @param StepValueHz: amount of Hz to add to velocity
dury 1:b96435078d4d 98 *
dury 1:b96435078d4d 99 * @return new Speed in Hz
dury 1:b96435078d4d 100 */
dury 1:b96435078d4d 101 float SpeedUp(float ValueHz);
dury 1:b96435078d4d 102
dury 1:b96435078d4d 103 /** Decrement Speed by Hz value
dury 1:b96435078d4d 104 * @param StepValueHz: amount of Hz to substract to velocity
dury 1:b96435078d4d 105 *
dury 1:b96435078d4d 106 * @return new Speed in Hz
dury 1:b96435078d4d 107 */
dury 1:b96435078d4d 108 float SpeedDown(float ValueHz);
dury 1:b96435078d4d 109
dury 1:b96435078d4d 110 /** Set Step value to apply in SpeedUp() SpeedDown() like functions
dury 1:b96435078d4d 111 * @param StepValueHz: value in Hz
dury 1:b96435078d4d 112 *
dury 1:b96435078d4d 113 *
dury 1:b96435078d4d 114 * Example:
dury 1:b96435078d4d 115 * @code
dury 1:b96435078d4d 116 * SetStep(10); // Set Step to 10 Hz
dury 1:b96435078d4d 117 * ...
dury 1:b96435078d4d 118 * SpeedUp(); // Increase Speed by 10 Hz
dury 1:b96435078d4d 119 * ...
dury 1:b96435078d4d 120 * @endcode
dury 1:b96435078d4d 121 *
dury 1:b96435078d4d 122 *
dury 1:b96435078d4d 123 */
dury 1:b96435078d4d 124 void SetSpeedJump(float ValueHz);
dury 1:b96435078d4d 125
dury 1:b96435078d4d 126 /** Increase velocity by a Step set with SetStep() function
dury 1:b96435078d4d 127 *
dury 1:b96435078d4d 128 * @return new Speed in Hz
dury 1:b96435078d4d 129 *
dury 1:b96435078d4d 130 */
dury 1:b96435078d4d 131 float SpeedUp(void);
dury 1:b96435078d4d 132
dury 1:b96435078d4d 133 /** Decrease velocity by a Step set with SetStep() function
dury 1:b96435078d4d 134 *
dury 1:b96435078d4d 135 * @return new Speed in Hz
dury 1:b96435078d4d 136 *
dury 1:b96435078d4d 137 */
dury 1:b96435078d4d 138 float SpeedDown(void);
dury 1:b96435078d4d 139
dury 1:b96435078d4d 140 /** Get Current Speed in Hz*/
dury 1:b96435078d4d 141 float GetSpeed(void);
dury 1:b96435078d4d 142
dury 1:b96435078d4d 143 /** Get Current Speed in Percentual*/
dury 1:b96435078d4d 144 float GetSpeedPerc(void);
dury 1:b96435078d4d 145
dury 1:b96435078d4d 146 /** Get MaxSpeed parameter set (in Hz)*/
dury 1:b96435078d4d 147 float GetMaxSpeed(void);
dury 1:b96435078d4d 148
dury 1:b96435078d4d 149 /** Get duty cycle value in Percentual*/
dury 1:b96435078d4d 150 float GetDutyCyclePerc(void);
dury 1:b96435078d4d 151
dury 1:b96435078d4d 152 /** Get duty cycle in decimal value (Ex: 0.5 means 50%)*/
dury 1:b96435078d4d 153 float GetDutyCycle(void);
dury 1:b96435078d4d 154
dury 1:b96435078d4d 155 /** Get step value for SpedUp/Down (in Hz)*/
dury 1:b96435078d4d 156 float GetSpeedJump(void);
dury 1:b96435078d4d 157
dury 1:b96435078d4d 158 /** Set Rotation Direction
dury 1:b96435078d4d 159 * @param RotationDir 1 or CW for ClockWise rotation, 0 or CC for Counterclockwise rotation
dury 1:b96435078d4d 160 *
dury 1:b96435078d4d 161 * N.B. CW and CC depends from MotorBoard Specs
dury 1:b96435078d4d 162 *
dury 1:b96435078d4d 163 */
dury 1:b96435078d4d 164 void SetDir(bool RotationDir);
dury 1:b96435078d4d 165
dury 1:b96435078d4d 166 /** Set Rotation Direction to CW*/
dury 1:b96435078d4d 167 void SetDirCW(void);
dury 1:b96435078d4d 168
dury 1:b96435078d4d 169 /** Set Rotation Direction to CC*/
dury 1:b96435078d4d 170 void SetDirCC(void);
dury 1:b96435078d4d 171
dury 1:b96435078d4d 172 /** Revert Direction*/
dury 1:b96435078d4d 173 void RevertDir(void);
dury 1:b96435078d4d 174
dury 1:b96435078d4d 175 /** Get current Direction
dury 1:b96435078d4d 176 *
dury 1:b96435078d4d 177 * @return 1 for CW, o for CC
dury 1:b96435078d4d 178 */
dury 1:b96435078d4d 179 bool GetDir(void);
dury 1:b96435078d4d 180
dury 1:b96435078d4d 181 /** Run Motor*/
dury 1:b96435078d4d 182 void Run(void);
dury 1:b96435078d4d 183
dury 1:b96435078d4d 184 /** Stop Motor*/
dury 1:b96435078d4d 185 void Stop(void);
dury 1:b96435078d4d 186
dury 1:b96435078d4d 187 /** Run <nrSteps> step in <RotationDir> direction*/
dury 1:b96435078d4d 188 void RunStep(int nrSteps, bool RotationDir);
dury 1:b96435078d4d 189
dury 1:b96435078d4d 190 /** Run <nrSteps> step in current direction*/
dury 1:b96435078d4d 191 void RunStep(int nrSteps);
dury 1:b96435078d4d 192
dury 1:b96435078d4d 193 /** Run one step in current direction*/
dury 1:b96435078d4d 194 void RunStep(void);
dury 1:b96435078d4d 195
dury 1:b96435078d4d 196 /** Run one step in clockwise direction*/
dury 1:b96435078d4d 197 void RunStepCW(void);
dury 1:b96435078d4d 198
dury 1:b96435078d4d 199 /** Run one step in counterclockwise direction*/
dury 1:b96435078d4d 200 void RunStepCC(void);
dury 1:b96435078d4d 201
dury 1:b96435078d4d 202 /** Reset current position to 0
dury 1:b96435078d4d 203 * currPos=0
dury 1:b96435078d4d 204 * currDegree=0
dury 1:b96435078d4d 205 */
dury 1:b96435078d4d 206 void SetZero(void);
dury 1:b96435078d4d 207
dury 1:b96435078d4d 208 /** Set internal <currPos> to Pos
dury 1:b96435078d4d 209 * be carefull if you use degrees funcions
dury 1:b96435078d4d 210 * this don't affect the degrees variables
dury 1:b96435078d4d 211 */
dury 1:b96435078d4d 212 void SetCurrPos(int Pos);
dury 1:b96435078d4d 213
dury 1:b96435078d4d 214 /* Get current position in steps positive or negative relative to zero*/
dury 1:b96435078d4d 215 int GetCurrPos(void);
dury 1:b96435078d4d 216
dury 1:b96435078d4d 217 /** Get current Period of duty cycle in seconds*/
dury 1:b96435078d4d 218 float GetPeriod(void);
dury 1:b96435078d4d 219
dury 1:b96435078d4d 220 /** Set degrees of rotation by one step of motor
dury 1:b96435078d4d 221 * Set it if You want to use Degrees functions
dury 1:b96435078d4d 222 *
dury 1:b96435078d4d 223 *
dury 1:b96435078d4d 224 * Example:
dury 1:b96435078d4d 225 * @code
dury 1:b96435078d4d 226 * SetDegreePerStep(1.6); // 1.6 degrees for each motor step
dury 1:b96435078d4d 227 * SetZero();
dury 1:b96435078d4d 228 * RunStep(10); // move 1.6 * 10 = 16 degrees
dury 1:b96435078d4d 229 * printf("%f",GetCurrentDegree()); // prints "16"
dury 1:b96435078d4d 230 * ...
dury 1:b96435078d4d 231 * @endcode
dury 1:b96435078d4d 232 *
dury 1:b96435078d4d 233 *
dury 1:b96435078d4d 234 */
dury 1:b96435078d4d 235 void SetDegreePerStep(float Degrees);
dury 1:b96435078d4d 236
dury 1:b96435078d4d 237 /** Get current "Degrees per one step" value*/
dury 1:b96435078d4d 238 float GetDegreePerStep(void);
dury 1:b96435078d4d 239
dury 1:b96435078d4d 240 /** Get current position in Degrees*/
dury 1:b96435078d4d 241 float GetCurrDegree(void);
dury 1:b96435078d4d 242
dury 1:b96435078d4d 243
dury 1:b96435078d4d 244 private:
dury 1:b96435078d4d 245 DigitalOut Dir;
dury 1:b96435078d4d 246 PwmOut Clock;
dury 1:b96435078d4d 247 float MaxSpeed;
dury 1:b96435078d4d 248 float Speed;
dury 1:b96435078d4d 249 float SpeedJump;
dury 1:b96435078d4d 250 float DutyCycle;
dury 1:b96435078d4d 251 int CurrPos;
dury 1:b96435078d4d 252 float tPeriod;
dury 1:b96435078d4d 253 float tUp;
dury 1:b96435078d4d 254 float tDown;
dury 1:b96435078d4d 255 float DegreesPerStep;
dury 1:b96435078d4d 256 float CurrDegree;
dury 1:b96435078d4d 257
dury 1:b96435078d4d 258 };
dury 0:ce88091ae9fb 259 #endif