typedef struct pxmcc_axis_data_t {
uint32_t ccflg;
- int32_t pwm_d;
- int32_t pwm_q;
- int32_t cur_d;
- int32_t cur_q;
+ uint32_t pwm_dq; /* D and Q components of PWM (pwm_d << 16) | (pwm_q) & 0xffff */
+ uint32_t cur_dq; /* D and Q components current (cur_d << 16) | (cur_q) & 0xffff */
uint32_t ptindx; /* index into phase table / irc in the cycle */
uint32_t ptirc; /* IRC count per phase table */
uint32_t ptreci; /* Reciprocal value of ptirc * 63356 */
pxmcc->ptirc = 1000;
pxmcc->ptreci = 4294967; /* (1LL<<32)*ptper/ptirc */
pxmcc->min_idle = 0;
- pxmcc->pwm_d = 0;
- pxmcc->pwm_q = 0;
+ pxmcc->pwm_dq = 0;
asm volatile("": : : "memory");
uint32_t pwm1;
uint32_t pwm2;
uint32_t pwm3;
- #if defined(COMPUTE_PHASE_SECTOR) || !defined(SUPPRESS_CONDITIONALS)
+ int32_t pwm_d;
+ int32_t pwm_q;
+ #if defined(COMPUTE_PHASE_SECTOR) || !defined(SUPPRESS_CONDITIONALS)
uint32_t phs;
#endif /*COMPUTE_PHASE_SECTOR*/
- pwm_alp = pxmcc->pwm_d * pxmcc->ptcos - pxmcc->pwm_q * pxmcc->ptsin;
- pwm_bet = pxmcc->pwm_d * pxmcc->ptsin + pxmcc->pwm_q * pxmcc->ptcos;
+ pwm_d = (volatile uint32_t)pxmcc->pwm_dq;
+ pwm_q = (pwm_d << 16) >> 16;
+ pwm_d >>= 16;
+
+ pwm_alp = pwm_d * pxmcc->ptcos - pwm_q * pxmcc->ptsin;
+ pwm_bet = pwm_d * pxmcc->ptsin + pwm_q * pxmcc->ptcos;
pwm_bet_div_2_k3 = RECI16_2_K3 * (pwm_bet >> 16);
ptreci = (ull + ptirc / 2) / ptirc;
fpga_tumbl_dmem[0] = 0;
- fpga_tumbl_dmem[1] = pwm_d;
- fpga_tumbl_dmem[2] = pwm_q;
+ fpga_tumbl_dmem[1] = (pwm_d << 16) | (pwm_q & 0xffff);
- fpga_tumbl_dmem[6] = ptirc;
- fpga_tumbl_dmem[7] = ptreci;
- fpga_tumbl_dmem[8] = ptofs;
+ fpga_tumbl_dmem[4] = ptirc;
+ fpga_tumbl_dmem[5] = ptreci;
+ fpga_tumbl_dmem[6] = ptofs;
fpga_tumbl_dmem[0] = 1;