Example brushed dc motor example using an H-Bridge for motor direction/speed control and an opto interrupter for position/velocity feedback.

Dependencies:   mbed

Committer:
lhiggs
Date:
Thu Oct 11 23:10:44 2012 +0000
Revision:
0:6f586d7c134c
First version of motor control example using an opto interrupter and H-Bridge.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lhiggs 0:6f586d7c134c 1 #include "mbed.h"
lhiggs 0:6f586d7c134c 2
lhiggs 0:6f586d7c134c 3 PwmOut EN(p22);
lhiggs 0:6f586d7c134c 4 DigitalOut A1(p16);
lhiggs 0:6f586d7c134c 5 DigitalOut A2(p17);
lhiggs 0:6f586d7c134c 6
lhiggs 0:6f586d7c134c 7 Serial pc(USBTX, USBRX);
lhiggs 0:6f586d7c134c 8
lhiggs 0:6f586d7c134c 9 long float delta_time = 0;
lhiggs 0:6f586d7c134c 10 float rpm = 0;
lhiggs 0:6f586d7c134c 11 float inc_enc_constant = 0.03125; // 32 Encoder Ticks per Revolution
lhiggs 0:6f586d7c134c 12
lhiggs 0:6f586d7c134c 13
lhiggs 0:6f586d7c134c 14 Timer t;
lhiggs 0:6f586d7c134c 15 // t.read_us() is 32bit interger, max 2^31 - 1 = 2147483647 us = 2147.483647 s = 35.7913941167 min
lhiggs 0:6f586d7c134c 16
lhiggs 0:6f586d7c134c 17 class Counter
lhiggs 0:6f586d7c134c 18 {
lhiggs 0:6f586d7c134c 19 public:
lhiggs 0:6f586d7c134c 20
lhiggs 0:6f586d7c134c 21
lhiggs 0:6f586d7c134c 22 Counter(PinName pin) : _interrupt(pin) { // create the InterruptIn on the pin specified to Counter
lhiggs 0:6f586d7c134c 23 _interrupt.fall(this, &Counter::increment); // attach increment function of this counter instance
lhiggs 0:6f586d7c134c 24 }
lhiggs 0:6f586d7c134c 25
lhiggs 0:6f586d7c134c 26
lhiggs 0:6f586d7c134c 27 void increment() {
lhiggs 0:6f586d7c134c 28 delta_time = t.read_us();
lhiggs 0:6f586d7c134c 29 t.reset();
lhiggs 0:6f586d7c134c 30
lhiggs 0:6f586d7c134c 31 rpm = ( inc_enc_constant / (delta_time/1000000) ) *60 ; // rev / m
lhiggs 0:6f586d7c134c 32
lhiggs 0:6f586d7c134c 33 _count++;
lhiggs 0:6f586d7c134c 34 }
lhiggs 0:6f586d7c134c 35
lhiggs 0:6f586d7c134c 36 int read() {
lhiggs 0:6f586d7c134c 37 return _count;
lhiggs 0:6f586d7c134c 38 }
lhiggs 0:6f586d7c134c 39
lhiggs 0:6f586d7c134c 40 private:
lhiggs 0:6f586d7c134c 41 InterruptIn _interrupt;
lhiggs 0:6f586d7c134c 42 volatile int _count;
lhiggs 0:6f586d7c134c 43 };
lhiggs 0:6f586d7c134c 44
lhiggs 0:6f586d7c134c 45
lhiggs 0:6f586d7c134c 46
lhiggs 0:6f586d7c134c 47
lhiggs 0:6f586d7c134c 48
lhiggs 0:6f586d7c134c 49 Counter counter(p30); // opto interrupter counter
lhiggs 0:6f586d7c134c 50
lhiggs 0:6f586d7c134c 51 int main()
lhiggs 0:6f586d7c134c 52 {
lhiggs 0:6f586d7c134c 53 pc.baud(115200);
lhiggs 0:6f586d7c134c 54 EN.period(0.020);
lhiggs 0:6f586d7c134c 55
lhiggs 0:6f586d7c134c 56 t.start();
lhiggs 0:6f586d7c134c 57
lhiggs 0:6f586d7c134c 58 float duty = 0.10;
lhiggs 0:6f586d7c134c 59
lhiggs 0:6f586d7c134c 60 while(1) {
lhiggs 0:6f586d7c134c 61
lhiggs 0:6f586d7c134c 62 wait(1);
lhiggs 0:6f586d7c134c 63
lhiggs 0:6f586d7c134c 64 EN.write(duty);
lhiggs 0:6f586d7c134c 65 duty = duty + 0.01; // increment H-Bridge EN PWM duty cycle 1%
lhiggs 0:6f586d7c134c 66 A1 = 1; // set H-Bridge input A1 high
lhiggs 0:6f586d7c134c 67 A2 = 0; // set H-Bridge input A2 low
lhiggs 0:6f586d7c134c 68
lhiggs 0:6f586d7c134c 69 // pc.printf("Count so far: %d\n", counter.read());
lhiggs 0:6f586d7c134c 70 // pc.printf("dt: %d\n", delta_time);
lhiggs 0:6f586d7c134c 71
lhiggs 0:6f586d7c134c 72 pc.printf("RPM: %f\n", rpm);
lhiggs 0:6f586d7c134c 73 pc.printf("DUTY CYCLE: %f\n",duty);
lhiggs 0:6f586d7c134c 74
lhiggs 0:6f586d7c134c 75 }
lhiggs 0:6f586d7c134c 76 }