PWM模式,捕获输出模式

PWM模式,捕获输出模式

我翻了半天手册,结果还是很懵,这俩到底有什么区别??后来再翻论坛,总算翻出来

一语点破

使用定时器的PWM模式只能在4个通道产生频率相同但占空比不同的输出信号
使用定时器的输出比较模式可以在4个通道上产生频率不同,占空比也不同的输出信号

那再加一句ARR控制频率,CRR控制占空比

相信懂的朋友看到这已经目的达成了,不懂的朋友可以往下看看

 这次就不上寄存器和引脚图,实在找不到说清的

相关库函数

 TIM_OCxInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

X为相关通道1~4

TIM_OCMode//选择定时器模式:

#define TIM_OCMode_Timing ((uint16_t)0x0000)  //TIM输出比较时间模式
#define TIM_OCMode_Active ((uint16_t)0x0010)//TIM输出比较主动模式
#define TIM_OCMode_Inactive ((uint16_t)0x0020)TIM输出比较非主动模式
#define TIM_OCMode_Toggle ((uint16_t)0x0030)TIM输出比较触发模式
#define TIM_OCMode_PWM1 ((uint16_t)0x0060)TIM脉冲宽度调制模式1
#define TIM_OCMode_PWM2 ((uint16_t)0x0070)TIM脉冲宽度调制模式2

{

TIM_OCMode_Timing          TIM_OCMode_Toggle   

当触发时TIM_OCMode_Timing  电平不变       TIM_OCMode_Toggle 电平反转

TIM_OCMode_Active          TIM_OCMode_Inactive 

当触发时TIM_OCMode_Active 持续为高且不变      TIM_OCMode_Inactive 电平持续为低且不变

TIM_OCMode_PWM1   TIM_OCMode_PWM2 

这个上个图吧  上位pwm1 ,下为pwm2

}

TIM_OutputState//比较输出使能

#define TIM_OutputState_Disable ((uint16_t)0x0000)
#define TIM_OutputState_Enable ((uint16_t)0x0001)

TIM_OCPolarity//输出极性

#define TIM_OCPolarity_High ((uint16_t)0x0000)TIM输出比较极性高
#define TIM_OCPolarity_Low ((uint16_t)0x0002)TIM输出比较极性低

TIM_Pulse//占空比设置范围 0~ffff 与之相同的函数且常用的为 TIM_SetCompare1()

示例代码

CH1通道为比较输出

CH2为pwm输出

 1 void TIM3_Int_Init(u16 arr,u16 psc)
 2 {
 3   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
 4     NVIC_InitTypeDef NVIC_InitStructure;
 5 
 6     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
 7 
 8     TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值     计数到5000为500ms
 9     TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  
10     TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
11     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
12     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
13  
14     TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
15 
16     NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
17     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
18     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
19     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
20     NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
21 
22     TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设
23                              
24 }
25 //定时器3中断服务程序
26 void TIM3_IRQHandler(void)   //TIM3中断
27 {
28     if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
29         {
30         TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源 
31         LED1=!LED1;
32         }
33 }
34 
35 
36 
37 
38 //TIM3 PWM部分初始化 
39 //PWM输出初始化
40 //arr:自动重装值
41 //psc:时钟预分频数
42 void TIM3_PWM_Init(u16 arr,u16 psc)
43 {  
44     GPIO_InitTypeDef GPIO_InitStructure;
45     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
46     TIM_OCInitTypeDef  TIM_OCInitStructure;
47 TIM_OCInitTypeDef   TIM_OCInitStructuree;
48 
49     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);    //使能定时器3时钟
50      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  |RCC_APB2Periph_GPIOA| RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
51     
52     GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射  TIM3_CH1->PB4  TIM3_CH2->PB5    
53  
54    //设置该引脚为复用输出功能,输出TIM3 CH1,2的PWM脉冲波形    
55      
56     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5; //TIM_CH1,2
57     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
58     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
59     GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
60     
61 
62 
63    //初始化TIM3
64     TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
65     TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 
66     TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
67     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
68     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
69     
70     //初始化TIM3 Channel,2 PWM模式     
71     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
72      TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
73     //TIM_OCInitStructure.TIM_Pulse=0;
74     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
75     TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2
76     
77     TIM_OCInitStructuree.TIM_OCMode = TIM_OCMode_Toggle; 
78      TIM_OCInitStructuree.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
79     //TIM_OCInitStructuree.TIM_Pulse= 300;一般用TIM_SetCompare2代替
80     TIM_OCInitStructuree.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
81     TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2
82     TIM_OC1Init(TIM3, &TIM_OCInitStructuree);  //根据T指定的参数初始化外设TIM3 OC1
83 
84 
85 
86 
87 
88     TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器
89     TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR1上的预装载寄存器
90     
91             TIM_SetCompare2(TIM3,800);    
92             TIM_SetCompare1(TIM3,800);    
93 
94     TIM_Cmd(TIM3, ENABLE);  //使能TIM3
95     
96 
97 }

 

猜你喜欢

转载自www.cnblogs.com/forup/p/12797643.html