使用timer 产生脉冲波形,控制步进电机转动。当使用微步方式时,脉冲频率等于整步频率乘以细分数。有时,我们需要每步进行处理,也就是在发出脉冲时,产生中断。对于常用的双极步进电机,最快的速度大概是2000PPS,也就是一秒钟10圈。如果使用256细分,则输出脉冲频率为512K,这么高频率的中断,显然有问题。
有个方法,可以降低中断数量。
可以使用两个TIMER,其中一个用于产生电机控制脉冲。常规的办法是使用50%点空比的PWM脉冲。
另外不个设置为PWM无输出,预分频值为产生电机控制脉冲的细分倍。启动后产生中断。
void MOT_StartPPS(uint16_t para){</p>
uint16_t temp; TIM15->PSC = 99; temp = 0xFFFF ; TIM15->ARR = temp - 1; TIM15->CCR2 = temp / 2; TIM16->PSC = 256*100-1; temp = 0xFFFF; TIM16->ARR = temp - 1; TIM16->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; } TIM15->PSC = 50/temprate; temp = (48000000 / 256) / temprate / (50/temprate + 1) ; TIM15->ARR = temp - 1; //48000000 / 51200 * para / (para / 100 +1); //para 秒 / 圈 频率 = SYSCLK / ( 256 * para) TIM15->CCR2 = temp / 2; TIM16->PSC = 256*(50/temprate + 1)-1; temp = (48000000 / 256) / temprate / (50/temprate + 1) ; TIM16->ARR = temp - 1; TIM16->CCR1 = temp / 2; 复制代码
两个TIMER计数时钟是相同的,所以产生的脉冲是同相位的。但因为其中一个预先分频要慢细分数,所以产生中断的速度等于步进电机整步速度。这样中断的速度就降低了细分倍。如果对步数精度要求不高,可以将预分频倍数进一步提高,这样可以让电机转数步,才产生一个中断。
作者: southcreek, 来源:面包板社区
链接: https://mbb.eet-china.com/blog/uid-me-408807.html
版权声明:本文为博主原创,未经本人允许,禁止转载!
curton 2020-9-1 19:53