首页 > 技术文章 > STM32定时器之PWM 4路输出 TIM3、TIM14

beiyhs 2019-08-30 16:17 原文

 

以STM32F030F4P6,uVision开发环境为例,注意了,若使用其它相近芯片,本文仅供参考。

程序运行后TIM3的CH1、CH2、CH4,TIM14的CH1输出PWM波形。

以下是main.c文件:

#include "stm32f0xx.h"                //转载请注明出处: https://www.cnblogs.com/beiyhs/p/11435583.html  北有寒山

void PWM_GPO_TIM(void)                                                                           //PWM引脚时钟设置函数
{

GPIO_InitTypeDef GPIO_InitStructure;                                                        //声明GPIO_InitStructure结构变量

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE);              //使能AHB预分频器到端口B的开关
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);              //使能AHB预分频器到端口A的开关

GPIO_PinAFConfig(GPIOB,GPIO_PinSource1,GPIO_AF_1); //B1口功能复用选择AF_1(Tim3_CH4)

GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_1); //A6口功能复用选择AF_1(Tim3_CH1)
GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GPIO_AF_1); //A7口功能复用选择AF_1(Tim3_CH2)
GPIO_PinAFConfig(GPIOA,GPIO_PinSource4,GPIO_AF_4); //A4口功能复用选择AF_4(Tim14_CH1)

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;              //指定模式为功能复用
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;           //指定输出为推挽输出
//GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;            //内部上拉输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    //设定端口最快输出50MHz

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|
                                                    GPIO_Pin_4;                        //指定脚6、7、4输出
GPIO_Init(GPIOA, &GPIO_InitStructure);                                //按以上参数设置A口

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                        //指定脚1输出
GPIO_Init(GPIOB, &GPIO_InitStructure);                                //按以上参数设置B口
}


void TIM3_PWM_Init(uint16_t period, uint16_t prescaler)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;            //声明TIM_TimeBaseStructure结构变量
TIM_OCInitTypeDef TIM_OCInitStructure;                            //声明TIM_OCInitStructure结构变量

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能AHB预分频器到TIM3
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE); //使能AHB预分频器到TIM14

TIM_TimeBaseStructure.TIM_Period = period;                     //设置TIM3自动重装周期值
TIM_TimeBaseStructure.TIM_Prescaler = prescaler;           //设置TIM3预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0;                  //设置时钟分割
TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up;    //向上计数
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);           //按以上参数初始化TIM3
TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure);         //按以上参数初始化TIM14

TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;          //PWM2模式
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;         //输出低
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; //比较输出使能

TIM_OCInitStructure.TIM_Pulse=12;                                    //占空比系数
TIM_OC1Init(TIM3,&TIM_OCInitStructure);                          //按以上参数初始化TIM3CH2

TIM_OCInitStructure.TIM_Pulse=24;                                     //占空比系数
TIM_OC2Init(TIM3,&TIM_OCInitStructure);                          //按以上参数初始化TIM3CH2

TIM_OCInitStructure.TIM_Pulse =36;                                   //占空比系数
TIM_OC4Init(TIM3,&TIM_OCInitStructure);                          //按以上参数初始化TIM3CH4
TIM_Cmd(TIM3, ENABLE);                                                   //使能TIM3

TIM_OCInitStructure.TIM_Pulse=12;                                    //占空比系数
TIM_OC1Init(TIM14,&TIM_OCInitStructure);                        //按以上参数初始化TIM14CH1
TIM_Cmd(TIM14, ENABLE);                                                 //使能TIM4
}


int main(void)
{
PWM_GPO_TIM();                                                               // PWM输出引脚、TIM函数
TIM3_PWM_Init(47, 0);                                                        // 时钟/PWM初始化函数
while (1)
{}
}

 

说明:

        1  20脚封装TIM3只有CH1、CH2、CH4能输出。

        2  输出频率:48M/(47+1)=1MHz,1M/(0+1)=1M

        3  TIM3的CH1占空比=12/(47+1)*100%=25%、 CH2占空比=50%、CH4占空比=75%,

            TIM4的CH1占空比=25% ;     

        4  注意“(GPIOA,GPIO_PinSource6,GPIO_AF_1)”  这句,STM不同型号芯片、同型号芯片管脚封装

           不同,其AF值都不同,一定要仔细看各自的芯片手册

推荐阅读