pxmcc_data.curadc[0].siroladc_offs = 0x0c17;
pxmcc_data.curadc[1].siroladc_offs = 0x0c66;
pxmcc_data.curadc[2].siroladc_offs = 0x0c66;
+ pxmcc_data.curadc[3].siroladc_offs = 0x0c66;
pxmcc = pxmcc_data.axis;
do {
pwm_alp = pwm_d * pxmcc->ptcos - pwm_q * pxmcc->ptsin;
pwm_bet = pwm_d * pxmcc->ptsin + pwm_q * pxmcc->ptcos;
- if (pxmcc->mode == PXMCC_MODE_MODE_BLDC) {
+ if (pxmcc->mode == PXMCC_MODE_BLDC) {
pwm_bet_div_2_k3 = RECI16_2_K3 * (pwm_bet >> 16);
#ifndef SUPPRESS_CONDITIONALS
*uptr = pwm1 | 0x4000;
#endif
} else {
- uint32_t bet_sgn = pwm_bet >> 31;
uint32_t alp_sgn = pwm_alp >> 31;
- pwm1 = pwm2 = pwm_bet | 0x4000;
- pwm3 = pwm4 = pwm_alp | 0x4000;
- pwm1 &= ~bet_sgn;
- pwm2 &= bet_sgn;
- pwm3 &= ~alp_sgn;
- pwm4 &= alp_sgn;
+ uint32_t bet_sgn = pwm_bet >> 31;
+ pwm_alp >>= 16;
+ pwm_bet >>= 16;
+ pwm1 = -pwm_alp & alp_sgn;
+ pwm2 = pwm_alp & ~alp_sgn;
+ pwm3 = -pwm_bet & bet_sgn;
+ pwm4 = pwm_bet & ~bet_sgn;
pwmtx_info = pxmcc->pwmtx_info;
uptr = FPGA_LX_MASTER_TX + ((pwmtx_info >> 0) & 0xff);
*uptr = pwm4 | 0x4000;
}
} else {
- if (pxmcc->mode == PXMCC_MODE_MODE_BLDC) {
+ if (pxmcc->mode == PXMCC_MODE_BLDC) {
pwmtx_info = pxmcc->pwmtx_info;
uptr = FPGA_LX_MASTER_TX + ((pwmtx_info >> 0) & 0xff);
pxmcc->pwm_prew[1] = *uptr & 0x3fff;
#endif /*COMPUTE_PHASE_SECTOR*/
out_info = pxmcc->out_info;
- if (pxmcc->mode == PXMCC_MODE_MODE_BLDC) {
+ if (pxmcc->mode == PXMCC_MODE_BLDC) {
pwm1 = pxmcc->pwm_prew[0];
pwm2 = pxmcc->pwm_prew[1];
cur_bet *= CONST16_K3;
cur_bet >>= 16;
} else {
- int32_t bet_pwm = pxmcc->pwm_prew[1];
+ int32_t bet_pwm = pxmcc->pwm_prew[2];
uint32_t bet_sgn = (bet_pwm - 1) >> 31;
- int32_t alp_pwm = pxmcc->pwm_prew[3];
+ int32_t alp_pwm = pxmcc->pwm_prew[0];
uint32_t alp_sgn = (alp_pwm - 1) >> 31;
- cur_bet = (pxmcc_data.curadc[out_info + 0].cur_val & ~bet_sgn) -
- (pxmcc_data.curadc[out_info + 1].cur_val & bet_sgn);
- cur_alp = (pxmcc_data.curadc[out_info + 2].cur_val & ~alp_sgn) -
- (pxmcc_data.curadc[out_info + 3].cur_val & alp_sgn);
+ cur_bet = (pxmcc_data.curadc[out_info + 3].cur_val & ~bet_sgn) -
+ (pxmcc_data.curadc[out_info + 2].cur_val & bet_sgn);
+ cur_alp = (pxmcc_data.curadc[out_info + 1].cur_val & ~alp_sgn) -
+ (pxmcc_data.curadc[out_info + 0].cur_val & alp_sgn);
}
cur_d = cur_alp * pxmcc->ptcos + cur_bet * pxmcc->ptsin;
#include "pxmcc_types.h"
#include "pxmcc_interface.h"
-#define PXMC_AXIS_MODE_BLDC_PXMCC (PXMC_AXIS_MODE_BLDC + 1)
+#define PXMC_AXIS_MODE_BLDC_PXMCC (PXMC_AXIS_MODE_BLDC + 1)
+#define PXMC_AXIS_MODE_STEPPER_WITH_IRC_PXMCC (PXMC_AXIS_MODE_BLDC + 2)
int pxmc_ptofs_from_index(pxmc_state_t *mcs, unsigned long irc,
unsigned long index_irc, int diff2err);
/*******************************************************************/
/* PXMCC - PXMC coprocessor support and communication */
+void pxmcc_pxmc_ptofs2mcc(pxmc_state_t *mcs)
+{
+ volatile pxmcc_axis_data_t *mcc_axis = pxmc_rocon_mcs2pxmcc(mcs);
+ int inp_chan=mcs->pxms_inp_info;
+ uint32_t ptofs;
+ uint32_t irc;
+
+ if (mcc_axis != NULL) {
+ ptofs = mcs->pxms_ptofs - pxmc_rocon_irc_offset[inp_chan];
+ irc = fpga_irc[inp_chan]->count;
+ ptofs = (int16_t)(ptofs - irc) + irc;
+ mcc_axis->ptofs = ptofs;
+ }
+}
+
int
pxmc_pxmcc_pwm3ph_out(pxmc_state_t *mcs)
{
set_ptofs_fl = 1;
}
if (set_ptofs_fl) {
- volatile pxmcc_axis_data_t *mcc_axis = pxmc_rocon_mcs2pxmcc(mcs);
- uint32_t ptofs;
- uint32_t irc;
-
mcs->pxms_ptindx = ptindx;
mcs->pxms_ptofs = (mcs->pxms_ap >> PXMC_SUBDIV(mcs)) + mcs->pxms_ptshift - ptindx;
- irc = fpga_irc[mcs->pxms_inp_info]->count;
- ptofs = (int16_t)(mcs->pxms_ptofs - irc) + irc;
- mcc_axis->ptofs = ptofs;
+ pxmcc_pxmc_ptofs2mcc(mcs);
}
} else {
/* if phase table position to mask is know do fine phase table alignment */
if (res < 0) {
pxmc_set_errno(mcs, PXMS_E_I2PT_TOOBIG);
} else if (res) {
+ pxmcc_pxmc_ptofs2mcc(mcs);
pxmc_set_flag(mcs, PXMS_PTI_b);
pxmc_set_flag(mcs, PXMS_PHA_b);
}
return 0;
}
+int
+pxmc_pxmcc_pwm2ph_out(pxmc_state_t *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);
+ }
+
+ 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 ptofs;
- uint32_t irc;
uint32_t ptirc;
uint32_t ptreci;
uint32_t pwmtx_info;
mcc_data->common.pwm_cycle = PXMC_LXPWR_PWM_CYCLE;
- irc = fpga_irc[mcs->pxms_inp_info]->count;
- ptofs = (int16_t)(mcs->pxms_ptofs - irc) + irc;
-
ptirc = mcs->pxms_ptirc;
ull = (1ULL << 32) * mcs->pxms_ptper;
ptreci = (ull + ptirc / 2) / ptirc;
mcc_axis->ptirc = ptirc;
mcc_axis->ptreci = ptreci;
- mcc_axis->ptofs = ptofs;
+
+ pxmcc_pxmc_ptofs2mcc(mcs);
switch (mode) {
case PXMCC_MODE_IDLE:
phcnt = 0;
break;
- case PXMCC_MODE_MODE_BLDC:
+ case PXMCC_MODE_BLDC:
phcnt = 3;
break;
case PXMCC_MODE_STEPPER_WITH_IRC:
switch (mode) {
/*case PXMC_AXIS_MODE_STEPPER:*/
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);
break;
/*case PXMC_AXIS_MODE_STEPPER_WITH_PWM:*/
pxmc_axis_mode(pxmc_state_t *mcs, int mode)
{
int res;
+ int prev_mode;
pxmc_set_const_out(mcs, 0);
pxmc_clear_flag(mcs, PXMS_ENI_b);
pxmc_clear_flag(mcs, PXMS_PTI_b);
+ prev_mode = pxmc_axis_rdmode(mcs);
+
if (mode == PXMC_AXIS_MODE_NOCHANGE)
- mode = pxmc_axis_rdmode(mcs);
+ mode = prev_mode;
if (mode < 0)
return -1;
if (!mode)
mode = PXMC_AXIS_MODE_DC;
+ if ((prev_mode == PXMC_AXIS_MODE_BLDC_PXMCC) ||
+ (prev_mode == PXMCC_MODE_STEPPER_WITH_IRC))
+ pxmcc_axis_setup(mcs, PXMCC_MODE_IDLE);
+
res = pxmc_axis_pt4mode(mcs, mode);
if (res < 0)
return -1;
mcs->pxms_do_out = pxmc_rocon_pwm3ph_out;
break;
case PXMC_AXIS_MODE_BLDC_PXMCC:
- if (pxmcc_axis_setup(mcs, PXMCC_MODE_MODE_BLDC) < 0)
+ if (pxmcc_axis_setup(mcs, PXMCC_MODE_BLDC) < 0)
return -1;
pxmcc_axis_enable(mcs, 1);
mcs->pxms_do_out = pxmc_pxmcc_pwm3ph_out;
break;
+ case PXMC_AXIS_MODE_STEPPER_WITH_IRC_PXMCC:
+ if (pxmcc_axis_setup(mcs, PXMCC_MODE_STEPPER_WITH_IRC) < 0)
+ return -1;
+ pxmcc_axis_enable(mcs, 1);
+ mcs->pxms_do_out = pxmc_pxmcc_pwm2ph_out;
+ break;
default:
return -1;
}
return -CMDERR_BADPAR;
- pxmcc_axis_setup(mcs, PXMCC_MODE_MODE_BLDC);
+ if (0) {
+ pxmcc_axis_setup(mcs, PXMCC_MODE_MODE_BLDC);
+ }
pxmc_clear_flags(mcs,PXMS_ENO_m|PXMS_ENG_m|PXMS_ENR_m|PXMS_BSY_m);
pxmcc_axis_pwm_dq_out(mcs, pwm_d, pwm_q);
pxmcc_axis_enable(mcs, 1);
- if (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 = PXMCC_MODE_MODE_BLDC;
+ 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].out_info = 6;
mcc_data->axis[2].pwmtx_info = (15 << 0) | (16 << 8) | (18 << 16);
- mcc_data->axis[2].mode = PXMCC_MODE_MODE_BLDC;
+ 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].out_info = 9;
mcc_data->axis[3].pwmtx_info = (19 << 0) | (20 << 8) | (21 << 16);
- mcc_data->axis[3].mode = PXMCC_MODE_MODE_BLDC;
+ mcc_data->axis[3].mode = PXMCC_MODE_BLDC;
mcc_data->axis[3].ccflg = 1;
}