]> rtime.felk.cvut.cz Git - fpga/lx-cpu1/lx-rocon.git/commitdiff
PXMCC firmware optimization and BDLC/PMSM mode change to 1.
authorPavel Pisa <ppisa@pikron.com>
Sat, 3 Jan 2015 22:51:22 +0000 (23:51 +0100)
committerPavel Pisa <ppisa@pikron.com>
Sat, 3 Jan 2015 22:51:22 +0000 (23:51 +0100)
Optimization reuses pxmcc_curadc_data_t cur_val field to store
current adjusted for reduced measurement time caused
by non zero time when PWM is switched to high side.

Signed-off-by: Pavel Pisa <ppisa@pikron.com>
hw/lx-rocon_firmware/firmware.c
hw/lx-rocon_firmware/pxmcc_types.h
sw/app/rocon/appl_tests.c

index 997bfba51c139b7905b6689fb3a0118044afedc1..82de62647094662835756e39651d714a25505883 100644 (file)
@@ -127,11 +127,11 @@ void main(void)
       pta = pti * pxmcc->ptreci;
 
       *FPGA_FNCAPPROX_SIN = pta;
-      asm volatile("nop\n": : : "memory");
-      asm volatile("nop\n": : : "memory");
-      asm volatile("nop\n": : : "memory");
+      asm volatile("nop\n");
+      asm volatile("nop\n");
+      asm volatile("nop\n");
       pxmcc->ptsin = *FPGA_FNCAPPROX_SIN;
