概述
/*
函数功能:定时器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通道是否输出。如上图那个地方。
另外的说明这三个参数,只与高级定时器相关,若没有使用高级定时器就可以不写,让它默认配置。
最后
以上就是冷静纸飞机为你收集整理的STM32标准库函数之 TIM1定时器产生PWM波该代码生成的波形图:高级控制定时器框图 :上面详细说明:的全部内容,希望文章能够帮你解决STM32标准库函数之 TIM1定时器产生PWM波该代码生成的波形图:高级控制定时器框图 :上面详细说明:所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复