定时器输出PWM 求助

2019-07-20 08:35发布

time3.文件如下

#include "time3.h"
#include "sys.h"
#include "stdio.h"
#include "gpio.h"

/**************************************************************
*名    称:TIM3_Int_Init()
*功    能:定时器初始化函数
*输    入:无
*输    出:无
*说    明:非通用定时器3挂时钟总线2上,其余通用定时器2345挂在时钟总线1上
           定时时间计算公式: Tout(定时时间) = (arr + 1)* (psc +1 ) /72MHz
**************************************************************/
void TIM3_Int_Init(u16 arr,u16 psc)
  {
          TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
          NVIC_InitTypeDef NVIC_InitStructure;                  
      RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);    //时钟总线使能

//TIM3初始化
      TIM_TimeBaseStructure.TIM_Period = arr;                //设置自动重载计数周期值   arr
      TIM_TimeBaseStructure.TIM_Prescaler = psc;              //设置分频系数 (预分频数)           psc
      TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分频因子
      TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   //设置计数方式
      TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);         //打开定时器3并初始化
          TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);                //更新中断(定时器号,中断类型,使能)
          
          //中断优先级 NVIC 设置
      NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;        //TIM3 中断
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级 0 级
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;     //从优先级 3 级
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;        //IRQ 通道被使能
      NVIC_Init(&NVIC_InitStructure);                        //初始化 NVIC 寄存器
          TIM_Cmd(TIM3, ENABLE);                                  //使能定时器3并打开
  }

/****************************************************************************************
*名    称:TIM3_IRQHandler()
*功    能:定时器3中断服务函数
*输    入:无
*输    出:无
*说    明:定时器是指在设定完时间之后,每隔设定的时间进入一次中断
          在执行完中断之后回到主函数继续执行
****************************************************************************************/

void TIM3_IRQHandler(void)  
  {
    if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)     //检查 TIM3 更新中断发生与否
    {  
               
               
       TIM_ClearITPendingBit(TIM3, TIM_IT_Update );       //清除 TIM3 更新中断标志
            TIM_Cmd(TIM2, ENABLE);
                SERVO0=1;
    }
  }       

time2.c文件如下
#include "time2.h"
#include "sys.h"
#include "stdio.h"
#include "gpio.h"


/**************************************************************
*名    称:TIM2_Int_Init()
*功    能:定时器初始化函数
*输    入:无
*输    出:无
*说    明:非通用定时器1挂时钟总线2上,其余通用定时器2345挂在时钟总线1上
           定时时间计算公式: Tout(定时时间) = (arr + 1)* (psc +1 ) /72MHz
**************************************************************/

void TIM2_Int_Init(u16 arr,u16 psc)
  {
          TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
          NVIC_InitTypeDef NVIC_InitStructure;                  
      RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);        //时钟总线使能

//TIM3初始化
      TIM_TimeBaseStructure.TIM_Period = arr;                     //设置自动重载计数周期值   arr
      TIM_TimeBaseStructure.TIM_Prescaler = psc;                    //设置分频系数 (预分频数)           psc
      TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //设置时钟分频因子
      TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //设置计数方式,向上计数
      TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);             //打开定时器2并初始化
          TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);                    //更新中断(定时器号,中断类型,使能)
          
          //中断优先级 NVIC 设置
      NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;             //TIM2 中断
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;   //先占优先级 0 级
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;          //从优先级 2 级
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;             //IRQ 通道被使能
      NVIC_Init(&NVIC_InitStructure);                             //初始化 NVIC 寄存器
//          TIM_Cmd(TIM2, ENABLE);                                      //使能定时器2并打开
  }

/********************************************************************************
*名    称:Timer2ARRValue()
*功    能:TIM2赋初值函数
*输    入:无
*输    出:无
*说    明:通过改变arr的值来改变占空比  
*********************************************************************************/
  //void Timer2ARRValue(u16 arr)       
//{
//       
//        TIM2->ARR = arr + 1;
//}


/****************************************************************************************
*名    称:TIM2_IRQHandler()
*功    能:定时器2中断服务函数
*输    入:无
*输    出:无
*说    明:定时器是指在设定完时间之后,每隔设定的时间进入一次中断
          在执行完中断之后回到主函数继续执行
                  在TIM2中断中关闭GPIO口的输出,拉低电平
****************************************************************************************/

void TIM2_IRQHandler(void)  
  {
    if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)     //检查 TIM2 更新中断发生与否
    {
       TIM_ClearITPendingBit(TIM2, TIM_IT_Update );        //清除 TIM2 更新中断标志
       TIM_Cmd(TIM2, DISABLE);                             //关闭TIM2的使能
       SERVO0=0;
    }
}       

       
       
SERVO0定义了一个GPIO口

主函数如下
int main(void)
{               
         u16 led0pwmval=0;
u8 dir=1;
        delay_init();
        TIM2_Int_Init(1999,7199);   //Tout = ((arr+1)*(psc+1))/Tclk ;     10ms
        TIM3_Int_Init(999,7199);
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
         GPIO_Inite();
        while(1)
        {
               
                delay_ms(10);
      if(dir)led0pwmval++;
        else led0pwmval--;
     if(led0pwmval>300)dir=0;
     if(led0pwmval==0)dir=1;
    TIM_SetCompare2(TIM3,led0pwmval);
}
        }



  我想用两个定时器交叉搭配是用输出PWM 波,现在不知道为什么不能用,请高手帮忙看一下程序那个地方不对,谢谢


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
13969873363
1楼-- · 2019-07-20 09:30
 精彩回答 2  元偷偷看……
13969873363
2楼-- · 2019-07-20 12:41
我找出错误了,现在能输出PWM方波了,但接上舵机舵机不转啊
正点原子
3楼-- · 2019-07-20 15:59
13969873363 发表于 2018-4-17 22:15
我找出错误了,现在能输出PWM方波了,但接上舵机舵机不转啊

PWM频率不对?
占空比,频率,是多少?符合舵机驱动条件么?
13969873363
4楼-- · 2019-07-20 21:16
 精彩回答 2  元偷偷看……
正点原子
5楼-- · 2019-07-20 21:47
频率应该是500hz才对吧

一周热门 更多>