Upravljanje unipolasnim motorom

Committer:
mario_meh
Date:
Sun Jan 29 23:53:10 2017 +0000
Revision:
0:a3d5b06d790a
Child:
1:9cd4fd37eee0
Univerzalni steper motor

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mario_meh 0:a3d5b06d790a 1 #include "mbed.h"
mario_meh 0:a3d5b06d790a 2 #include "umotor.h"
mario_meh 0:a3d5b06d790a 3
mario_meh 0:a3d5b06d790a 4 volatile uint8_t speed_step = 0;
mario_meh 0:a3d5b06d790a 5 uint32_t g_tmr_multiplicator = 5;
mario_meh 0:a3d5b06d790a 6 int koraka;
mario_meh 0:a3d5b06d790a 7 int available = 1;
mario_meh 0:a3d5b06d790a 8 static uint8_t step = 0;
mario_meh 0:a3d5b06d790a 9
mario_meh 0:a3d5b06d790a 10 const uint8_t schrittfolge[] = {0b1001, 0b1010, 0b0110, 0b0101}; // Vollschritt zwei Phasen
mario_meh 0:a3d5b06d790a 11
mario_meh 0:a3d5b06d790a 12 Steper::Steper() : coil1(PTD2), coil2(PTD0), coil3(PTD5), coil4(PTA13),
mario_meh 0:a3d5b06d790a 13 ledSec(PTB18), riseL(PTD6), fallL(PTD7), pbone(PTA5), pbtwo(PTA4)
mario_meh 0:a3d5b06d790a 14
mario_meh 0:a3d5b06d790a 15 {
mario_meh 0:a3d5b06d790a 16
mario_meh 0:a3d5b06d790a 17 //toggler.attach(this, &Steper::timer_isr, 0.001);
mario_meh 0:a3d5b06d790a 18
mario_meh 0:a3d5b06d790a 19 }
mario_meh 0:a3d5b06d790a 20
mario_meh 0:a3d5b06d790a 21 bool pbonePressed = false;
mario_meh 0:a3d5b06d790a 22 bool pbtwoPressed = false;
mario_meh 0:a3d5b06d790a 23
mario_meh 0:a3d5b06d790a 24 void Steper::stepper_step()
mario_meh 0:a3d5b06d790a 25 {
mario_meh 0:a3d5b06d790a 26
mario_meh 0:a3d5b06d790a 27 static uint8_t step = 0;
mario_meh 0:a3d5b06d790a 28
mario_meh 0:a3d5b06d790a 29 coil1 = 0x01 & (schrittfolge[step] >> 0 );
mario_meh 0:a3d5b06d790a 30 coil2 = 0x01 & (schrittfolge[step] >> 1 );
mario_meh 0:a3d5b06d790a 31 coil3 = 0x01 & (schrittfolge[step] >> 2 );
mario_meh 0:a3d5b06d790a 32 coil4 = 0x01 & (schrittfolge[step] >> 3 );
mario_meh 0:a3d5b06d790a 33
mario_meh 0:a3d5b06d790a 34 step++;
mario_meh 0:a3d5b06d790a 35
mario_meh 0:a3d5b06d790a 36 if (step >= ARRAY_SIZE(schrittfolge))
mario_meh 0:a3d5b06d790a 37 step = 0;
mario_meh 0:a3d5b06d790a 38
mario_meh 0:a3d5b06d790a 39 }
mario_meh 0:a3d5b06d790a 40
mario_meh 0:a3d5b06d790a 41 void Steper::timer_isr() {
mario_meh 0:a3d5b06d790a 42
mario_meh 0:a3d5b06d790a 43 static uint32_t g_tmr_cnt = 0;
mario_meh 0:a3d5b06d790a 44 g_tmr_cnt++;
mario_meh 0:a3d5b06d790a 45 if (g_tmr_cnt >= g_tmr_multiplicator) {
mario_meh 0:a3d5b06d790a 46 stepper_step();
mario_meh 0:a3d5b06d790a 47 g_tmr_cnt = 0;
mario_meh 0:a3d5b06d790a 48 }
mario_meh 0:a3d5b06d790a 49
mario_meh 0:a3d5b06d790a 50 }
mario_meh 0:a3d5b06d790a 51
mario_meh 0:a3d5b06d790a 52 void Steper::pboneCallback(void) {
mario_meh 0:a3d5b06d790a 53 if(t.read_ms() > 20) {
mario_meh 0:a3d5b06d790a 54 pbonePressed = true;
mario_meh 0:a3d5b06d790a 55 }
mario_meh 0:a3d5b06d790a 56 t.reset();
mario_meh 0:a3d5b06d790a 57 }
mario_meh 0:a3d5b06d790a 58 void Steper::pbtwoCallback(void) {
mario_meh 0:a3d5b06d790a 59 if(t.read_ms() > 20) {
mario_meh 0:a3d5b06d790a 60 pbtwoPressed = true;
mario_meh 0:a3d5b06d790a 61 }
mario_meh 0:a3d5b06d790a 62 t.reset();
mario_meh 0:a3d5b06d790a 63 }
mario_meh 0:a3d5b06d790a 64 void Steper::togglerOff() { ledSec = 0; }
mario_meh 0:a3d5b06d790a 65 void Steper::togglerRed() {
mario_meh 0:a3d5b06d790a 66 ledSec = 1;
mario_meh 0:a3d5b06d790a 67 led.detach();
mario_meh 0:a3d5b06d790a 68 led.attach(this, &Steper::togglerOff, 0.2);
mario_meh 0:a3d5b06d790a 69 }
mario_meh 0:a3d5b06d790a 70
mario_meh 0:a3d5b06d790a 71 void motorStall() {
mario_meh 0:a3d5b06d790a 72 //toggler.detach();
mario_meh 0:a3d5b06d790a 73 }
mario_meh 0:a3d5b06d790a 74
mario_meh 0:a3d5b06d790a 75 void Steper::u_motor() {
mario_meh 0:a3d5b06d790a 76 riseL = 1;
mario_meh 0:a3d5b06d790a 77 fallL = 1;
mario_meh 0:a3d5b06d790a 78 ledSec = 1;
mario_meh 0:a3d5b06d790a 79
mario_meh 0:a3d5b06d790a 80 pbone.fall(this, &Steper::pboneCallback);
mario_meh 0:a3d5b06d790a 81 pbtwo.fall(this, &Steper::pbtwoCallback);
mario_meh 0:a3d5b06d790a 82
mario_meh 0:a3d5b06d790a 83 t.start();
mario_meh 0:a3d5b06d790a 84 toggler.attach(this, &Steper::timer_isr, 0.001);
mario_meh 0:a3d5b06d790a 85
mario_meh 0:a3d5b06d790a 86 while(1) {
mario_meh 0:a3d5b06d790a 87 static uint8_t speed_step = 0;
mario_meh 0:a3d5b06d790a 88 if (pbonePressed) {
mario_meh 0:a3d5b06d790a 89 toggler.attach(this, &Steper::timer_isr, 0.001);
mario_meh 0:a3d5b06d790a 90 pbonePressed = !pbonePressed;
mario_meh 0:a3d5b06d790a 91 led.attach(this, &Steper::togglerRed, 1);
mario_meh 0:a3d5b06d790a 92 // Do actions required when button one is pressed.
mario_meh 0:a3d5b06d790a 93 riseL = !riseL;
mario_meh 0:a3d5b06d790a 94
mario_meh 0:a3d5b06d790a 95 switch(speed_step){
mario_meh 0:a3d5b06d790a 96 case 0:
mario_meh 0:a3d5b06d790a 97 g_tmr_multiplicator = 5;
mario_meh 0:a3d5b06d790a 98 speed_step++;
mario_meh 0:a3d5b06d790a 99 break;
mario_meh 0:a3d5b06d790a 100
mario_meh 0:a3d5b06d790a 101 case 1:
mario_meh 0:a3d5b06d790a 102 g_tmr_multiplicator = 10;
mario_meh 0:a3d5b06d790a 103 speed_step++;
mario_meh 0:a3d5b06d790a 104 break;
mario_meh 0:a3d5b06d790a 105
mario_meh 0:a3d5b06d790a 106 case 2:
mario_meh 0:a3d5b06d790a 107 g_tmr_multiplicator = 20;
mario_meh 0:a3d5b06d790a 108 speed_step++;
mario_meh 0:a3d5b06d790a 109 break;
mario_meh 0:a3d5b06d790a 110
mario_meh 0:a3d5b06d790a 111 case 3:
mario_meh 0:a3d5b06d790a 112 g_tmr_multiplicator = 50;
mario_meh 0:a3d5b06d790a 113 speed_step = 0;
mario_meh 0:a3d5b06d790a 114 break;
mario_meh 0:a3d5b06d790a 115
mario_meh 0:a3d5b06d790a 116 default:
mario_meh 0:a3d5b06d790a 117 speed_step = 0;
mario_meh 0:a3d5b06d790a 118 break;
mario_meh 0:a3d5b06d790a 119 }
mario_meh 0:a3d5b06d790a 120 }
mario_meh 0:a3d5b06d790a 121 if (pbtwoPressed) {
mario_meh 0:a3d5b06d790a 122 pbtwoPressed = false;
mario_meh 0:a3d5b06d790a 123 // Do actions required when button two is pressed.
mario_meh 0:a3d5b06d790a 124 fallL = !fallL;
mario_meh 0:a3d5b06d790a 125 toggler.detach();
mario_meh 0:a3d5b06d790a 126
mario_meh 0:a3d5b06d790a 127 //void motorStall();
mario_meh 0:a3d5b06d790a 128 }
mario_meh 0:a3d5b06d790a 129 }
mario_meh 0:a3d5b06d790a 130 }