This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Converting 10kHz PWM into 2kHz PWM codes

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;


Note: I use 100uS for Timer 0 Interrupt

Now I need to convert 10kHz PWM into 2kHz PWM but I am totally lost at the moment. However I tried to divide it by 5 but it doesn't work at all. I would be very very grateful to hear your suggestion or tip.

Kind regards

AJ

  • 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