]> rtime.felk.cvut.cz Git - sysless.git/commitdiff
eb_ebb: engine.c - pwm bug fixed
authorJiri Kubias <jiri.kubias@gmail.com>
Thu, 17 Apr 2008 10:40:26 +0000 (12:40 +0200)
committerJiri Kubias <jiri.kubias@gmail.com>
Thu, 17 Apr 2008 10:40:26 +0000 (12:40 +0200)
servo.c  - code update (just is now nicer)
main.c   - sample code updated

app/eb_ebb/engine.c
app/eb_ebb/main.c
app/eb_ebb/servo.c

index ae7344ca8a16ed3a906dddd144d4c3689e55cf26..36d0881dcc37f693385c7bd7d9c593466f766a4e 100644 (file)
@@ -15,7 +15,7 @@
 #define ENGINE_IN2A    25      //27    // pin P1.27
 #define ENGINE_IN2B    29      // pin P1.29
 
-#define PWM_STEP ((CPU_APB_HZ / 20000)/100)
+#define PWM_STEP ((CPU_APB_HZ / 20000)/100 + 1)
 
 //unsigned int engineStep = 0;
 
@@ -55,7 +55,9 @@ void engine_B_dir(unsigned dir)
 void engine_A_pwm(unsigned pwm)
 {
        if (pwm>100) pwm = 100;
-       PWMMR2 = PWM_STEP  * pwm;
+
+       if (IO1PIN & (1<<ENGINE_IN2A))  PWMMR2 = PWM_STEP  * (100 - pwm);
+       else PWMMR2 = PWM_STEP  * (pwm);
        PWMLER |= PWMLER_LA2_m;
 
 }
@@ -63,7 +65,8 @@ void engine_A_pwm(unsigned pwm)
 void engine_B_pwm(unsigned pwm)
 {
        if (pwm>100) pwm = 100;
-       PWMMR4 = PWM_STEP  * pwm;
+       if (IO1PIN & (1<<ENGINE_IN2B))  PWMMR4 = PWM_STEP  * (100 - pwm);
+       else PWMMR4 = PWM_STEP  * (pwm);        
        PWMLER |= PWMLER_LA4_m;
 
 }
index c015b86c9235953d2a42d36df29c63f0ab6554b8..b33e3c527fdb0db883869233e96a162e76165d13 100644 (file)
@@ -5,6 +5,7 @@
 #include <periph/can.h>
 #include <string.h>
 #include <deb_led.h>
+#include <can_ids.h>
 #include "uart.h"
 #include "servo.h"
 #include "powswitch.h"
@@ -32,13 +33,20 @@ void can_rx(can_msg_t *msg) {
        can_msg_t rx_msg;
        
        memcpy(&rx_msg, msg, sizeof(can_msg_t));
+
        
+
+
        switch (rx_msg.id) {            // demo sample parsing recieved message by ID
-               case 0x00:
+               case CAN_SERVO:
+                       
+                       set_servo(0, rx_msg.data[0]);
+                       set_servo(1, rx_msg.data[1]);
+                       set_servo(2, rx_msg.data[2]);   
+
                        break;
                
-               case 0x01:              
-                       break;
+               
                
                default:
                        break;
@@ -61,7 +69,7 @@ void init_perip(void)    // inicializace periferii mikroprocesoru
 }
 
 
-
+can_msg_t msg;
 
 
 int main (void)  {
@@ -73,13 +81,22 @@ int main (void)  {
        set_servo(1, 0x80);
        set_servo(2, 0x80);
 
-       engine_A_dir(ENGINE_DIR_BW);//FW);
-       engine_B_dir(ENGINE_DIR_FW);
+       engine_A_dir(ENGINE_DIR_FW);//FW);
+       engine_B_dir(ENGINE_DIR_BW);
        engine_A_en(ENGINE_EN_ON);
        engine_B_en(ENGINE_EN_ON);
-       engine_A_pwm(70);
-       engine_B_pwm(70);
-       
+       engine_A_pwm(0);
+       engine_B_pwm(0);
+
+
+/*             msg.id = 0xAA;
+               msg.flags = 0;
+               msg.dlc = 1;
+               msg.data[0] = 0x55;
+               
+               
+               
+       //      while(can_tx_msg(&msg));*/      
  
        while(1)
        {                  
@@ -87,6 +104,10 @@ int main (void)  {
                dummy_wait();
                __deb_led_off(LEDG);
                dummy_wait();
+
+
+
+
        } 
 }
 
index 88c322abae561143830b1c8c7bb842b40555358a..2f9e0d7517a50b9f3b552d00ab26fa3a62084f51 100644 (file)
 #define TIM_EMR_PIN_ON 1
 #define TIM_EMR_PIN_OFF 0
 
+#define TIME20MS       ((CPU_APB_HZ) / 50)
+#define SERVOTICK      (((CPU_APB_HZ / 50) / 20) / 256)
+
 
-unsigned int time20ms = 0;
-unsigned int servotick = 0;
 unsigned char servo[3];
 
 
@@ -37,9 +38,9 @@ void tc1 (void)   {
        
        T1EMR |= (TIM_EMR_PIN_ON<<0) | (TIM_EMR_PIN_ON<<1) | (TIM_EMR_PIN_ON<<3);
 
-       T1MR0 = (servo[0] + 256) * servotick;   
-       T1MR1 = (servo[1] + 256) * servotick;
-       T1MR3 = (servo[2] + 256) * servotick;
+       T1MR0 = (servo[0] + 256) * SERVOTICK;   
+       T1MR1 = (servo[1] + 256) * SERVOTICK;
+       T1MR3 = (servo[2] + 256) * SERVOTICK;
 
        if (T1IR != 4)
        {                       
@@ -69,18 +70,16 @@ void init_servo (unsigned rx_isr_vect)
        PINSEL1 &= ~(PINSEL_3 << 8);
        PINSEL1 |= (PINSEL_1 << 8);
        
-       time20ms = ((CPU_APB_HZ) / 50); 
-       servotick = (time20ms / 20) / 256;      
 
        servo[0] = 0; 
        servo[1] = 127;
        servo[2] = 0xFF;
 
        T1PR = 0;
-       T1MR2 = time20ms;
-       T1MR0 = (servo[0] + 256) * servotick;   
-       T1MR1 = (servo[1] + 256) * servotick;
-       T1MR3 = (servo[2] + 256)* servotick;
+       T1MR2 = TIME20MS;
+       T1MR0 = (servo[0] + 256) * SERVOTICK;   
+       T1MR1 = (servo[1] + 256) * SERVOTICK;
+       T1MR3 = (servo[2] + 256)* SERVOTICK;
        T1MCR = (3<<6);                 // interrupt on MR1
 
        T1EMR = (TIM_EMR_PIN_ON<<0) | (TIM_EMR_PIN_ON<<1) | (TIM_EMR_PIN_ON<<3) \