Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

[ARM] PWM Input capture problem(STM8AF)

Status
Not open for further replies.

sunil_kasar

Newbie level 6
Joined
May 6, 2015
Messages
13
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Location
India
Activity points
125
Hello All,

I am new to STM8AF MCU. I have configured TIM1 and TIM3 as PWM output channels. TIM2 channel 1 (PD4) as input channel. I am getting correct result when I look at PWMout result in CRO. Same PWM output of TIM1 channel1, I am feeding as input to TIM2 channel1(PD4) and sending over CAN. When I look at result in CAN it is throwing in valid data. I am not getting 50% of 4095 in CANalyzer. I am posting the code below. Please help me to get rid of this problem.

Code:
***************************************************************************

#define CCR1_Val  ((uint16_t)2047)
#define CCR2_Val  ((uint16_t)1535)
#define CCR3_Val  ((uint16_t)1023)
#define CCR4_Val  ((uint16_t)511)
#define CCR_MAX_VAL_100DC       4095

/* Private function prototypes -----------------------------------------------*/
static void TIM4_Config(void);
static void Delay(u32 nTime);
void TimingDelay_Decrement(void);
static void L99PM62drv_WdgAutoTrigger(u32 WdgAutoTriggerValue);
static void CLK_Config(void);
static void GPIO_Config(void);
void delay_ms(uint16_t msTime);
/* Private functions ---------------------------------------------------------*/
/**
  * @brief  Main program.
  * @param  None
  * @retval None
  */  

/**************************************************************************/
/**
  * @brief  Configure TIM1 to generate 7 PWM signals with 4 different duty cycles
  * @param  None
  * @retval None
  */
static void TIM1_Config(void)
{
  TIM1_DeInit();

  /* Time Base configuration */
  /*
  TIM1_Period = 4095
  TIM1_Prescaler = 0
  TIM1_CounterMode = TIM1_COUNTERMODE_UP
  TIM1_RepetitionCounter = 0
  */

  TIM1_TimeBaseInit(0, TIM1_COUNTERMODE_UP, CCR_MAX_VAL_100DC, 0);

  /* Channel 1, 2,3 and 4 Configuration in PWM mode */
 
  /*
  TIM1_OCMode = TIM1_OCMODE_PWM2
  TIM1_OutputState = TIM1_OUTPUTSTATE_ENABLE
  TIM1_OutputNState = TIM1_OUTPUTNSTATE_ENABLE
  TIM1_Pulse = CCR1_Val
  TIM1_OCPolarity = TIM1_OCPOLARITY_LOW
  TIM1_OCNPolarity = TIM1_OCNPOLARITY_HIGH
  TIM1_OCIdleState = TIM1_OCIDLESTATE_SET
  TIM1_OCNIdleState = TIM1_OCIDLESTATE_RESET
 
  */
  TIM1_OC1Init(TIM1_OCMODE_PWM2, TIM1_OUTPUTSTATE_ENABLE, TIM1_OUTPUTNSTATE_ENABLE,
               CCR1_Val, TIM1_OCPOLARITY_LOW, TIM1_OCNPOLARITY_HIGH, TIM1_OCIDLESTATE_SET,
               TIM1_OCNIDLESTATE_RESET);

  /*TIM1_Pulse = CCR2_Val*/
  TIM1_OC2Init(TIM1_OCMODE_PWM2, TIM1_OUTPUTSTATE_ENABLE, TIM1_OUTPUTNSTATE_ENABLE, CCR2_Val,
               TIM1_OCPOLARITY_LOW, TIM1_OCNPOLARITY_HIGH, TIM1_OCIDLESTATE_SET,
               TIM1_OCNIDLESTATE_RESET);

  /*TIM1_Pulse = CCR3_Val*/
  TIM1_OC3Init(TIM1_OCMODE_PWM2, TIM1_OUTPUTSTATE_ENABLE, TIM1_OUTPUTNSTATE_ENABLE,
               CCR3_Val, TIM1_OCPOLARITY_LOW, TIM1_OCNPOLARITY_HIGH, TIM1_OCIDLESTATE_SET,
               TIM1_OCNIDLESTATE_RESET);

  /*TIM1_Pulse = CCR4_Val*/
  TIM1_OC4Init(TIM1_OCMODE_PWM2, TIM1_OUTPUTSTATE_ENABLE, CCR4_Val, TIM1_OCPOLARITY_LOW,
               TIM1_OCIDLESTATE_SET);

  /* TIM1 counter enable */
  TIM1_Cmd(ENABLE);

  /* TIM1 Main Output Enable */
  TIM1_CtrlPWMOutputs(ENABLE);
 
 
}

static void TIM2_Config(void)
{
 
  TIM2_ICInit( TIM2_CHANNEL_1, TIM2_ICPOLARITY_FALLING, TIM2_ICSELECTION_DIRECTTI,
               TIM2_ICPSC_DIV8, 0x0);

 
  /* Enable TIM2 */
  TIM2_Cmd(ENABLE);

  /* Clear CC1 Flag*/
  TIM2_ClearFlag(TIM2_FLAG_CC1);
   
}

