原创 降低步进电机微步控制中断频率

2020-8-29 08:30 888 6 5 分类: MCU/ 嵌入式

使用timer 产生脉冲波形,控制步进电机转动。当使用微步方式时,脉冲频率等于整步频率乘以细分数。有时,我们需要每步进行处理,也就是在发出脉冲时,产生中断。对于常用的双极步进电机,最快的速度大概是2000PPS,也就是一秒钟10圈。如果使用256细分,则输出脉冲频率为512K,这么高频率的中断,显然有问题。

有个方法,可以降低中断数量。

可以使用两个TIMER,其中一个用于产生电机控制脉冲。常规的办法是使用50%点空比的PWM脉冲。

使用两个TIMER,其中一个设置为PWM输出,另外不个设置为PWM无输出

 

void MOT_StartPPS(uint16_t para){

  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

版权声明:本文为博主原创,未经本人允许,禁止转载!

文章评论1条评论)

登录后参与讨论

curton 2020-9-1 19:53

支持  非常好
相关推荐阅读
southcreek 2020-12-02 16:42
触摸屏数字键盘的实现方法
基本思路是使用一个图片,定义图片上各个按键的相对位置以及文本框的相对位置。定义键盘的尺寸 当需要显示键盘时,将图片画出来。 当触屏按下时,计算按下的位置,进行相应操作。 所有按键的尺...
southcreek 2020-11-27 14:08
均值滤波前的数据离散性判断
求数据平均值时,增加方差计算,判定数据是否稳定未被干扰 单片机A/D采集到的数据需要滤波,防止有噪声。各种方法,平均值,中值不一而足。滤波前,应该对数据做一些判断,防止数据源本身错误,使滤波结果...
southcreek 2020-11-02 10:10
电磁兼容 EFT整改
机器做EFT测试故障,表现为液晶显示段错误,数码管闪,传感器异常。综合表现指向在施加 ±2000V 脉冲周期 100KHZ  分别注入 L N PE L+N L+PE N+PE后5V供电被干...
southcreek 2020-10-13 09:53
NTC 热敏电阻线性化
NTC热敏电阻其阻值随温度变化,公式如下: 其中T为温度,Rref 为 25度时的标称值,Tref 为 25度,实际上这些温度都应该加上 273.15 转换为开氏温度。 B 参数是...
southcreek 2020-09-24 12:06
STM32 串口 DMA方式接收数据及数据处理方法
通常我们都使用中断方式接收串口数据。用DMA方式接收,效率会更高。先在CUBE中设置一下。使用UART DMA接收功能,并使用 Circular模式。收到的数据将循环放在缓冲区里。 #def...
southcreek 2020-09-08 09:10
matlab 生成 测温电阻 Rt表
由B值可以推导出不同温度t下的电阻值 R = R0 * exp(B*(1/t - 1/T0)); 其中 R为温度 t 下的电阻值 R0 为25度时的电阻值 T0 为25度...
广告
我要评论
1
6
1
2
3
4
5
6
7
8
9
0
广告
关闭 热点推荐上一条 /5 下一条