stm32定时器输出PWM控制LED灯

男娘i 2022-05-19 10:21 527阅读 0赞

stm32定时器输出PWM控制LED灯

wangxl@20180723

一、概述

本章中,通过查看原理图,我们的LED指示灯配置在PA4管脚上,查表得知PA4的管脚与TIM14 的通道1重映射, 通过定时器产生 PWM 来控制指示灯的亮度。

70

二、本章学习目标

  1. 学会查看数据手册
  2. 理解stm32端口复用
  3. 学会配置 STM32 的定时器
  4. 学会配置定时器输出PWM

三、PA端口复用

参见DataSheet:“STM32F030x数据手册.pdf”P31

70 1

**复用功能**:要想用某个复用功能,首先把IO口配置成复用功能模式,复用输出输入模式(根据功能的不同配置成不同的模式,参考手册里面详细介绍)。比如你想用PA4复用功能TIM14-CH1输出比较,先把PA4设置为推挽复用输出(GPIO_MODE_AF)。再配置TIM14-CH1即可。

Gpio复用功能配置函数介绍:

void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource,uint8_t GPIO_AF)

函数解释:改变指定管脚的映射关系。即配置指定管脚的复用功能。

函数参数说明:

GPIOx:gpio的分组/gpio端口;

GPIO_PinSource:具体要配置成复用功能的管脚(如GPIO_Pin_0 GPIO_Pin_1这样的宏定义);

GPIO_AF:选择该管脚要使用的复用功能。有如下配置:(注意:复用功能的配置要和实际管脚支持的复用功能匹配)

如本例配置:GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_4);

四、功能简介

通过初始调用Timer_cfg(),配置PA4管脚对应的tim14时钟;实时调用PWM_cfg(uint8_t duty)函数,传输不同的duty值,改变比较寄存器(CCR1)中的值,从而改变PWM的占空比,实现产生频率为1K占空比的PWM波。

五、代码参考

1、timerpwm.h头

//————————————timerpwm.h—————————————————-

#ifndef __TIMERPWM_H

#define __TIMERPWM_H

#include “stm32f0xx.h”

//PA4 TIM14_CH1

extern TIM_OCInitTypeDef TIM_OCInitStructure;

#define LED_PWM_VAL TIM4->CCR1 //CCR1捕获比较值寄存器

#define PWM_PIN GPIO_Pin_4

#define PWM_GPIO_PORT GPIOA

#define PWM_GPIO_CLK RCC_AHBPeriph_GPIOA

void Timer_cfg();

void PWM_cfg(uint8_t duty);

#endif

//————————————timerpwm.h end—————————————————-

  1. Timerpwm.c

#include “timerpwm.h”

uint16_t TimerPeriod;

//初始配置PA4对应的tim14时钟

void Timer_cfg()

{

  1. GPIO\_InitTypeDef GPIO\_InitStructure;
  2. TIM\_TimeBaseInitTypeDef TIM\_TimeBaseStructure;
  3. /\* GPIOA Clocks enable \*/
  4. RCC\_AHBPeriphClockCmd( PWM\_GPIO\_CLK, ENABLE);//使能GPIO的AHB总线时钟
  5. /\* GPIOA PA4 Configuration: Time4 Channel 1 \*/
  6. GPIO\_InitStructure.GPIO\_Pin = PWM\_PIN ;
  7. GPIO\_InitStructure.GPIO\_Mode = GPIO\_Mode\_AF; //把需要的管脚配置成第二功能模式
  8. GPIO\_InitStructure.GPIO\_Speed = GPIO\_Speed\_50MHz;
  9. GPIO\_InitStructure.GPIO\_OType = GPIO\_OType\_PP;
  10. GPIO\_InitStructure.GPIO\_PuPd = GPIO\_PuPd\_UP ;
  11. GPIO\_Init(PWM\_GPIO\_PORT, &GPIO\_InitStructure);//对PA4进行IO口初始化
  12. //配置管脚复用 GPIOA4复用为TIM14
  13. GPIO\_PinAFConfig(PWM\_GPIO\_PORT, GPIO\_PinSource4, GPIO\_AF\_4);
  14. //使能TIM14时钟
  15. RCC\_APB1PeriphClockCmd(RCC\_APB1Periph\_TIM14, ENABLE);
  16. /\* Compute the value to be set in ARR regiter to generate signal frequency at 1 Khz \*/
  17. TimerPeriod = (SystemCoreClock / 1000 ) - 1;
  18. /\* Time Base configuration \*/
  19. TIM\_TimeBaseStructure.TIM\_Prescaler = 0;
  20. TIM\_TimeBaseStructure.TIM\_CounterMode = TIM\_CounterMode\_Up;
  21. TIM\_TimeBaseStructure.TIM\_Period = TimerPeriod;
  22. TIM\_TimeBaseStructure.TIM\_ClockDivision = 0;
  23. TIM\_TimeBaseStructure.TIM\_RepetitionCounter = 0;
  24. //使用内部时钟
  25. TIM\_TimeBaseInit(TIM14, &TIM\_TimeBaseStructure);

}

//led灯的pwm占空比输出

void PWM_cfg(uint8_t duty)

{

  1. //占空比,取值范围为0-100
  2. int dutyfactor = (uint16\_t) (((uint32\_t) duty \* (TimerPeriod-1 )) / 100);
  3. TIM\_OCInitTypeDef TIM\_OCInitStructure;
  4. //设置缺省值
  5. TIM\_OCStructInit(&TIM\_OCInitStructure);
  6. /\* Channel 1 Configuration in PWM mode \*/
  7. TIM\_OCInitStructure.TIM\_OCMode = TIM\_OCMode\_PWM2;//选择定时器模式
  8. TIM\_OCInitStructure.TIM\_OutputState = TIM\_OutputState\_Enable; //选择输出比较状态 使能输出状态 开启OC\*输出到对应引脚
  9. TIM\_OCInitStructure.TIM\_OutputNState = TIM\_OutputNState\_Enable;//选择互补输出比较状态 互补输出使能 开启OC\*N输出到对应的引脚
  10. TIM\_OCInitStructure.TIM\_Pulse = dutyfactor; //设置了待装入捕获比较器的脉冲值
  11. //TIM输出比较极性高
  12. TIM\_OCInitStructure.TIM\_OCPolarity = TIM\_OCPolarity\_High;//设置TIM输出比较极性 高
  13. TIM\_OC1Init(TIM14, &TIM\_OCInitStructure);
  14. TIM\_Cmd(TIM14, ENABLE);
  15. //设置TIM1的PWM输出为使能
  16. TIM\_CtrlPWMOutputs(TIM14,ENABLE);

}

发表评论

表情:
评论列表 (有 0 条评论,527人围观)

还没有评论,来说两句吧...

相关阅读

    相关 stm32 PWM输出学习

    STM32 的定时器除了 TIM6 和 7,其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。通用定时