Biblioteka za upravljanje unipolarnim motorom

Files at this revision

API Documentation at this revision

Comitter:
mario_meh
Date:
Wed Feb 08 01:22:42 2017 +0000
Parent:
1:9cd4fd37eee0
Commit message:
umotor biblioteka, uklonjene if() koje su nepregledne za kod i ote?avaju kori?tenje umotor biblioteke. ; Joystick poku?aj da se rije?i problem sa prekidima na analognom ulazu sa strukturom i tickerom ali i dalje ne pokazuje USB serial ni?ta.

Changed in this revision

umotor.cpp Show annotated file Show diff for this revision Revisions of this file
umotor.h Show annotated file Show diff for this revision Revisions of this file
diff -r 9cd4fd37eee0 -r b769f13c7523 umotor.cpp
--- a/umotor.cpp	Mon Jan 30 00:22:04 2017 +0000
+++ b/umotor.cpp	Wed Feb 08 01:22:42 2017 +0000
@@ -1,147 +1,99 @@
 /** Projektiranje ugradbenih računalnih sustava
-* Interakcija sa linijom
+* Default metoda za unipolarni steper motor
 * @author: mario_meh
 * @code
-#include "mbed.h"
-#include "umotor.h"
-
-* int main() {
-*     Steper *bipolar = new Steper();
-*     while(1) {
-*         bipolar->u_motor();
-*    }
-* }
+* #include "mbed.h"
+* #include "umotor.h"
+*
+*
+* Steper *unipolar = new Steper();    
+* unipolar->u_poz.u_krenuo = 1;  // Treba biti 1(0)
+* unipolar->u_poz.u_stao = 0;    // Treba biti 0(1)
+* unipolar->Brzina(4000);        // < brzina = brze i krace
+* unipolar->UEnable();           // Pokreni umotor 
+*
 * @endcode
 */
 #include "mbed.h"
 #include "umotor.h"
 
-volatile uint8_t speed_step = 0;
-uint32_t g_tmr_multiplicator = 5;
-int koraka;
-int available = 1;
-static uint8_t step = 0;
+#define OKRETAJA 4000
+#define STEPER_STEP 0.5
+
+int step;
+int broji;
+int u_okretaja = OKRETAJA;
+float za_step = STEPER_STEP;
 /** Unipolarni motor radi u half-step modu */
-const uint8_t schrittfolge[] = {0b1001, 0b1010, 0b0110, 0b0101};  // Vollschritt zwei Phasen
+const uint8_t u_zavojnica[8][4] = {{1,0,0,1}, {1,0,0,0}, {1,1,0,0}, {0,1,0,0}, {0,1,1,0}, {0,0,1,0}, {0,0,1,1}, {0,0,0,1}};
 /** Konstruktor 
 * inicijalizacija je: Steper <naziv> = new Steper;
 */
-Steper::Steper() : coil1(PTD2), coil2(PTD0), coil3(PTD5), coil4(PTA13),
-                    ledSec(PTB18), riseL(PTD6), fallL(PTD7), pbone(PTA5), pbtwo(PTA4)
+Steper::Steper() : coil1(PTC12), coil2(PTC13), coil3(PTC16), coil4(PTA13)
 
 {
     
-    //toggler.attach(this, &Steper::timer_isr, 0.001);
-    
 }
 
 bool pbonePressed = false;
-bool pbtwoPressed = false;
+bool ready = true;
 
-void Steper::stepper_step() 
+void Steper::stepper_step(int broji) 
 {
-    
-    static uint8_t step = 0;
-    
-    coil1 = 0x01 & (schrittfolge[step] >> 0 );
-    coil2 = 0x01 & (schrittfolge[step] >> 1 );
-    coil3 = 0x01 & (schrittfolge[step] >> 2 );
-    coil4 = 0x01 & (schrittfolge[step] >> 3 );
-    
-    step++;
-    
-    if (step >= ARRAY_SIZE(schrittfolge))
-        step = 0;
-    
+    static uint8_t i = 0;
+    if(u_t.read_us() > u_okretaja*za_step) {
+        switch(i) {
+            case 0:
+                coil1 = u_zavojnica[broji][0];
+                i++;
+            case 1:
+                coil2 = u_zavojnica[broji][1];
+                i++;
+            case 2:
+                coil3 = u_zavojnica[broji][2];
+                i++;
+            case 3:
+                coil4 = u_zavojnica[broji][3];
+                i++;
+            default:
+                i = 0;
+        }
+        u_t.reset();
+    }    
 } 
