我翻了半天手册,结果还是很懵,这俩到底有什么区别??后来再翻论坛,总算翻出来
使用定时器的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 }
原文:https://www.cnblogs.com/forup/p/12797643.html