Hi Here is my pseduo-code:
// In my CAPCOM1 initalisation CC1_T0REL=0xF830; // Generate 10kHz PWM // Produce 50% duty cycle Offset=(0xFFFF-CC1_T0REL)>>1; // This will produce 50% duty cycle of 10kHz PWM CC1_CC2=CC1_T0REL+Offset;
Dear Chris Yes, the aim is to control 4 motors using 12 channels. I use hardware to generate non-inverted and inverted PWM to drive a motor so we don't implement dead-time. Unfortunately I am working on the XC161 chip at this stage and so I cannot choose different family. However I try to switch XC167 in the future project For the sine-wave array, the reason I use 213 arrays because my algorithm allows 3 different phases point at different points. For example, Phase A start at 0, Phase B and C point at 43 and 85 respectively. Phase A: 0 to 360 degree which correspond to 0 to 128 Phase B: 0 to 360 degree which correspond to 43 to 171 Phase C : 0 to 360 degree which correspond to 85 to 213 I have written a code to produce 3 sine waveforms by using CAPCOM1's compare mode 3 instead of 1 and 3. I managed to produce Phase A and B in 120 phase shift. I recently found that I could not use the CAPCOM2 for timer 7/8 because the pins are allocated for something else! This forces me to use the General Purpose Timer 1's Timer block 2 and 3 for generating sine wave. Today has been terrible for me and I have not used it before and I know it works in similar principle like CAPCOM but I could not quite manage it. You see I selected timer 2 counting downward and enable interrupt for updating the value of T2 in order to produce sine wave. But nothing happens…… AJ
Btw can we keep in touch by email? AJ
You can reach me at chris.wunderlich(at)infineon.com
Im going to keep your email address in my notebook. After reading the datasheet regarding General Purpose Timer 1 epsecially implementing PWM. I have noticed that it needs three Timer blocks for producing each tick and pulse width for high and low. I know that T3 can be used to control Pin 3. The question is that is it possible to implement GPT1 with one timer block and toggle any port? AJ
Yes, you can just use T3 to toggle pin P3.3 (T3OUT). Here is an example that uses the PEC to reload T3 (but only a 50% DC). If you want to use software then you can change the duty cycle for T3 and also use T2 and T4. However you would need to modify a port pin within the interrupt (meaning you would have to deal with the interrupt latency).
unsigned int T3reload; void main(void) { /* timer 3 works in timer mode prescaler factor is 8 timer counts down alternate output function T3OUT (P3.3) is enabled timer 3 output toggle latch (T3OTL) is set to 1 */ GPT12E_T3CON = 0x0680; T3reload = 0x04E1; /* 2KHz, 50% DC */ GPT12E_T3 = T3reload; /* P3.3 is used for Timer 3 Toggle Output (T3OUT) */ _bfld_(ALTSEL0P3,0x0008,0x0008); /* select alternate output */ _bfld_(P3,0x0008,0x0008); /* set data register */ _bfld_(DP3,0x0008,0x0008); /* set direction register */ /* PEC0:(ILVL) = 14, (GLVL) = 0, (GPX) = 0 */ GPT12E_T3IC = 0x0078; PECC0 = 0x00FF; /* continuous transfer */ SRCP0 = _sof_ (&T3reload); /* source pointer */ DSTP0 = _sof_(&GPT12E_T3); /* destination pointer */ GPT12E_T3CON_T3R = 1; /* set timer 3 run bit */ PSW_IEN = 1; for(;;) { } }
Thank you for illustrating another example of using General Purpose Timer 1. It seems that 3 timer blocks are need to produce PWM especially varying duty cycle. Thank you for letting me know. Kind regards AJ