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

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

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

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

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

另外不个设置为PWM无输出,预分频值为产生电机控制脉冲的细分倍。启动后产生中断。

 

  1. void MOT_StartPPS(uint16_t para){</p>
  2. uint16_t temp;
  3. TIM15->PSC = 99;
  4. temp = 0xFFFF ;
  5. TIM15->ARR = temp - 1;
  6. TIM15->CCR2 = temp / 2;
  7. TIM16->PSC = 256*100-1;
  8. temp = 0xFFFF;
  9. TIM16->ARR = temp - 1;
  10. TIM16->CCR1 = temp / 2;
  11. 。。。。。。
  12. HAL_TIM_PWM_Start(&htim15,TIM_CHANNEL_2);
  13. HAL_TIM_PWM_Start_IT(&htim16,TIM_CHANNEL_1);
  14. }

对于较高的速度,需要斜坡启动,所以将PWM脉冲重复频率设置为最慢,启动PWM输出,同时启动另一个TIMER的中断输出(这里我们只要中断,不要输出)。

随后在程序中,定时运行步述代码,逐步将频率提高,直到达到设定值。

  1. if(ppsstart == 1){
  2. if((mscnt % SLOPINT)==0){
  3. ppsratenow += SLOPINCPPS;
  4. if(ppsratenow < ppsrate){
  5. temprate = ppsratenow;
  6. }
  7. else{
  8. temprate = ppsrate;
  9. ppsstart = 0;
  10. ppsratenow = 0;
  11. }
  12. TIM15->PSC = 50/temprate;
  13. temp = (48000000 / 256) / temprate / (50/temprate + 1) ;
  14. TIM15->ARR = temp - 1; //48000000 / 51200 * para / (para / 100 +1); //para 秒 / 圈 频率 = SYSCLK / ( 256 * para)
  15. TIM15->CCR2 = temp / 2;
  16. TIM16->PSC = 256*(50/temprate + 1)-1;
  17. temp = (48000000 / 256) / temprate / (50/temprate + 1) ;
  18. TIM16->ARR = temp - 1;
  19. TIM16->CCR1 = temp / 2;

两个TIMER计数时钟是相同的,所以产生的脉冲是同相位的。但因为其中一个预先分频要慢细分数,所以产生中断的速度等于步进电机整步速度。这样中断的速度就降低了细分倍。如果对步数精度要求不高,可以将预分频倍数进一步提高,这样可以让电机转数步,才产生一个中断。

作者: southcreek, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-408807.html

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

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

curton 2020-9-1 19:53

支持  非常好
相关推荐阅读
southcreek 2024-12-04 16:32
PWM输出隔离DAC设计
这个设计的目标是产生一个隔离的DAC输出。12V供电,产生0~5V的输出。达到10000约13.3位的分辨率。要求DAC输出在改变设置后1S内能稳定。需要能长时间保持稳定和低噪声。能达到要求的DAC只...
southcreek 2024-12-04 15:23
一个基于HAL库的串口控制框架
将串口接收配置为 DMA方式,DMA 使用 DMA_CIRCULAR 模式工作。串口接收的数据实际上构成循环队列。 定义一个结构Comm_typedef 结构体中包含指向接收到的第一字节位置chrc...
southcreek 2024-07-08 11:38
接地不良导致的故障分析
这个电路的控制板需要连接显示板和识别板。5V 供电和串行控制连到显示板,显示板再连接到识别板。识别板上电位器使用一个LDO供电,将输入的5V转成3.3V。当电位器滑动时,输出电压在0~3.3V之间。...
southcreek 2024-06-26 09:15
【EMC整改】带辅助加热的滴速控制器辐射抗扰整改
这个滴速式的输液泵使用一个红外线发射和接收装置,当有液滴通过时,会扰动检测信号,识别这个扰动检测到液滴滴下,获得滴壶中的液滴速度,调整阀门大小,实现输液速度控制。控制器还配备一根加热条,用于输液时对药...
southcreek 2024-06-06 08:52
QT 使用QSettings 操作ini文件配合表格操作
这个项目可以演示 使用QSetting 读取或写入 ini文件。并使用tablewidget 显示。Ini文件的格式如下,这个文件可以事先编写。也可以在程序中生成。有一个大类,下面有一个小类使用等号设...
southcreek 2024-05-27 16:18
差分输入ADC的单端到差分转换器驱动设计
单端信号需要转换成差分信号,以便使用ADC进行转换。这个就所谓的ADC驱动电路。需要的结果为Vp = Vcm + Vi/2Vn = Vcm – Vi/2这样 Vp – Vn = Vi使用简单的加法器和...
EE直播间
更多
我要评论
1
30
关闭 站长推荐上一条 /3 下一条