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

查看: 13274|回复: 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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版