热度 5
2020-8-29 08:30
4127 次阅读|
1 个评论
使用 timer 产生脉冲波形,控制步进电机转动。当使用微步方式时,脉冲频率等于整步频率乘以细分数。有时,我们需要每步进行处理,也就是在发出脉冲时,产生中断。对于常用的双极步进电机,最快的速度大概是 2000PPS ,也就是一秒钟 10 圈。如果使用 256 细分,则输出脉冲频率为 512K ,这么高频率的中断,显然有问题。 有个方法,可以降低中断数量。 可以使用两个 TIMER ,其中一个用于产生电机控制脉冲。常规的办法是使用 50% 点空比的 PWM 脉冲。 另外不个设置为 PWM 无输出,预分频值为产生电机控制脉冲的细分倍。启动后产生中断。 void MOT_StartPPS(uint16_t para){ uint16_t temp; PSC = 99; temp = 0xFFFF ; ARR = temp - 1; CCR2 = temp / 2; PSC = 256*100-1; temp = 0xFFFF; ARR = temp - 1; CCR1 = temp / 2; 。。。。。。 HAL_TIM_PWM_Start(&htim15,TIM_CHANNEL_2); HAL_TIM_PWM_Start_IT(&htim16,TIM_CHANNEL_1); } 对于较高的速度,需要斜坡启动,所以将 PWM 脉冲重复频率设置为最慢,启动 PWM 输出,同时启动另一个 TIMER 的中断输出(这里我们只要中断,不要输出)。 随后在程序中,定时运行步述代码,逐步将频率提高,直到达到设定值。 if(ppsstart == 1){ if((mscnt % SLOPINT)==0){ ppsratenow += SLOPINCPPS; if(ppsratenow < ppsrate){ temprate = ppsratenow; } else{ temprate = ppsrate; ppsstart = 0; ppsratenow = 0; } PSC = 50/temprate; temp = (48000000 / 256) / temprate / (50/temprate + 1) ; ARR = temp - 1; //48000000 / 51200 * para / (para / 100 +1); //para 秒 / 圈 频率 = SYSCLK / ( 256 * para) CCR2 = temp / 2; PSC = 256*(50/temprate + 1)-1; temp = (48000000 / 256) / temprate / (50/temprate + 1) ; ARR = temp - 1; CCR1 = temp / 2; 两个 TIMER 计数时钟是相同的,所以产生的脉冲是同相位的。但因为其中一个预先分频要慢细分数,所以产生中断的速度等于步进电机整步速度。这样中断的速度就降低了细分倍。如果对步数精度要求不高,可以将预分频倍数进一步提高,这样可以让电机转数步,才产生一个中断。