开始调试方波控制步进电机时,定时器初始化完成后:
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);
定时器打开后就不要开启和关闭来回操作