]> rtime.felk.cvut.cz Git - fpga/rpi-motor-control-pxmc.git/commitdiff
RPi PXMC Test: command to switch axis mode and DC motor support added.
authorPavel Pisa <pisa@cmp.felk.cvut.cz>
Tue, 12 May 2015 10:35:09 +0000 (12:35 +0200)
committerPavel Pisa <pisa@cmp.felk.cvut.cz>
Tue, 12 May 2015 10:35:09 +0000 (12:35 +0200)
Signed-off-by: Pavel Pisa <pisa@cmp.felk.cvut.cz>
src/app/rpi-pmsm-test1/appl_pxmc.c
src/app/rpi-pmsm-test1/appl_pxmccmds.c

index b1ca244387979fdb43c72f20fd7da23081f7dcec..f91a21f53e98cd1f2b014baa94070d71d3596029 100644 (file)
@@ -411,20 +411,17 @@ pxmc_spimc_pwm_dc_out(pxmc_state_t *mcs)
   int chan = mcs->pxms_out_info;
   int ene = mcs->pxms_ene;
 
-
   if (ene < 0) {
     ene = -ene;
     if (ene > 0x7fff)
       ene = 0x7fff;
     ene = (ene * (pxmc_spimc_pwm_magnitude + 5)) >> 15;
-    /**pwm_reg_a = 0;*/
-    /**pwm_reg_b = ene | 0x4000;*/
+    pxmc_spimc_pwm3ph_wr(mcs, SPIMC_PWM_ENABLE, ene | SPIMC_PWM_ENABLE, 0);
   } else {
     if (ene > 0x7fff)
       ene = 0x7fff;
     ene = (ene * (pxmc_spimc_pwm_magnitude + 5)) >> 15;
-    /**pwm_reg_b = 0;*/
-    /**pwm_reg_a = ene | 0x4000;*/
+    pxmc_spimc_pwm3ph_wr(mcs, ene | SPIMC_PWM_ENABLE, SPIMC_PWM_ENABLE, 0);
   }
 
   return 0;
@@ -700,12 +697,21 @@ int pxmc_process_state_check(unsigned long *pbusy_bits,
 
   if (pbusy_bits != NULL)
     *pbusy_bits = busy_bits;
-  if (error_bits != NULL)
+  if (perror_bits != NULL)
     *perror_bits = error_bits;
 
   return flg;
 }
 
+int pxmc_axis_rdmode(pxmc_state_t *mcs)
+{
+  if (mcs->pxms_do_out == pxmc_spimc_pwm_dc_out)
+    return PXMC_AXIS_MODE_DC;
+  if (mcs->pxms_do_out == pxmc_spimc_pwm3ph_out)
+    return PXMC_AXIS_MODE_BLDC;
+  return -1;
+}
+
 /**
  * pxmc_axis_mode - Sets axis mode.[extern API]
  * @mcs:        Motion controller state information
@@ -718,7 +724,45 @@ int pxmc_process_state_check(unsigned long *pbusy_bits,
 int
 pxmc_axis_mode(pxmc_state_t *mcs, int mode)
 {
-  return 0;
+  int res = 0;
+  int prev_mode;
+
+  pxmc_axis_release(mcs);
+  pxmc_clear_flag(mcs, PXMS_ENI_b);
+  pxmc_clear_flag(mcs,PXMS_ENO_b);
+  /*TODO Clear possible stall index flags from hardware */
+
+  pxmc_clear_flag(mcs, PXMS_PHA_b);
+  pxmc_clear_flag(mcs, PXMS_PTI_b);
+
+  prev_mode = pxmc_axis_rdmode(mcs);
+
+  if (mode == PXMC_AXIS_MODE_NOCHANGE)
+    mode = prev_mode;
+  if (mode < 0)
+    return -1;
+  if (!mode)
+    mode = PXMC_AXIS_MODE_DC;
+
+  switch (mode) {
+    case PXMC_AXIS_MODE_DC:
+      mcs->pxms_do_out = pxmc_spimc_pwm_dc_out;
+      break;
+    case PXMC_AXIS_MODE_BLDC:
+      mcs->pxms_do_out = pxmc_spimc_pwm3ph_out;
+      pxmc_fill_ptscale_for_sin_fixed(mcs);
+      break;
+    default:
+      return -1;
+  }
+
+  /*TODO Clear possible stall index flags from hardware */
+
+  /* Request new phases alignment for changed parameters */
+  pxmc_clear_flag(mcs, PXMS_PHA_b);
+  pxmc_clear_flag(mcs, PXMS_PTI_b);
+  pxmc_set_flag(mcs, PXMS_ENI_b);
+  return res;
 }
 
 int pxmc_done(void)
index 7348848d31d5a4f94d6fcde64b0a35574d320afd..8fdab3378081e6e5f90bc9f66be2ac03b930c0a4 100644 (file)
@@ -112,6 +112,34 @@ int cmd_do_logcurrent(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[]
   return 0;
 }
 
+/**
+ * cmd_do_axis_mode - checks the command format and busy flag validity, calls pxmc_axis_mode
+ *
+ * if pxmc_axis_mode returns -1, cmd_do_axis_mode returns -1.
+ */
+int cmd_do_axis_mode(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[])
+{
+  int val;
+  pxmc_state_t *mcs;
+
+  if((mcs=cmd_opchar_getreg(cmd_io,des,param))==NULL) return -CMDERR_BADREG;
+
+  if(*param[2]=='?') {
+    return cmd_opchar_replong(cmd_io, param, pxmc_axis_rdmode(mcs), 0, 0);
+  }
+
+  if(*param[2]!=':') return -CMDERR_OPCHAR;
+
+  if(mcs->pxms_flg&PXMS_BSY_m) return -CMDERR_BSYREG;
+
+  val=atol(param[3]);
+  val=pxmc_axis_mode(mcs,val);
+  if(val<0)
+    return val;
+
+  return 0;
+}
+
 cmd_des_t const cmd_des_regcurdp={0, CDESM_OPCHR|CDESM_RW,
                         "REGCURDP?","current controller d component p parameter", cmd_do_reg_short_val,
                         {(char*)pxmc_spimc_state_offs(cur_d_p),
@@ -137,6 +165,10 @@ cmd_des_t const cmd_des_regcurhold={0, CDESM_OPCHR|CDESM_RW,
                         {(char*)pxmc_spimc_state_offs(cur_hold),
                          0}};
 
+cmd_des_t const cmd_des_axis_mode={0, CDESM_OPCHR|CDESM_WR,
+                        "REGMODE?","axis working mode",cmd_do_axis_mode,
+                         {}};
+
 cmd_des_t const cmd_des_logcurrent={0, 0,
                         "logcurrent","log current history", cmd_do_logcurrent,
                         {(char*)0,
@@ -150,6 +182,7 @@ cmd_des_t const *cmd_appl_pxmc[] =
   &cmd_des_regcurqp,
   &cmd_des_regcurqi,
   &cmd_des_regcurhold,
+  &cmd_des_axis_mode,
   &cmd_des_logcurrent,
   NULL
 };