学习过程中碰到的几个问题
1.PWM模式 与 输出比较模式 的区别:
https://blog.csdn.net/qq_20222919/article/details/106564957
(这位大佬的博客比较详细。)
- 输出比较模式是每次到达OCR的值的时候,会变化一次电平,
- pwm模式在对应定时器上的四个通道产生的频率是同步的(即相同的),而输出比较模式在四个通道可以产生的频率不同。
2.PWM1与PWM2模式
110:PWM模式1- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。
111:PWM模式2- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。
然后,有效电平再经过后面的TIM_OCPolarity的设置才能最终确实输出的高低电平。
3.高级定时器输出PWM的特殊配置——TIM_CtrlPWMOutputs
使用TIM1的时候怎么也输出不了PWM,基本上都快跟正点的一样了,但是就是不行。然后去网上找了个TIM1的,发现多了一句//MOE 主输出使能 高级定时器会用到 TIM_CtrlPWMOutputs(TIM1,ENABLE);
加上这句就可以了,这句是F1的高级定时器如TIM1, TIM8,TIM15, TIM16以及TIM17才会用到的,
注意,通用定时器是不可以用这个的,否则会卡在这。
4.TIM_ARRPreloadConfig与TIM_OCxPreloadConfig
https://blog.csdn.net/jpaekeo/article/details/64906477?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-3.baidujs&dist_request_id=1328740.28086.16169248064312057&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-3.baidujs
这位大佬写的很详细了,(谨以此收藏一下,方便日后查看。lol)
5.配置TIM1的CH1&CH4,结果CH1没有PWM——TIM_OCInitStructure 需完全配置
//PWMA --------- PA11 TIM1 CH4
//PWMB --------- PA8 TIM1 CH1
配置完之后,PA11的PWM很完美,但是PA8只有噪声,而两个CH的配置完全相同,本以为是两个哪里顺序不对,导致最后只有一个成功了,注释掉CH4的代码之后CH1还是不行。
经过查阅,其实很奇怪,倒觉得,CH4其实是不应该有输出PWM的。因为,只有
TIM_OCInitStructure 这个结构体全部配置了才可以有输出,这就很玄学了。。。。。。。没有完全配置之前CH4居然可以输出PWM???????????????
那么还有一个问题,这些带N的是什么呢?
高级定时器PWM的特殊之处
1.必须有TIM_CtrlPWMOutputs
2.TIM_OCInitStructure 结构体必须完全配置。
下面是高级定时器的代码,终于可以用了:
#include "TIMER.h"
//PWMA --------- PA11 TIM1 CH4
//PWMB --------- PA8 TIM1 CH1
/*
110:PWM模式1- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为
无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否
则为有效电平(OC1REF=1)。
111:PWM模式2- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为
有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电
平。
*/
void TIM1_PWM_Init(u16 psc, u16 arr)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
//使能TIM1,GPIOA时钟 ,复用时钟AFIO不需要,只有重映射等3种情况才需要复用功能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOA , ENABLE);
//配置GPIO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_11; //端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA
//定时器实际参数初始化
TIM_TimeBaseInitStructure.TIM_Period = arr;
TIM_TimeBaseInitStructure.TIM_Prescaler = psc;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
//TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim //这句话是设置定时器时钟(CK_INT)频率与数字滤波器(ETR,TIx)使用的采样频率之间的分频比例的(与输入捕获相关),0表示滤波器的频率和定时器的频率是一样的
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStructure);
//TIM1-CH1参数配置
//!!!!!!!!!!!!!!!高级定时器的结构体必须全部配置,否则输出不了PWM波!!!!
TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能输出比较状态 //使能输出到端口
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;//使能输出比较N状态
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;//当 MOE=0 重置 TIM1 输出比较空闲状态
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;//当 MOE=0 重置 TIM1 输出比较 N 空闲状态
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;//TIM1 输出比较N极性高
TIM_OC1Init(TIM1,&TIM_OCInitStructure);
//TIM1-CH4参数配置
TIM_OC4Init(TIM1,&TIM_OCInitStructure);
//MOE 主输出使能 高级定时器会用到
TIM_CtrlPWMOutputs(TIM1,ENABLE);
//!!!!!!!!!!!!!!!!!使能预装载寄存器!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);
//使能TIMx在ARR上的预装载寄存器
TIM_ARRPreloadConfig(TIM1, ENABLE);
//使能定时器
TIM_Cmd(TIM1,ENABLE);
//设置占空比
TIM_SetCompare1(TIM1,7200/2);
TIM_SetCompare4(TIM1,7200/2);
}
另外这篇博客对定时器输出PWM写的还是很彻底的。可以一读。
http://home.eeworld.com.cn/my/space-uid-320111-blogid-55195.html