-      asm volatile("nop\n": : : "memory");
+      asm volatile("nop\n");
       pxmcc->ptcos = *FPGA_FNCAPPROX_COS;
 
       if (pxmcc->ccflg) {
@@ -155,7 +155,7 @@ void main(void)
         pwm_alp = pwm_d * pxmcc->ptcos - pwm_q * pxmcc->ptsin;
         pwm_bet = pwm_d * pxmcc->ptsin + pwm_q * pxmcc->ptcos;
 
-        if (!pxmcc->mode) {
+        if (pxmcc->mode) {
           pwm_bet_div_2_k3 = RECI16_2_K3 * (pwm_bet >> 16);
 
          #ifndef SUPPRESS_CONDITIONALS
@@ -296,7 +296,7 @@ void main(void)
           *uptr = pwm4 | 0x4000;
         }
       } else {
-        if (!pxmcc->mode) {
+        if (pxmcc->mode) {
           pwmtx_info = pxmcc->pwmtx_info;
           uptr = FPGA_LX_MASTER_TX + ((pwmtx_info >>  0) & 0xff);
           pxmcc->pwm_prew[1] = *uptr & 0x3fff;
@@ -348,10 +348,9 @@ void main(void)
       for (i = 0; i < PXMCC_CURADC_CHANNELS; ) {
         val = *siroladc;
 
-        curadc->cur_val = val - curadc->siroladc_last
-                              - curadc->siroladc_offs;
+        curadc->cur_val = (int16_t)(val - curadc->siroladc_last
+                                        - curadc->siroladc_offs);
         curadc->siroladc_last = val;
-        curadc->reserved1=0x11aa;
 
         i++;
         curadc += 1;
@@ -371,10 +370,10 @@ void main(void)
       uint32_t pwm1;
       uint32_t pwm2;
       uint32_t pwm3;
-      int32_t  cur[3];
       int32_t  cur1;
       int32_t  cur2;
       int32_t  cur3;
+      int32_t  *pcurmult;
       uint32_t curmult_idx;
       uint32_t pwm_reci;
       uint32_t out_info;
@@ -386,10 +385,7 @@ void main(void)
      #endif /*COMPUTE_PHASE_SECTOR*/
 
       out_info = pxmcc->out_info;
-      if (!pxmcc->mode) {
-        cur[1] = pxmcc_data.curadc[out_info + 0].cur_val;
-        cur[2] = pxmcc_data.curadc[out_info + 1].cur_val;
-        cur[0] = pxmcc_data.curadc[out_info + 2].cur_val;
+      if (pxmcc->mode) {
 
         pwm1 = pxmcc->pwm_prew[0];
         pwm2 = pxmcc->pwm_prew[1];
@@ -416,11 +412,22 @@ void main(void)
         curmult_idx = (0x00201201 >> (4 * phs)) & 3;
         pwm_reci = pxmcc_data.common.pwm_cycle - pxmcc->pwm_prew[curmult_idx];
         pwm_reci = (pxmcc_data.common.pwm_cycle << 16) / pwm_reci;
-        cur[curmult_idx] = (int32_t)(pwm_reci * cur[curmult_idx]) >> 16;
 
-        cur1 = cur[0];
-        cur2 = cur[1];
-        cur3 = cur[2];
+        /*
+         * Translate index from pwm1, pwm2, pwm3 order to
+         * to order of current sources 0->2 1->0 2->1
+         *
+         * This solution modifies directly value in pxmcc_curadc_data_t
+         * so it is destructive and has not to be applied twice,
+         * but it is much better optimized
+         */
+        curmult_idx = (0x102 >> (curmult_idx * 4)) & 3;
+        pcurmult = &pxmcc_data.curadc[out_info + curmult_idx].cur_val;
+        *pcurmult = (int32_t)(pwm_reci * (*pcurmult)) >> 16;
+
+        cur2 = pxmcc_data.curadc[out_info + 0].cur_val;
+        cur3 = pxmcc_data.curadc[out_info + 1].cur_val;
+        cur1 = pxmcc_data.curadc[out_info + 2].cur_val;
 
         if ((phs == 5) || (phs == 0))
           cur_alp = -(cur2 + cur3);
@@ -452,7 +459,9 @@ void main(void)
           uint32_t pwm_reci_bits;
 
           curmult_idx = (((u1gtu3 ^ u1gtu2) | 1) ^ u2gtu3 ^ u1gtu2) & 3;
+
           pwm_reci = pxmcc_data.common.pwm_cycle - pxmcc->pwm_prew[curmult_idx];
+
          #if 0
           pwm_reci_bits = __builtin_clzl(pwm_reci);
          #else
@@ -460,18 +469,29 @@ void main(void)
          #endif
           pwm_reci <<= pwm_reci_bits;
           *FPGA_FNCAPPROX_RECI = pwm_reci;
-          asm volatile("nop\n": : : "memory");
-          asm volatile("nop\n": : : "memory");
-          asm volatile("nop\n": : : "memory");
+          asm volatile("nop\n");
+          asm volatile("nop\n");
+          asm volatile("nop\n");
           pwm_reci = *FPGA_FNCAPPROX_RECI;
           pwm_reci >>= 16;
           pwm_reci *= pxmcc_data.common.pwm_cycle;
           pwm_reci >>= 30 - pwm_reci_bits;
-          cur[curmult_idx] = (int32_t)(pwm_reci * cur[curmult_idx]) >> 16;
 
-          cur1 = cur[0];
-          cur2 = cur[1];
-          cur3 = cur[2];
+          /*
+           * Translate index from pwm1, pwm2, pwm3 order to
+           * to order of current sources 0->2 1->0 2->1
+           *
+           * This solution modifies directly value in pxmcc_curadc_data_t
+           * so it is destructive and has not to be applied twice,
+           * but it is much better optimized
+           */
+          curmult_idx = (0x102 >> (curmult_idx * 4)) & 3;
+          pcurmult = &pxmcc_data.curadc[out_info + curmult_idx].cur_val;
+          *pcurmult = (int32_t)(pwm_reci * (*pcurmult)) >> 16;
+
+          cur2 = pxmcc_data.curadc[out_info + 0].cur_val;
+          cur3 = pxmcc_data.curadc[out_info + 1].cur_val;
+          cur1 = pxmcc_data.curadc[out_info + 2].cur_val;
 
           cur_alp = -(cur2 + cur3);                /* 5 0 */
           cur_alp &= state50_msk;                  /* 1 2 3 4 */
index ef7b07c7188dc4ab5bf3e820bd85f1816e3114fe..33be1681ee1872d44eb03e8f73fb776d0aa0ab96 100644 (file)
@@ -51,8 +51,7 @@ typedef struct pxmcc_axis_data_t {
 } pxmcc_axis_data_t;
 
 typedef struct pxmcc_curadc_data_t {
-  int16_t   cur_val;
-  uint16_t  reserved1;
+  int32_t   cur_val;
   uint16_t  siroladc_offs;
   uint16_t  siroladc_last;
 } pxmcc_curadc_data_t;
index 3e4283569ddc7f8d8f8711cfaeb75e98f99acde3..71af788eaa2c5df06f82dbd7a796447125069c82 100644 (file)
@@ -433,6 +433,8 @@ int cmd_do_testtumblefw(cmd_io_t *cmd_io, const struct cmd_des *des, char *param
 
   pwmtx_info = (9 << 0) | (10 << 8) | (11 << 16);
 
+  mcc_axis->mode = 1;
+
   mcc_axis->inp_info = mcs->pxms_inp_info;
   mcc_axis->out_info = mcs->pxms_out_info;
   mcc_axis->pwmtx_info = pwmtx_info;
@@ -449,11 +451,20 @@ int cmd_do_testtumblefw(cmd_io_t *cmd_io, const struct cmd_des *des, char *param
   mcc_axis->ccflg = 1;
 
   if (0) {
+    mcc_data->axis[1].inp_info = 1;
+    mcc_data->axis[1].out_info = 3;
     mcc_data->axis[1].pwmtx_info = (12 << 0) | (13 << 8) | (14 << 16);
+    mcc_data->axis[1].mode = 1;
     mcc_data->axis[1].ccflg = 1;
-    mcc_data->axis[2].pwmtx_info = (12 << 0) | (13 << 8) | (14 << 16);
+    mcc_data->axis[2].inp_info = 2;
+    mcc_data->axis[2].out_info = 6;
+    mcc_data->axis[2].pwmtx_info = (15 << 0) | (16 << 8) | (18 << 16);
+    mcc_data->axis[2].mode = 1;
     mcc_data->axis[2].ccflg = 1;
-    mcc_data->axis[3].pwmtx_info = (12 << 0) | (13 << 8) | (14 << 16);
+    mcc_data->axis[3].inp_info = 3;
+    mcc_data->axis[3].out_info = 9;
+    mcc_data->axis[3].pwmtx_info = (19 << 0) | (20 << 8) | (21 << 16);
+    mcc_data->axis[3].mode = 1;
     mcc_data->axis[3].ccflg = 1;
   }