用F407的TIM1产生SPWM 出现一点问题 求路过的大佬帮忙看下 谢谢啦

2019-08-13 23:29发布

我看了很多资料 , 产生SPWM的思路大致是用一个三角波和一个正弦波比较 然后输出一个宽度按照正弦规律变化的方波,问题是我出来的波形只是一个三角波,而且波形很难看,不光滑,我把我的程序贴出来 希望有人能指点一下
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
9条回答
dossdesmend
2019-08-14 05:01
[mw_shl_code=c,true]  
#include "./tim/bsp_advance_tim.h"
#include "arm_math.h"

#define  F_PWM       2000                     
#define  MAX_CNT     ((SystemCoreClock / F_PWM) - 1)
#define    T   360

uint16_t sin_arr[T];


void TIM1_NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
       
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel =TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}

void TIM1_GPIO_Config(void)
{
       
        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOE , ENABLE); /*¿aÆô¶¨ê±Æ÷1Ïà1ØμÄGPIOíaéèê±Öó 1òÔØÔúAHB1×üÏßéÏ GPIOE*/

        /* ¶¨ê±Æ÷1|Äüòy½Å3õê¼»ˉ */                                                                                                                          
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13;       
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;   
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
       
        //GPIO_PinRemapConfig(GPIO_FullRemap_TIM1,ENABLE); //ÖØó3éäTIM1òy½Å       
  /* Ö¸¶¨òy½Å¸′óÃ1|Äü Ç°èy¸öÎaCH1 CH2 CH3oóèy¸öÎaCH1N CH2N CH3N*/
        GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_TIM1);
        GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_TIM1);
        GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_TIM1);
        GPIO_PinAFConfig(GPIOE,GPIO_PinSource8,GPIO_AF_TIM1);
        GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_TIM1);
        GPIO_PinAFConfig(GPIOE,GPIO_PinSource12,GPIO_AF_TIM1);       
          
}


