STM32标准库函数之 TIM1定时器产生PWM波

/*
函数功能:定时器1通道1 4产生PWM波
函数参数:无
函数返回值:无
函数描述:无
*/
void Dingshiqi1_PWM_Init(void)
{
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;  //时间基 结构体变量
	GPIO_InitTypeDef GPIO_InitStruct;								//GPIO初始化 结构体变量
	TIM_OCInitTypeDef TIM_OCInitStruct;							//通道初始化 结构体变量
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); //使能TIM1定时器时钟线
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);	//使能GPIOA时钟线
	
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;  //这里跟TIM1 产生PWM波功能无关
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; //向上计时模式
	TIM_TimeBaseInitStruct.TIM_Period = 1000;    //计算到1000 那就是定时10ms
	TIM_TimeBaseInitStruct.TIM_Prescaler = 720;  //最高频率72MHZ  这里定义 预分频720 
																							 
	TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStruct);//初始化函数 让刚刚配置的参数 输入到对应寄存器里面
	
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; //GPIO采用复用推挽输出模式
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_11; //TIM1同时产生两路PWM波 在管脚a8 a11
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;  //GPIO速度50MHZ
	
	GPIO_Init(GPIOA,&GPIO_InitStruct);  //初始化函数 让刚刚配置的参数 输入到对应寄存器里面
	
	TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; //PWM1模式
	TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;//输出极性高
	TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//让捕获/比较寄存器使能
	TIM_OCInitStruct.TIM_Pulse = 0;  //初始化占空比0   占空比可以依照TIM_Period进行配置 在它范围内就好了
	
	TIM_OC1Init(TIM1,&TIM_OCInitStruct); //初始化函数 让刚刚配置的参数 输入到对应寄存器里面
	TIM_OC4Init(TIM1,&TIM_OCInitStruct); //初始化函数 让刚刚配置的参数 输入到对应寄存器里面
	TIM_Cmd(TIM1,ENABLE);    //使能定时器TIM1
	TIM_CtrlPWMOutputs(TIM1,ENABLE);  //确定让TIM1输入PWM
	TIM_OC1PreloadConfig(TIM1,ENABLE);  //让捕获/比较1寄存器 预装载功能使能 同时配置CC1通道为输出
	TIM_OC4PreloadConfig(TIM1,ENABLE); //让捕获/比较1寄存器 预装载功能使能 同时配置CC4通道为输出
	TIM_ARRPreloadConfig(TIM1,ENABLE);  //自动重装载预装载允许
}
 

该代码生成的波形图:

        占空比为:300,TIM_OCInitStruct.TIM_Pulse = 300;

       黄色的线是通道1 ,  紫色是通道4.

        

高级控制定时器框图 :

        

上面详细说明:

        代码说明:

               1. TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;  //这里跟TIM1 产生PWM波功能无关。

                原因:CKD[1:0]:时钟分频因子 (Clock division) 
这2位定义在定时器时钟(CK_INT)频率、死区时间和由死区发生器与数字滤波器(ETR,TIx)所用
的采样时钟之间的分频比例。 -----所以无关。

                2.TIM_TimeBaseInitStruct.TIM_Period = 1000;    //计算到1000  那就是定时10ms
    TIM_TimeBaseInitStruct.TIM_Prescaler = 720;  //最高频率72MHZ  这里定义 预分频720 

       原因:经stm32f1xx参考手册知计数器的时钟频率(CK_CNT)等于fCK_PSC/( PSC[15:0]+1)。所以这边719 就是720分频。定时10ms计算如下:10ms=(1/(72/720)*1000)s*(10^(-6))。

       3.    TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//让捕获/比较寄存器使能

                经过示波器的判断,发现这个参数无论使不使能,都不影响OC1通道的输出,但是会影响其它通道输出。( 找到原因的朋友 评论一下 ,谢谢啦)

TIM_OutputState_Enable时候:示波器如上图。

TIM_OutputState_Disable时:

        

               3.细心的朋友还发现TIM_OCInitStruct结构体下面还有这几个参数(作用如下):

                           1. TIM_OCInitStruct.TIM_OCNIdleState
                           2.TIM_OCInitStruct.TIM_OCNPolarity
                           3. TIM_OCInitStruct.TIM_OutputNState

 TIM_OCInitStruct.TIM_OCNIdleState 这个参数与PWM输出无关,经参考手册查询得  该参数用于  刹车和死区寄存器。

TIM_OCInitStruct.TIM_OCNPolarity 这个参数可以改变通道1 的输出极性,目前不怎么了解(为什么 输出极性 那里有了 还有弄个互补输出极性)。

 TIM_OCInitStruct.TIM_OutputNState 参数决定TIMX_CH1N通道是否输出。如上图那个地方。

另外的说明这三个参数,只与高级定时器相关,若没有使用高级定时器就可以不写,让它默认配置。

猜你喜欢

转载自blog.csdn.net/longjintao1/article/details/124308418