STM32F407在使用定时器进行PWM输出时,我想在定时器初始化之后,进入中断之前,使其输出持续为低电平,一直也没能实现,总是多一个高低电平。我尝试过在初始化函数里进行强制低电平,结果也不符合预期。请大家帮忙修改一下。
现在程序的运行结果如下:
初始化输出极性为低时结果:
初始化输出极性为高时结果:
我想要实现第一个脉冲持续为低电平,不知该怎样配置,向大家请教~
我目前的代码如下:
void TIM12_PWM_Init(u32 arr,u32 psc)
{
//´Ë²¿·ÖÐèÊÖ¶¯ÐÞ¸ÄIO¿ÚÉèÖÃ
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM12,ENABLE); //TIM12ʱÖÓʹÄÜ
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); //ʹÄÜ

ORTBʱÖÓ
GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_TIM12); //GPIOB14¸´ÓÃΪ¶¨Ê±Æ÷12
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; //GPIOB10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //¸´Óù¦ÄÜ
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //ËÙ¶È100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //ÍÆÍ츴ÓÃÊä³ö
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //ÉÏÀ­
GPIO_Init(GPIOB,&GPIO_InitStructure); //³õʼ»¯

B14
TIM_TimeBaseStructure.TIM_Prescaler=psc; //¶¨Ê±Æ÷·ÖƵ
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //ÏòÉϼÆÊýģʽ
TIM_TimeBaseStructure.TIM_Period=arr; //×Ô¶¯ÖØ×°ÔØÖµ
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM12,&TIM_TimeBaseStructure);//³õʼ»¯¶¨Ê±Æ÷12
//³õʼ»¯TIM12 Channe1 PWMģʽ
//TIM_ForcedOC1Config(TIM12, TIM_ForcedAction_InActive);//Ç¿ÖÆÊä³öµÍµçƽ
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //Ñ¡Ôñ¶¨Ê±Æ÷ģʽ:TIMÂö³å¿í¶Èµ÷ÖÆģʽ1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±È½ÏÊä³öʹÄÜ
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //Êä³ö¼«ÐÔ:TIMÊä³ö±È½Ï¼«ÐÔµÍ
TIM_OC1Init(TIM12, &TIM_OCInitStructure); //¸ù¾ÝTÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIM12OC1
TIM_OC1PreloadConfig(TIM12, TIM_OCPreload_Enable); //ʹÄÜTIM12ÔÚCCR1ÉϵÄԤװÔؼĴæÆ÷
TIM_ARRPreloadConfig(TIM12,ENABLE);//ARPEʹÄÜ
//TIM_Cmd(TIM12, ENABLE); //ʹÄÜTIM12
TIM_ITConfig(TIM12,TIM_IT_Update,ENABLE); //ÔÊÐí¶¨Ê±Æ÷12¸üÐÂÖжÏ
NVIC_InitStructure.NVIC_IRQChannel=TIM8_BRK_TIM12_IRQn ; //¶¨Ê±Æ÷12ÖжÏ
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //ÇÀÕ¼ÓÅÏȼ¶1
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //×ÓÓÅÏȼ¶3
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM12, ENABLE); //ʹÄÜTIM12
}
void TIM8_BRK_TIM12_IRQHandler(void)
{
uint16_t tmpccmr1 = 0;
int t;
extern int j;
extern int ADSB[117];
if(TIM_GetITStatus(TIM12,TIM_IT_Update)==SET) //Òç³öÖжÏ
{
// tmpccmr1 = TIM12->CCMR1;
// /* Reset the OC1M Bits */
// tmpccmr1 &= (uint16_t)~TIM_CCMR1_OC1M;
// /* Configure The output Mode--PWM1 */
// tmpccmr1 |= TIM_OCMode_PWM1;
// /* Write to TIMx CCMR1 register */
// TIM12->CCMR1 = tmpccmr1;
if(j==117)
{
TIM_Cmd(TIM12, DISABLE);
TIM_ForcedOC1Config(TIM12, TIM_ForcedAction_Active);
}
else
{
t=ADSB[j];
if(t==0)
{
TIM12->CCER|=(uint16_t)0x0002; //TIM_OCPolarity_Low
TIM12->ARR =5000;
}
else if(t==1)
{
TIM12->CCER &=~(uint16_t)0x0002; //TIM_OCPolarity_High
TIM12->ARR =5000;
}
else if(t==2)
{
TIM12->CCER &=~(uint16_t)0x0002; //TIM_OCPolarity_High
TIM12->ARR =12500;
}
else if(t==3)
{
TIM12->CCER &=~(uint16_t)0x0002; //TIM_OCPolarity_High
TIM12->ARR =17500;
}
}
j++;
}
TIM_ClearITPendingBit(TIM12,TIM_IT_Update); //Çå³ýÖжϱê־λ
}
一周热门 更多>