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

查看: 13275|回复: 35

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

[复制链接]

33

主题

1243

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-3-9
发表于 2015-6-3 15:22:37 | 显示全部楼层 |阅读模式
本帖最后由 风子 于 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, 下载次数: 354)

<
回复

使用道具 举报

33

主题

1243

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-3-9
 楼主| 发表于 2015-6-3 15:28:34 | 显示全部楼层
【STM32F303开发】开发学习笔记、教程集合贴
https://www.stmcu.org.cn/module/forum/thread-602010-1-1.html
回复 支持 反对

使用道具 举报

47

主题

3404

回帖

30

蝴蝶豆

版主

最后登录
2020-12-7
发表于 2015-6-3 16:01:39 | 显示全部楼层
本帖最后由 Paderboy 于 2015-6-3 16:05 编辑

多谢分享。。。楼主可否发个完整的工程包?这样方便新手学习。。。
回复 支持 反对

使用道具 举报

7

主题

311

回帖

0

蝴蝶豆

高级会员

最后登录
2016-3-23
发表于 2015-6-3 16:27:47 | 显示全部楼层
楼主平时有用HAL库玩吗?
回复 支持 反对

使用道具 举报

33

主题

1243

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-3-9
 楼主| 发表于 2015-6-3 19:05:02 | 显示全部楼层
jiaswang 发表于 2015-6-3 16:27
楼主平时有用HAL库玩吗?

还没有呢,不过准备开始学HAL库了
回复 支持 反对

使用道具 举报

33

主题

1243

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-3-9
 楼主| 发表于 2015-6-3 19:05:55 | 显示全部楼层
Paderboy 发表于 2015-6-3 16:01
多谢分享。。。楼主可否发个完整的工程包?这样方便新手学习。。。

在一楼评论中那个帖子里的第一个,有个工程模板,是我发的,把文件加进去就可以了
回复 支持 反对

使用道具 举报

2

主题

501

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-7-18
发表于 2015-6-3 19:08:35 | 显示全部楼层
留名,谢谢分享
回复 支持 反对

使用道具 举报

17

主题

341

回帖

0

蝴蝶豆

金牌会员

最后登录
2018-2-26
发表于 2015-6-3 21:48:32 | 显示全部楼层
怒赞!已收藏
回复 支持 反对

使用道具 举报

10

主题

207

回帖

0

蝴蝶豆

中级会员

最后登录
2018-7-26
发表于 2015-6-3 22:40:16 | 显示全部楼层
赞赞赞!!!
回复 支持 反对

使用道具 举报

40

主题

1595

回帖

1

蝴蝶豆

论坛元老

最后登录
2018-7-23
发表于 2015-6-3 22:52:17 | 显示全部楼层
楼主这个是标准库么?
回复 支持 反对

使用道具 举报

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