|
本人正在做stm32的課程設計,其中用到輸出pwm波的相關知識,但關于CCR寄存器的值對PWM波形的影響有一些不明白的地方,以下先上tim1的初始化代碼
TIM_TimeBaseStructure.TIM_Period = 7199;
TIM_TimeBaseStructure.TIM_Prescaler = 0
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x00;
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
TIM_OCInitStructure.TIM_Pulse = DIY_Pulse;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
其中DIY_Pulse的初始值為3599(即初始占空比為1/2).然后我在主函數中還設置了一個中斷服務子程序(主要代碼如下):
if(EXTI_GetITStatus(EXTI_Line6)!=RESET)
{DIY_Pulse=DIY_Pulse-200;
TIM1->CCR1=DIY_Pulse;
EXTI_ClearITPendingBit(EXTI_Line6);}
可以看到中斷發生時會將DIY_Pulse的值減200并更新到CCR中,根據書上的解釋,當cnt的值計數到與ccr相同時電平會發生跳變,這里ccr的值減小,占空比應該是減小的,但實際上卻是增大,不明所以,想問下大神們這是為什么。
另外就是,關于這句代碼:TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low 書上說這里設置為high就可以實現互補輸出,但我卻要設成low仿真時才能實現互補,也是不明所以。
附上仿真的波形。
|
-
1 2.JPG
(27.5 KB, 下載次數: 44)
下載附件
2018-6-15 20:18 上傳
初始狀態
-
2 1.JPG
(24.84 KB, 下載次數: 43)
下載附件
2018-6-15 20:18 上傳
發生中斷后
|