OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3796|回复: 5

定时器输出PWM 求助

[复制链接]

16

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2018-4-9
在线时间
111 小时
发表于 2018-4-17 20:58:47 | 显示全部楼层 |阅读模式
10金钱
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 波,现在不知道为什么不能用,请高手帮忙看一下程序那个地方不对,谢谢


最佳答案

查看完整内容[请看2#楼]

原子哥,我找到错误了,我的高低电平给错了,现在我想请问原子哥,怎么给一个定时器赋值啊,就是使定时长短逐渐变化的那种方法
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2018-4-9
在线时间
111 小时
 楼主| 发表于 2018-4-17 20:58:48 | 显示全部楼层
原子哥,我找到错误了,我的高低电平给错了,现在我想请问原子哥,怎么给一个定时器赋值啊,就是使定时长短逐渐变化的那种方法
回复

使用道具 举报

16

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2018-4-9
在线时间
111 小时
 楼主| 发表于 2018-4-17 22:15:54 | 显示全部楼层
我找出错误了,现在能输出PWM方波了,但接上舵机舵机不转啊
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-4-18 01:19:51 | 显示全部楼层
13969873363 发表于 2018-4-17 22:15
我找出错误了,现在能输出PWM方波了,但接上舵机舵机不转啊

PWM频率不对?
占空比,频率,是多少?符合舵机驱动条件么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

16

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2018-4-9
在线时间
111 小时
 楼主| 发表于 2018-4-18 22:06:07 | 显示全部楼层
正点原子 发表于 2018-4-18 01:19
PWM频率不对?
占空比,频率,是多少?符合舵机驱动条件么?

频率50HZ,用示波器测得正占空比为12.5%,舵机占空比如图,请问原子大哥,哪个地方有不对的地方啊,谢谢 QQ图片20180319204350.gif
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-4-19 01:40:48 | 显示全部楼层
频率应该是500hz才对吧
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 05:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表