你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【STM32F303开发】(五)TIM定时器PWM的输出与捕获

[复制链接]
风子 提问时间:2015-6-3 15:22 /
本帖最后由 风子 于 2017-2-16 18:02 编辑

本帖用高级定时器TIM1产生一组互补PWM,用通用定时器TIM3输入捕获,测量PWM的频率和占空比。

1、互补PWM输出

使用高级定时器1的CH1和CH1N通道,该定时器可以选用144M的高频率,对应选用输出引脚PA8和PA7,参考库函数使用手册的步骤,大概概括一下:

1.使能时钟和配置相应GPIO,几乎所有外设使用的第一步

2.配置定时器分频值,重装载值,计数模式等基本参数

3.配置OC参数,也就是OCInitStructure结构体,注意CHxN的输出状态要使能,才能输出互补

4.完成上面步骤就可以输出互补PWM了,如果需要死区等功能,再配置BDTR

5.打开定时器,使能PWM输出

下面是使用144M频率产生100k PWM的主要部分代码:

  1. RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
  2.         RCC_TIMCLKConfig(RCC_TIM1CLK_PLLCLK);        // 选择144M时钟

  3.         TIM_TimeBaseInitStructure.TIM_Prescaler = 0;
  4.         TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
  5.         TIM_TimeBaseInitStructure.TIM_Period = 1440-1;//144M/100k=1440
  6.         TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;
  7.         TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0x00;
  8.         TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStructure);

  9.         TIM_OCStructInit(&TIM_OCInitStructure);
  10.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  11.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  12.         TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;//开启互补通道
  13.         TIM_OCInitStructure.TIM_Pulse =720;//脉宽,50%占空比,1440/2
  14.         TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
  15.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  16.         TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
  17.         TIM_OC1Init(TIM1,&TIM_OCInitStructure);
  18.         TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);

  19.         TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
  20.         TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Disable;
  21.         TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
  22.         TIM_BDTRInitStructure.TIM_DeadTime =1440*4/100;//5%死区,则实际占空比45%
  23.         TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;
  24.         TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
  25.         TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
  26.         TIM_BDTRConfig(TIM1,&TIM_BDTRInitStructure);

  27.         TIM_Cmd(TIM1,ENABLE);
  28.         TIM_CtrlPWMOutputs(TIM1,ENABLE);
复制代码

用示波器可以查看输出波形。

2、PWM输入捕获

用这个功能可以测量输入波形的频率或(和)占空比,使用的是定时器TIM3的Input capture mode,可以测量频率或者占空比,为了方便同时测量这两个量,使用该模式中的特殊情况PWM input mode,如图:

QQ截图20150603150849.png

(截图自ST参考手册)

根据库函数说明手册的步骤:

1.开启时钟和配置GPIO

2.如果需要,配置定时器基本参数,如果不配置,将按默认配置运行

3.配置输入参数TIM_ICInitStruct,调用Call TIM_ICInit(TIMx, &TIM_ICInitStruct)配置测量频率或占空比中的一个,或者调用TIM_PWMIConfig(TIMx,               &TIM_ICInitStruct)同时测量者两个量

4.开启中断或者DMA并初始化,用来读取结果数据

5.如果用PWM input mode需要把定时器设为主从Reset模式

6.打开定时器,在中断或者DMA读取数据

(细节参考ST参考手册PWM input mode部分和库函数说明手册Input Capture management functions部分)

主要代码:

  1. TIM_ICInitStructure.TIM_Channel=TIM_Channel_2;
  2.           TIM_ICInitStructure.TIM_ICFilter=0x0;
  3.           TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
  4.           TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;
  5.           TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;

  6.           TIM_PWMIConfig(TIM3,&TIM_ICInitStructure);

  7.           TIM_SelectInputTrigger(TIM3,TIM_TS_TI2FP2);

  8.           TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);
  9.           TIM_SelectMasterSlaveMode(TIM3,TIM_MasterSlaveMode_Enable);

  10.           TIM_Cmd(TIM3,ENABLE);

  11.           TIM_ITConfig(TIM3,TIM_IT_CC2,ENABLE);
  12.            NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  13.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  14.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  15.           NVIC_Init(&NVIC_InitStructure);
复制代码

