使用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