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

来源:互联网 发布:mac 访问共享文件夹 编辑:程序博客网 时间:2024/06/07 07:24

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

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);

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



阅读全文
0 0
原创粉丝点击