中断处理函数:

  1. volatile uint16_t IC2Value = 0;
  2. volatile uint16_t DutyCycle = 0;
  3. volatile uint32_t Frequency = 0;

  4. void TIM3_IRQHandler(void)
  5. {
  6.           TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);

  7.           IC2Value = TIM_GetCapture2(TIM3);

  8.           if (IC2Value != 0)
  9.           {
  10.             DutyCycle = (TIM_GetCapture1(TIM3) * 100) / IC2Value;
  11.             Frequency = 72000000 / IC2Value;
  12.           }
  13.           else
  14.           {
  15.             DutyCycle = 0;
  16.             Frequency = 0;
  17.           }
  18.                  printf("DutyCycle= %d\n",DutyCycle);
  19.                 printf("Frequency= %d\n",Frequency);
  20. }
复制代码

将1、中输出引脚短接到2、中的输入引脚,即可以在串口打印出测量的结果,在一定误差范围内测量正确。

完整的源码:

TIM_PWM.rar (1.64 KB, 下载次数: 421)

1 收藏 3 评论35 发布时间:2015-6-3 15:22

举报

35个回答
风子 回答时间:2015-6-4 14:08:46
苏浅叶 发表于 2015-6-4 14:01
哦哦,楼主可以把网址链接发过来,我看看,因为我们每天要看很多,总有遗漏,请谅解! ...

恩恩,理解,论坛帖子太多了,不过这也是论坛人气越来越旺的象征嘛
https://www.stmcu.org.cn/module/forum/thread-601980-1-1.html
https://www.stmcu.org.cn/module/forum/thread-602002-1-1.html
就是这两个
风子 回答时间:2015-6-4 13:46:16
苏浅叶 发表于 2015-6-4 13:44
这个是针对参与我们的线上活动进行筛选的,所以请谅解,欢迎持续关注我们的活动,也可以多多分享使用心得 ...

对啊,就是以这个话题参与活动的有的帖子没送
风子 回答时间:2015-6-4 14:29:17
苏浅叶 发表于 2015-6-4 14:25
好了 ,已经给了,感觉楼主单片机运用很自如啊!厉害!编程对逻辑思维要求很高啊! ...

谢谢,学习有一段时间了,基础还是有一定了解,还有很多东西需要继续学习啊
风子 回答时间:2015-6-3 15:28:34
【STM32F303开发】开发学习笔记、教程集合贴
https://www.stmcu.org.cn/module/forum/thread-602010-1-1.html
Paderboy 回答时间:2015-6-3 16:01:39
本帖最后由 Paderboy 于 2015-6-3 16:05 编辑

多谢分享。。。楼主可否发个完整的工程包?这样方便新手学习。。。
jiaswang 回答时间:2015-6-3 16:27:47
楼主平时有用HAL库玩吗?
风子 回答时间:2015-6-3 19:05:02
jiaswang 发表于 2015-6-3 16:27
楼主平时有用HAL库玩吗?

还没有呢,不过准备开始学HAL库了
风子 回答时间:2015-6-3 19:05:55
Paderboy 发表于 2015-6-3 16:01
多谢分享。。。楼主可否发个完整的工程包?这样方便新手学习。。。

在一楼评论中那个帖子里的第一个,有个工程模板,是我发的,把文件加进去就可以了
ROCK0525 回答时间:2015-6-3 19:08:35
留名,谢谢分享
小蚂蚁快溜跑 回答时间:2015-6-3 21:48:32
怒赞!已收藏
夏明smile 回答时间:2015-6-3 22:40:16
赞赞赞!!!
lkl0305 回答时间:2015-6-3 22:52:17
楼主这个是标准库么?
风子 回答时间:2015-6-3 22:54:21
lkl0305 发表于 2015-6-3 22:52
楼主这个是标准库么?

是的,,,
Paderboy 回答时间:2015-6-3 23:22:33
风子 发表于 2015-6-3 19:05
在一楼评论中那个帖子里的第一个,有个工程模板,是我发的,把文件加进去就可以了 ...

多谢楼主答复,如果能用HAL 库就更完美了。。。。。
风子 回答时间:2015-6-3 23:34:16
Paderboy 发表于 2015-6-3 23:22
多谢楼主答复,如果能用HAL 库就更完美了。。。。。

HAL库还没上手,正准备学习
Paderboy 回答时间:2015-6-3 23:36:12
HAL库ST 以后的主力,大家一起学习。。。
jiaswang 回答时间:2015-6-4 09:32:21
风子 发表于 2015-6-3 19:05
还没有呢,不过准备开始学HAL库了

这个库资料不多,入门要自己琢磨,比较慢,用的人确实少
123下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版