#define PXMC_AXIS_MODE_BLDC_PXMCC (PXMC_AXIS_MODE_BLDC + 1)
#define PXMC_AXIS_MODE_STEPPER_WITH_IRC_PXMCC (PXMC_AXIS_MODE_BLDC + 2)
+#define PXMC_AXIS_MODE_STEPPER_PXMCC (PXMC_AXIS_MODE_BLDC + 3)
int pxmc_ptofs_from_index(pxmc_state_t *mcs, unsigned long irc,
unsigned long index_irc, int diff2err);
return 0;
}
+/**
+ * pxmc_pxmcc_nofb_inp - Dummy input for direct stepper motor control
+ * @mcs: Motion controller state information
+ */
+int
+pxmc_pxmcc_nofb_inp(pxmc_state_t *mcs)
+{
+ return 0;
+}
+
+/**
+ * pxmc_pxmcc_nofb_con - Empty controller for direct stepper motor control
+ * @mcs: Motion controller state information
+ */
+int
+pxmc_pxmcc_nofb_con(pxmc_state_t *mcs)
+{
+ mcs->pxms_ene=mcs->pxms_me;
+ return 0;
+}
+
+int
+pxmc_pxmcc_nofb2ph_out(pxmc_state_t *mcs)
+{
+ volatile pxmcc_axis_data_t *mcc_axis = pxmc_rocon_mcs2pxmcc(mcs);
+ {
+ int ene, pwm_d, pwm_q;
+
+ ene = mcs->pxms_ene;
+ pwm_d = 0;
+ pwm_q = (pxmc_rocon_pwm_magnitude * ene) >> 15;
+
+ pxmcc_axis_pwm_dq_out(mcs, pwm_d, pwm_q);
+
+ if (mcs->pxms_flg & PXMS_ERR_m) {
+ pxmc_rocon_pwm2ph_wr(mcs, 0, 0);
+ } else {
+ int32_t stpinc;
+ mcs->pxms_ap=mcs->pxms_rp;
+ mcs->pxms_as=mcs->pxms_rs;
+ mcc_axis->steps_lim = mcc_axis->steps_cnt + 6;
+
+ stpinc = mcs->pxms_rs;
+ mcc_axis->steps_inc = stpinc;
+
+ /* stpinc /= (mcs->pxms_ptirc << PXMC_SUBDIV(mcs)); */
+ /* pxms_ptscale_mult; pxms_ptscale_shift; */
+ }
+ }
+
+ return 0;
+}
+
int pxmcc_axis_setup(pxmc_state_t *mcs, int mode)
{
volatile pxmcc_data_t *mcc_data = pxmc_rocon_mcc_data();
volatile pxmcc_axis_data_t *mcc_axis = pxmc_rocon_mcs2pxmcc(mcs);
uint32_t ptirc;
uint32_t ptreci;
+ uint32_t inp_info;
uint32_t pwmtx_info;
uint32_t pwmtx_info_dummy = 27;
uint64_t ull;
pxmcc_pxmc_ptofs2mcc(mcs, 0);
+ inp_info = (char*)&fpga_irc[mcs->pxms_inp_info]->count - (char*)fpga_irc[0];
+ inp_info += mcc_data->common.irc_base;
+
switch (mode) {
case PXMCC_MODE_IDLE:
phcnt = 0;
case PXMCC_MODE_STEPPER_WITH_IRC:
phcnt = 4;
break;
+ case PXMCC_MODE_STEPPER:
+ phcnt = 4;
+ mcc_axis->ptreci = 1;
+ inp_info = (char*)&mcc_axis->steps_pos - (char*)mcc_data;
+ break;
}
- mcc_axis->inp_info = mcs->pxms_inp_info;
+ mcc_axis->inp_info = inp_info;
mcc_axis->out_info = mcs->pxms_out_info;
pwm_chan = mcs->pxms_out_info;
mcc_axis->ccflg = 0;
mcc_axis->pwm_dq = 0;
+ mcc_axis->steps_lim = mcc_axis->steps_cnt;
+ mcc_axis->steps_inc = 0;
+ mcc_axis->steps_pos = 0;
- pxmcc_pxmc_ptofs2mcc(mcs, 1);
-
+ if (mode != PXMCC_MODE_STEPPER) {
+ pxmcc_pxmc_ptofs2mcc(mcs, 1);
+ }
return 0;
}
return PXMC_AXIS_MODE_BLDC_PXMCC;
if (mcs->pxms_do_out == pxmc_pxmcc_pwm2ph_out)
return PXMC_AXIS_MODE_STEPPER_WITH_IRC_PXMCC;
+ if (mcs->pxms_do_out == pxmc_pxmcc_nofb2ph_out)
+ return PXMC_AXIS_MODE_STEPPER_PXMCC;
return -1;
}
return -1;
switch (mode) {
- /*case PXMC_AXIS_MODE_STEPPER:*/
+ /* case PXMC_AXIS_MODE_STEPPER: */
+ case PXMC_AXIS_MODE_STEPPER_PXMCC:
case PXMC_AXIS_MODE_STEPPER_WITH_IRC:
case PXMC_AXIS_MODE_STEPPER_WITH_IRC_PXMCC:
res = pxmc_ptable_set_profile(mcs, &pxmc_ptprofile_sin, 0, 0);
if (res < 0)
return -1;
+ if (mcs->pxms_do_inp == pxmc_pxmcc_nofb_inp)
+ mcs->pxms_do_inp = pxmc_inp_rocon_inp;
+ if (mcs->pxms_do_con == pxmc_pxmcc_nofb_con)
+ mcs->pxms_do_con = pxmc_pid_con;
+
switch (mode) {
/*case PXMC_AXIS_MODE_STEPPER:*/
case PXMC_AXIS_MODE_STEPPER_WITH_IRC:
pxmcc_axis_enable(mcs, 1);
mcs->pxms_do_out = pxmc_pxmcc_pwm2ph_out;
break;
+ case PXMC_AXIS_MODE_STEPPER_PXMCC:
+ if (pxmcc_axis_setup(mcs, PXMCC_MODE_STEPPER) < 0)
+ return -1;
+ pxmcc_axis_enable(mcs, 1);
+ mcs->pxms_do_inp = pxmc_pxmcc_nofb_inp;
+ mcs->pxms_do_con = pxmc_pxmcc_nofb_con;
+ mcs->pxms_do_out = pxmc_pxmcc_nofb2ph_out;
+ break;
default:
return -1;
}
pxmcc_axis_enable(mcs, 1);
if (0) {
- mcc_data->axis[1].inp_info = 1;
+ mcc_data->axis[1].inp_info = 0;
mcc_data->axis[1].out_info = 3;
mcc_data->axis[1].pwmtx_info = (12 << 0) | (13 << 8) | (14 << 16);
mcc_data->axis[1].mode = PXMCC_MODE_BLDC;
mcc_data->axis[1].ccflg = 1;
- mcc_data->axis[2].inp_info = 2;
+ mcc_data->axis[2].inp_info = 0;
mcc_data->axis[2].out_info = 6;
mcc_data->axis[2].pwmtx_info = (15 << 0) | (16 << 8) | (18 << 16);
mcc_data->axis[2].mode = PXMCC_MODE_BLDC;
mcc_data->axis[2].ccflg = 1;
- mcc_data->axis[3].inp_info = 3;
+ mcc_data->axis[3].inp_info = 0;
mcc_data->axis[3].out_info = 9;
mcc_data->axis[3].pwmtx_info = (19 << 0) | (20 << 8) | (21 << 16);
mcc_data->axis[3].mode = PXMCC_MODE_BLDC;