关于STM32定时器输出方波时改变频率延时相应的问题

xiaoxiao2021-02-28  76

开始调试方波控制步进电机时,定时器初始化完成后:

void TIM1_PWM_Init(u16 arr,u16 psc) {   GPIO_InitTypeDef         GPIO_InitStructure; TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure; TIM_OCInitTypeDef        TIM_OCInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);         //ʹÄÜTIMxʱÖÓ    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);        //ʹÄÜGPIOÍâÉèʱÖÓ                                                                       //ÉèÖøÃÒý½ÅΪ¸´ÓÃÊä³ö¹¦ÄÜ,Êä³öTIM1 CH1µÄPWMÂö³å²¨ÐÎ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;                    //TIM_CH1 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;              //¸´ÓÃÍÆÍìÊä³ö GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);                       //³õʼ»¯Òý½Å TIM_TimeBaseStructure.TIM_Period = arr;                      //ÉèÖÃÔÚÏÂÒ»¸ö¸üÐÂʼþ×°Èë»î¶¯µÄ×Ô¶¯ÖØ×°ÔؼĴæÆ÷ÖÜÆÚµÄÖµ 80K TIM_TimeBaseStructure.TIM_Prescaler =psc;                    //ÉèÖÃÓÃÀ´×÷ΪTIMxʱÖÓÆµÂʳýÊýµÄÔ¤·ÖƵֵ  ²»·ÖƵ TIM_TimeBaseStructure.TIM_ClockDivision = 0;                 //ÉèÖÃʱÖÓ·Ö¸î:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIMÏòÉϼÆÊýģʽ TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);              //¸ù¾ÝTIM_TimeBaseInitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯TIMxµÄʱ¼ä»ùÊýµ¥Î» TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;             //Ñ¡Ôñ¶¨Ê±Æ÷ģʽ:TIMÂö³å¿í¶Èµ÷ÖÆÄ£Ê½2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±È½ÏÊä³öʹÄÜ TIM_OCInitStructure.TIM_Pulse = 0;                            //ÉèÖôý×°Èë²¶»ñ±È½Ï¼Ä´æÆ÷µÄÂö³åÖµ TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;     //Êä³ö¼«ÐÔ:TIMÊä³ö±È½Ï¼«ÐÔ¸ß TIM_OC1Init(TIM1, &TIM_OCInitStructure);                      //¸ù¾ÝTIM_OCInitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIMx   TIM_CtrlPWMOutputs(TIM1,ENABLE);                            //MOE Ö÷Êä³öʹÄÜ TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);             //CH1Ô¤×°ÔØÊ¹ÄÜ   TIM_ARRPreloadConfig(TIM1, ENABLE);                           //ʹÄÜTIMxÔÚARRÉϵÄÔ¤×°ÔØ¼Ä´æÆ÷ TIM_Cmd(TIM1, ENABLE);                                        //ʹÄÜTIM1  }

改变频率用的是函数:

void SetTIM_fr(u32 fr,TIM_TypeDef* TIMx)   //µ¥Î»Hz { u16 arr,psc; psc = (u16)(72000000/10000/fr+1+0.5);  arr = (u16)(72000000/psc/fr+0.5); TIMx->ARR = arr-1;    //×Ô¶¯ÖØ×°Öµ TIMx->PSC = psc-1;    //ʱÖÓÔ¤·ÖƵÊý TIMx->CCR1 = arr/2;   //Õ¼¿Õ±È  printf("fr=%d \r\n",fr); printf("arr=%d   psc=%d  CCR1=%d \r\n",arr,psc,arr/2); }

在好长一段时间内系统运行都没有问题

可是前段时间发现个比较奇怪的问题:在设置为小频率后,再设置大频率输出时,被设置的大频率不会立刻输出,而是延时一会输出。

 

最后解决的办法是:

void SetTIM_fr(u32 fr,TIM_TypeDef* TIMx)   //µ¥Î»Hz { u16 arr,psc; up_fr = fr; // if(fr<750) fr=750; psc = (u16)(72000000/10000/fr+1+0.5);  arr = (u16)(72000000/psc/fr+0.5); TIMx->ARR = arr-1;    //×Ô¶¯ÖØ×°Öµ TIMx->PSC = psc-1;    //ʱÖÓÔ¤·ÖƵÊý TIMx->CCR1 = arr/2;   //Õ¼¿Õ±È TIMx->EGR = TIM_PSCReloadMode_Immediate;     //

}

然后不要一直操作  TIM_Cmd(TIMx, ENABLE);

定时器打开后就不要开启和关闭来回操作

 

 

转载请注明原文地址: https://www.6miu.com/read-48283.html

最新回复(0)