关于定时器pwm产生

2019-07-20 10:17发布

本帖最后由 亦辰 于 2017-12-23 14:28 编辑

是这样的   就想通过定时器模拟下pwm波,就用坛友说的用两个定时器的思路来做,但是始终产生不了固定周期频率可变的PWM波,希望坛友帮忙找下问题,困惑几天了,具体代码如下
//主函数部分

int main(void)
{
   u8  dir=1;                          //捕获方向参数
   u16 Tim3pwmval=100;
   u16 Tim4pwmval;
        Cache_Enable();                 //打开L1-Cache
        HAL_Init();                                        //初始化HAL库
        Stm32_Clock_Init(432,25,2,9);   //设置时钟,216Mhz
        delay_init(216);                //延时初始化        
        LED_Init();                     //初始化LED
        TIM3_Init(500-1,108-1);     //108M/108=1M的计数频率,自动重装载为500,那么PWM频率为1M/500=2kHZ
        while(1)
        {     

       if (Tim3_ringflag)
      {   
            if (dir)
            {   
               Tim3pwmval++;                                //dir==1 led0pwmval递增
            }      
            else
            {
               Tim3pwmval--;                                    //dir==0 led0pwmval递减
            }

            if (Tim3pwmval>300)
            {
               dir=0;                        //led0pwmval到达300后,方向为递减
            }
            if (Tim3pwmval==0)
            {
               dir=1;                            //led0pwmval递减到0后,方向改为递增
            }
          Tim4pwmval=500-Tim3pwmval;

          HAL_TIM_Base_Stop(&TIM3_Handler);
          HAL_TIM_Base_DeInit(&TIM3_Handler);
         TIM4_Init( Tim4pwmval,108-1);         
          HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);        //PB1置0
          Tim3_ringflag=0;
      }

       else  if (Tim4_ringflag)
       {  


          HAL_TIM_Base_Stop(&TIM4_Handler);
          HAL_TIM_Base_DeInit(&TIM4_Handler);
          TIM3_Init( Tim3pwmval,108-1);      
          HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);        //PB1置1
          Tim4_ringflag=0;
        }   

          else
          {
                       ;
          }   


        }
}

//定时器和中断函数部分 PB1配置过了的

TIM_HandleTypeDef TIM3_Handler;      //定时器句柄
TIM_HandleTypeDef TIM4_Handler;      //定时器句柄
int Tim3_ringflag;      //中断标志位
int Tim4_ringflag;


void TIM3_Init(u16 arr,u16 psc)
{  
    TIM3_Handler.Instance=TIM3;                          //通用定时器3
    TIM3_Handler.Init.Prescaler=psc;                     //分频
    TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;    //向上计数器
    TIM3_Handler.Init.Period=arr;                        //自动装载值
    TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频因子

    HAL_TIM_Base_Init(&TIM3_Handler);
    HAL_TIM_Base_Start_IT(&TIM3_Handler); //使能定时器3和定时器3更新中断:TIM_IT_UPDATE   
}


void TIM4_Init(u16 arr,u16 psc)
{  
    TIM4_Handler.Instance=TIM4;                          //通用定时器4
    TIM4_Handler.Init.Prescaler=psc;                     //分频
    TIM4_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;    //向上计数器
    TIM4_Handler.Init.Period=arr;                        //自动装载值
    TIM4_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频因子

         HAL_TIM_Base_Init(&TIM4_Handler);
         HAL_TIM_Base_Start_IT(&TIM4_Handler); //使能定时器4和定时器4更新中断:TIM_IT_UPDATE   
}


//定时器底册驱动,开启时钟,设置中断优先级】
//此函数会被HAL_TIM_Base_Init()函数调用
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
    if (htim->Instance==TIM3)
        {
                __HAL_RCC_TIM3_CLK_ENABLE();            //使能TIM3时钟
                HAL_NVIC_SetPriority(TIM3_IRQn,1,3);    //设置中断优先级,抢占优先级1,子优先级3
                HAL_NVIC_EnableIRQ(TIM3_IRQn);          //开启ITM3中断   
        }  
         if (htim->Instance==TIM4)
        {
                __HAL_RCC_TIM4_CLK_ENABLE();            //使能TIM4时钟
                HAL_NVIC_SetPriority(TIM4_IRQn,1,3);    //设置中断优先级,抢占优先级1,子优先级3
                HAL_NVIC_EnableIRQ(TIM4_IRQn);          //开启ITM4中断   
        }  
}

//定时器3中断服务函数
void TIM3_IRQHandler(void)
{
    HAL_TIM_IRQHandler(&TIM3_Handler);
}


//定时器4中断服务函数
void TIM4_IRQHandler(void)
{
    HAL_TIM_IRQHandler(&TIM4_Handler);
}

//定时器中断服务函数调用
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{   
            

    if (htim==(&TIM3_Handler))
    {   
       Tim3_ringflag=1;

    }
         else if (htim==(&TIM4_Handler))
    {
       Tim4_ringflag=1;

         }
     else
         {
                ;
         }


}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。