-/** <timer_isr()> zove stepper_steo() */
+
 void Steper::timer_isr() {
-    
-    static uint32_t g_tmr_cnt = 0;
-    g_tmr_cnt++;
-    if (g_tmr_cnt >= g_tmr_multiplicator) {
-        stepper_step();
-        g_tmr_cnt = 0;
-    }
-    
-}
-
-void Steper::pboneCallback(void) {
-    if(t.read_ms() > 20) {
-        pbonePressed = true;
+    step++;
+    if(step <= u_okretaja) {
+        u_motor();
     }
-    t.reset();
-}
-void Steper::pbtwoCallback(void) {
-    if(t.read_ms() > 20) {    
-        pbtwoPressed = true;
-    }
-    t.reset(); 
-}
-void Steper::togglerOff() { ledSec = 0; }
-void Steper::togglerRed() { 
-    ledSec = 1;
-    led.detach();
-    led.attach(this, &Steper::togglerOff, 0.2);
-}
-
-void motorStall() {
-    //toggler.detach();
 }
 
 void Steper::u_motor() {
-    riseL = 1;
-    fallL = 1;
-    ledSec = 1;
-    /** Imam flag za 2 tipkala */
-    pbone.fall(this, &Steper::pboneCallback);
-    pbtwo.fall(this, &Steper::pbtwoCallback);
-    /** Započni timer da bi mogao zvati prekid <timer_isr> */
-    t.start();
-    toggler.attach(this, &Steper::timer_isr, 0.001);
- 
-    while(1) {
-        static uint8_t speed_step = 0;
-        if (pbonePressed) {
-            toggler.attach(this, &Steper::timer_isr, 0.001);
-            pbonePressed = !pbonePressed;
-            led.attach(this, &Steper::togglerRed, 1);
-            // Do actions required when button one is pressed.
-            riseL = !riseL;
-            
-            switch(speed_step){
-              case 0:
-                g_tmr_multiplicator = 5;
-                speed_step++;
-              break;
-              
-              case 1:
-                g_tmr_multiplicator = 10;
-                speed_step++;
-              break;
-              
-              case 2:
-                g_tmr_multiplicator = 20;
-                speed_step++;
-              break;
-              
-              case 3:
-                g_tmr_multiplicator = 50;
-                speed_step = 0;
-              break;
-              
-              default:
-                speed_step = 0;
-              break;
-            }
+    if(u_poz.u_krenuo == 1) {
+        stepper_step(broji++);
+        if(broji == 8) {
+            broji = 0;
         }
-        if (pbtwoPressed) {
-            pbtwoPressed = false;
-            // Do actions required when button two is pressed.
-            fallL = !fallL;
-            toggler.detach();
-            
-            //void motorStall();
-        } 
+    }
+    if(u_poz.u_stao) {
+        u_ticker.detach();
+    }
+}
+
+int Steper::Brzina(int okretaja) {
+    if(okretaja < OKRETAJA) {
+        u_okretaja = okretaja;
+        za_step = (float)((STEPER_STEP*1000)/OKRETAJA);
     }
+    if(okretaja >= OKRETAJA) {
+        u_okretaja = okretaja;
+        za_step = (float)((STEPER_STEP*1000)/OKRETAJA);
+    }
+    return u_okretaja;
+}
+
+void Steper::UEnable() {
+    u_t.start();
+    u_ticker.attach_us(this, &Steper::timer_isr, u_okretaja);
 }
\ No newline at end of file
diff -r 9cd4fd37eee0 -r b769f13c7523 umotor.h
--- a/umotor.h	Mon Jan 30 00:22:04 2017 +0000
+++ b/umotor.h	Wed Feb 08 01:22:42 2017 +0000
@@ -1,31 +1,34 @@
 #ifndef STEPER_H
 #define STEPER_H
+#ifndef MBED_H
+#include "mbed.h"
+#endif 
+#ifndef GLOBAL_NAZIVI_H
+#include "global_nazivi.h"
+#endif
 
 #define ARRAY_SIZE(x)  (sizeof(x) / sizeof(*x))
 #define BROJ_KORAKA 50
 
+typedef struct {
+    int u_krenuo;
+    int u_stao;
+}UPozicija;
+
 class Steper {
     
     public:
         Steper();
-        void stepper_step();
+        void stepper_step(int broji);
         void timer_isr();
         void u_motor();
-        
+        void pboneCallback(void);
+        void UEnable();
+        UPozicija u_poz;
+        int Brzina(int okretaja);        
     private:
-        void pboneCallback();
-        void pbtwoCallback();
-        void togglerOff();
-        void togglerRed();
-        DigitalOut ledSec;        
-        DigitalOut riseL;
-        DigitalOut fallL; 
-        InterruptIn pbone;
-        InterruptIn pbtwo;
-        Timer t;
-        Ticker toggler;
-        Ticker led;
-        Timeout detachToggler;
+        Timer u_t;
+        Ticker u_ticker;
         DigitalOut coil1, coil2, coil3, coil4;