void TIM1_Mode_Config(void)
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;//»ù±¾¶¨ê±½á11ìå
   TIM_OCInitTypeDef  TIM_OCInitStructure;        //êä3ö±è½Ï½á11ìå
        TIM_BDTRInitTypeDef TIM_BDTRInitStructure;     //é23μoíËàÇøÅäÖýá11ìå
        //μúò»2½ ÅäÖÃê±Öó                                                      
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //¶¨ê±Æ÷11òÔØÔúAPB2×üÏßéÏ
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  // RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);  //òy½ÅÖØó3éäòa¿aÆôÕa¸öê±Öó   

        //μú¶t2½ ¶¨ê±Æ÷»ù±¾ÅäÖÃ
  TIM_DeInit(TIM1);
  TIM_TimeBaseStructure.TIM_Period = MAX_CNT;                    //ÖüÆú=£¨ARR+1£©/TIM_CLK=84000/84M=10us  f=1Khz
  TIM_TimeBaseStructure.TIM_Prescaler = 1;                       //Tout=((arr+1)*(psc+1))/Tclk;
  TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;    //2»·ÖÆμ óÃóúéèÖÃËàÇø걼䣿
  TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_CenterAligned1 ;//ÅäÖÃÎaÖDDĶÔÆëÄ£ê½1
  TIM_TimeBaseStructure.TIM_RepetitionCounter=0;         //Öظ′¼ÆêyÆ÷Îa0  óÃóú×Ô¶ˉ¸üD&#194WMÕ¼¿Õ±è
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);       // 3õê¼»ˉ¶¨ê±Æ÷
  
        //ÅäÖö¨ê±Æ÷2 êÇÔúÖD¶ÏàïÃæ¸ü¸Ä¶¨ê±Æ÷1μÄÕ¼¿Õ±è  ′ó¶øê1¶¨ê±Æ÷12úéúSPWM
  TIM_TimeBaseStructure.TIM_Period =3444 ;                    //
  TIM_TimeBaseStructure.TIM_Prescaler =0;                       //
  TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;    //2»·ÖÆμ óÃóúéèÖÃËàÇø걼䣿
  TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//ÅäÖÃÎaÖDDĶÔÆëÄ£ê½1
  TIM_TimeBaseStructure.TIM_RepetitionCounter=0;         //Öظ′¼ÆêyÆ÷Îa0  óÃóú×Ô¶ˉ¸üD&#194WMÕ¼¿Õ±è
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);       // 3õê¼»ˉ¶¨ê±Æ÷

  TIM_ClearFlag(TIM1, TIM_FLAG_Update);                // Çå3tòç3öÖD¶Ï±êÖ¾
  TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);            // ¿aÆô¼ÆêyÆ÷ÖD¶Ï       
  
   
  //μúèy2½ PWMêä3öÅäÖÃ
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;               //ÅäÖÃÎaPWMÄ£ê½1
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;        //êä3öê1Äü
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //»¥21¶Ëêä3öê1Äü
  TIM_OCInitStructure.TIM_Pulse =0;                        //éèÖÃÕ¼¿Õ±è ÔúÖD¶Ï·tÎñoˉêyÖD¸øêyÖμ
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;       //éèÖÃóDD§μçƽÎaμíμçƽ òòÎaPWMÄ£ê½1μÄÔμ1ê
  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;     //»¥21êä3ö¸ßμçƽóDD§
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;      //Ö÷êä3öÔú±»½ûÖ1ê±Îa¸ßμçƽ
  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;  //»¥21êä3öÔú±»½ûÖ1ê±Îaμíμçƽ
  TIM_OC1Init(TIM1, &TIM_OCInitStructure);

  TIM_OCInitStructure.TIM_Pulse =0;   
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;        //êä3öê1Äü
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //»¥21¶Ëêä3öê1Äü
  TIM_OC2Init(TIM1, &TIM_OCInitStructure);//ê1Äüí¨μàÖØ×°ÔØ
   
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;        //êä3öê1Äü
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //»¥21¶Ëêä3öê1Äü
  TIM_OCInitStructure.TIM_Pulse =0;
  TIM_OC3Init(TIM1, &TIM_OCInitStructure);
   
  //μúËÄ2½ ËàÇøoíé23μ1|ÄüÅäÖÃ
  TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;//ÔËDDÄ£ê½ÏÂêä3öÑ¡Ôñ
  TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;//¿ÕÏDÄ£ê½ÏÂêä3öÑ¡Ôñ
  TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;//Ëø¶¨éèÖà 2»ì«¶®
  TIM_BDTRInitStructure.TIM_DeadTime = 100;//ËàÇø걼䠠11/sysclk168M=0.0654ns
  TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;//é23μ1|Äüê1Äü
  TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;//2»ì«¶®
  TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;//×Ô¶ˉêä3öê1Äü
  TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);//3õê¼»ˉBDTR
  
  //μúÎå2½ ê1Äü¶Ë′ò¿a
  
  TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
  TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
  TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);
  TIM_ARRPreloadConfig(TIM1, ENABLE);
       
        // ê1Äü¶¨ê±Æ÷
  TIM_Cmd(TIM1, ENABLE);       
  TIM_Cmd(TIM2, ENABLE);
  TIM_CtrlPWMOutputs(TIM1, ENABLE);//MOEÖ÷êä3öê1Äü
  
}


void init_sin_arr( void )
{
   int n;
   for(n=0;n<=T;n++)
   {
                //sin_arr[n] = (uint16_t) ( MAX_CNT * 0.5 * (1.0 + sin( 2 * PI * n / 360) ) + 0.5 );
                sin_arr[n] = (uint16_t) ( MAX_CNT * 0.5 * (1.0 + sin( 2 * PI * n / 360) )  );
   }
}

void TIM1_CC_IRQHandler(void)
//void TIM2_IRQHandler(void)       
{
   static int angle=0;   
       
   if ( TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET )                       
        {

           TIM1->CCR1 = sin_arr[  angle  % 360 ] ;// TIMx_CCRn &#206;a±è&#189;&#207;&#188;&#196;′&#230;&#198;÷ &#198;&#228;êy&#214;μμèóúTIM_Pulseà&#239;&#195;&#230;μ&#196;&#196;úèY  
                     
      TIM1->CCR2 = sin_arr[ (angle + 120 ) % 360 ] ;
                      
      TIM1->CCR3 = sin_arr[ (angle + 240 ) % 360 ] ;   
            
      angle++;                                       

      if ( angle == T ) angle = 0;
    TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
     
    }
}



[/mw_shl_code]

一周热门 更多>