static void TIM3_Config(void)
{
  TIM3_DeInit();
 
  /* Time Base configuration */
  /*
  TIM3_Period = 4095
  TIM3_Prescaler = 0
  */
  TIM3_TimeBaseInit(0, CCR_MAX_VAL_100DC);
 
  /*
  TIM3_OCMODE = TIM3_OCMODE_PWM1
  TIM3_OUTPUTSTATE = TIM3_OUTPUTSTATE_ENABLE
  TIM3_Pulse = CCR2_Val
  TIM3_OCPolarity = TIM3_OCPOLARITY_LOW
  */
  TIM3_OC1Init(TIM3_OCMODE_PWM1, TIM3_OUTPUTSTATE_ENABLE, CCR1_Val, TIM3_OCPOLARITY_LOW);
 
  TIM3_ARRPreloadConfig(ENABLE);
 
  /* TIM3 counter enable */
  TIM3_Cmd(ENABLE);
 
}


uint16_t GetCountForDutyCycle(uint8_t dutyCycle)
{
  return (((uint32_t)dutyCycle * CCR_MAX_VAL_100DC)/100);
}
/**************************************************************************/



uint16_t PWMInput2_u16;
uint16_t PWMInput1_u16;
uint16_t LSIClkFreq;
void main(void)
{
 
      TIM1_Config();
      TIM2_Config();
      TIM3_Config();
 
 
  L99PM62drv_RegType reg;
    
  /* GPIO Configuration ---------------------------------------*/
  //GPIO_Config();  
 
      /* CAN */
    GPIO_Init(GPIOG, (GPIO_Pin_TypeDef)GPIO_PIN_0, GPIO_MODE_OUT_PP_LOW_FAST);
    GPIO_Init(GPIOG, (GPIO_Pin_TypeDef)GPIO_PIN_1, GPIO_MODE_IN_PU_NO_IT);    

        /* Init SPI peripheral pins */
    GPIO_Init(GPIOC, (GPIO_Pin_TypeDef)(GPIO_PIN_5|GPIO_PIN_6), GPIO_MODE_OUT_PP_LOW_FAST); /* MOSI + CLK */
    GPIO_Init(GPIOC, (GPIO_Pin_TypeDef)GPIO_PIN_7, GPIO_MODE_IN_PU_NO_IT); /* MISO */
    GPIO_Init(GPIOE, (GPIO_Pin_TypeDef)(GPIO_PIN_5), GPIO_MODE_OUT_PP_HIGH_FAST); /* CSN */
        
  /* ADC configuration -------------------------------------------*/
    //ADC_Config();
    
    CANMaster = TRUE;
    
    
  /* Clock configuration --------------------------------------*/
  CLK_Config();
    
   //SPI Init (enable communication with L99PM62)
  SPI_DeInit();
  SPI_Init(SPI_FIRSTBIT_MSB, SPI_BAUDRATEPRESCALER_64, SPI_MODE_MASTER, SPI_CLOCKPOLARITY_LOW,
           SPI_CLOCKPHASE_1EDGE, SPI_DATADIRECTION_2LINES_FULLDUPLEX, SPI_NSS_SOFT,(uint8_t)0x07);
    
 
  /* TIM4 configuration -----------------------------------------*/
  TIM4_Config();  
    
  /* Enable SPI */
  SPI_Cmd(ENABLE);
    
  /* Enable TIM4 */
  TIM4_Cmd(ENABLE);
    

  /* CAN configuration ----------------------------------------*/    
  CAN_Config();
    
  /* Enable Interrupts*/
  enableInterrupts();
 
  // Set 40ms delay before starting communication during L99PM62 long open window
  Delay(40);
  /* Initialization of L99PM62 CAN/LIN transceiver */
  L99PM62drv_Init();
  // Set Auto Trigger by TIM4 timer tRefresh=10ms
  L99PM62drv_WdgAutoTrigger(L99PM62WdgTriggerRefreshValue10);


  /* Infinite loop*/
   
  while(1)
  {
    /******************* Fro PWM ************************/
      
      
      //dutyCycle_u16 += 10;
      dutyCycle_u16 = 50;
      TIM1_SetCompare1(GetCountForDutyCycle(dutyCycle_u16));  /*Timer1, Channel 1, PC1*/
      //PWMInput_u16 = TIM2_GetCapture1();
      TIM1_SetCompare2(GetCountForDutyCycle(dutyCycle_u16));  /*TIMER1, Channel 2, PC2*/
      TIM1_SetCompare3(GetCountForDutyCycle(dutyCycle_u16));  /*TIMER1, Channel 3, PC3*/
      TIM1_SetCompare4(GetCountForDutyCycle(dutyCycle_u16));  /*TIMER1, Channel 4, PC4*/
      TIM3_SetCompare1(GetCountForDutyCycle(dutyCycle_u16));  /*TIMER3, Channel 1, PD2*/
      delay_ms(1000);
      
      while((TIM2->SR1 & TIM2_FLAG_CC1) != TIM2_FLAG_CC1);
      /* Get CCR1 value */
      PWMInput1_u16 = TIM2_GetCapture1();
      TIM2_ClearFlag(TIM2_FLAG_CC1);
      delay_ms(10000);
      
      
      //delay_ms(10000);
      /******************************************************/
    
      StartupCompleted=1;
      if (StartupCompleted==TRUE) /* To allow leds display at startup */
      {        
          /* CAN test mode */
          if ((CANMaster==TRUE)||(ReceptionEnable==TRUE))
          {
            CAN_Task(PWMInput1_u16);
          }
      }
  }
}
 

can anyone tell, whats wrong with PWM input capture???? I am stuck at it since 4 days.
 

Hi,

What is your PWM frequency?

And how fast is your CAN?
Do you think it is possible to transmit the PWM over CAN? I doubt this.

KLaus
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top