您的位置 首页 硬件

STM32_TIM3_PWM_MDK

最近要驱动电机,看了下PWM的输出,有所总结,这次贴上。stm32的高级定时器比较复杂,看了下例程,设置的东西太多了,就没有碰,看了通…

最近要驱动电机,看了下PWM的输出,有所总结,这次贴上。

stm32 的高档定时器 比较复杂,看了下例程,设置的东西太多了,就没有碰,

看了通用定时器还比较心爱,什么都刚刚好够用,就用它做了,这次用的是TIM3定时器3。

硬件渠道用的是stm32f103vet6 100脚的。

因为手头没有示波器,所以用软件仿真,先上一张仿真图:


下面是代码部分Timer3.c
C言语:Codee#20528
#include “Timer3.h”
/*******************************************************************************
* Function Name : None
* Description : 定时器3 PWM输出占空比全局变量
* Input : None
* Output : None
* Return : None
*******************************************************************************/
unsignedintT3CH1_DC=50;// 定时器3通道1占空比 全局变量
unsignedintT3CH2_DC=50;// 定时器3通道2占空比 全局变量
unsignedintT3CH3_DC=50;// 定时器3通道3占空比 全局变量
unsignedintT3CH4_DC=50;// 定时器3通道4占空比 全局变量

/*******************************************************************************
* Function Name : Timer3_GPIO_Configuration
* Description : 设置定时器3 PWM输出引脚
* Input : None
* Output : None
* Return : None
*******************************************************************************/
voidTimer3_GPIO_Configuration(void)
{
GPIO_InitTypeDefGPIO_InitStructure_TIMER3PWM_PORTA;
GPIO_InitTypeDefGPIO_InitStructure_TIMER3PWM_PORTB;

GPIO_InitStructure_TIMER3PWM_PORTA.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure_TIMER3PWM_PORTA.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure_TIMER3PWM_PORTA.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure_TIMER3PWM_PORTA);

GPIO_InitStructure_TIMER3PWM_PORTB.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure_TIMER3PWM_PORTB.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure_TIMER3PWM_PORTB.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure_TIMER3PWM_PORTB);
}

/*******************************************************************************
* Function Name : Timer3_BASE_Configuration 注意事项:
* Description : 设置基本参数 在 TIM_Period 里的5000 为一个重要常量
* Input : None 鄙人面的 初始化PWM信号 和 调理PWM占空比 函数里都用到
* Output : None 假如要调整PWM输出频率,那上面说到的两个函数里都要调理!
* Return : None
*******************************************************************************/
voidTimer3_BASE_Configuration(void)
{
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
TIM_DeInit(TIM3);//从头将Timer设置为缺省值
TIM_InternalClockConfig(TIM3);//选用内部时钟给TIM3供给时钟源
TIM_TimeBaseStructure.TIM_Prescaler=720;
//预分频系数为72,即不进行预分频,此刻TIMER的频率为1MHz
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV4;//设置时钟切割
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//设置计数器形式为向上计数模
TIM_TimeBaseStructure.TIM_Period=5000-1;
//设置计数溢出巨细,每计5000个数就发生一个更新事情,即PWM的输出频率为50Hz,Fre = 20ms
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);//将装备应用到TIM3中
}

/*******************************************************************************
* Function Name : Timer3_PWN_Configuration
* Description : 设置PWM参数
* Input : Dutyfactor : 占空比 (0~100)
* Output : None
* Return : None
*******************************************************************************/
voidTimer3_PWN_Configuration(void)
{
TIM_OCInitTypeDefTIM_OCInitStructure;

TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;//PWM方法 分1,2

/*************************** 通道1 ********************************/
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//PWM功能使能
TIM_OCInitStructure.TIM_Pulse=(T3CH1_DC*5000)/100;//写比较值(占空比输入)
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//设置正反相位,是先高电平仍是先低电平
TIM_OC1Init(TIM3,&TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);

TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;

/*************************** 通道2 ********************************/
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse=(T3CH2_DC*5000)/100;
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
TIM_OC2Init(TIM3,&TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);

/*************************** 通道3 ********************************/
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse=(T3CH3_DC*5000)/100;
TIM_OC3Init(TIM3,&TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);

/*************************** 通道4 ********************************/
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse=(T3CH4_DC*5000)/100;
TIM_OC4Init(TIM3,&TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);

TIM_ARRPreloadConfig(TIM3,ENABLE);
TIM_Cmd(TIM3,ENABLE);
}

/*******************************************************************************
* Function Name : TIM3PWM_4Channel_Configuration
* Description : 初始化定时器3,4个通道的PWM输出,占空比初始化为50%
* Input : None
* Output : None
* Return : None
*******************************************************************************/
voidTIM3PWM_4Channel_Configuration(void)
{
Timer3_GPIO_Configuration();
Timer3_BASE_Configuration();
Timer3_PWN_Configuration();
}

/*******************************************************************************
* Function Name : Adjust_DutyCycle
* Description : 定时器3调理4个通道的占空比
* Input : CHx : 输出通道 DC : 调理到多少数
* Output : None
* Return : None
*******************************************************************************/
voidAdjust_TIM3DutyCycle(unsignedcharCHx,unsignedintDC)
{
switch(CHx)
{
caseCH1:
{
TIM_SetCompare1(TIM3,((DC*5000)/100) );
break;
}
caseCH2:
{
TIM_SetCompare2(TIM3,((DC*5000)/100) );
break;
}
caseCH3:
{
TIM_SetCompare3(TIM3,((DC*5000)/100) );
break;
}
caseCH4:
{
TIM_SetCompare4(TIM3,((DC*5000)/100) );
break;
}
default:
{break;}
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/yingjian/252239.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部