有几个问题请教一下原子哥和大家,谢谢!
1,下面的TIM_Pulse不是CCR的预装载值吗,来控制占空比的?为什么我只有设置等于1的时候才能出现这样信号,请帮忙解释一下,顺便具体讲解一下TIM_Pulse更好了
2,仿真的时候效果还挺好,见下图。而在示波器上的时候,其中一路PWM的起始部分多了一个下降沿脉冲,并且PWM上也有好多尖刺
[mw_shl_code=c,true]TIM_OCInitStructure.TIM_Pulse =1 ;//CCR1的预装载值
TIM_OC1Init(TIM2, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM2 OC1
void SomePWM_Init(u16 TIM2per, u16 TIM3per)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 |RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //使能GPIO外设和AFIO复用功能模块时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_6|GPIO_Pin_7;//PA6->TIM3 PA7->TIM3 CH1 PA0->TIM2 CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA
//TIM2工作在单脉冲
TIM_TimeBaseStructure.TIM_Period = TIM2per; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =71; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
TIM_SelectOnePulseMode(TIM2,TIM_OPMode_Single);//设置TIM2在单脉冲模式,下一更新时间停止
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM2在CCR1上的预装载寄存器
TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_OC1Ref); //TM2的OC1作为触发输出
//初始化TIM2 Channel1 PWM模式 单脉冲
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OCInitStructure.TIM_Pulse =1 ;//CCR1的预装载值
TIM_OC1Init(TIM2, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM2 OC1
TIM_Cmd(TIM2,DISABLE);
//初始化TIM3
TIM_TimeBaseStructure.TIM_Period = TIM3per; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =71; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Gated);//TIM3为门控模式
TIM_SelectMasterSlaveMode(TIM3,TIM_MasterSlaveMode_Enable);//使能TIM3为主从模式
TIM_SelectInputTrigger(TIM3,TIM_TS_ITR1);//内部触发,从TIM2触发
//初始化TIM3 Channel2 PWM模式 单脉冲
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
// TIM_OCInitStructure.TIM_Pulse = TIM3Compare1;
TIM_OC1Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC1
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1,极性相反
TIM_OC2Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC2
TIM_Cmd(TIM3,ENABLE);
//TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器
}
//设置PWM输出
//Cycle:为周期,单位(us)
//PlusNum:为脉冲个数
void TIM2_TIM3_PWM(u16 Cycle, u16 PulseNum)
{
u16 TIM3per = 0;
u32 TIM2MK = 0;
//改变TIM3的重装值改变脉冲频率这里设置脉冲占空比为50%
//改变TIM2的预分频器和重装值改变脉冲个数
TIM2MK = Cycle * PulseNum; //预分频72,设置TIM2输出一定脉宽
TIM3per = Cycle; //预分频72,0.5us计数一次
TIM_SetAutoreload(TIM2, TIM2MK);//设置TIM2重装值
TIM_SetAutoreload(TIM3, TIM3per-1);//设置TIM3的重装值,1M/TIM3per
TIM_SetCompare1(TIM3,TIM3per/2);//设置占空比50%
TIM_SetCompare2(TIM3,TIM3per/2);//设置占空比50%
TIM_Cmd(TIM2,ENABLE);
}
void NPlus_PMW(){
SomePWM_Init(200,25);
TIM2_TIM3_PWM(25,8);
delay_ms(20);
}
[/mw_shl_code]
|