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

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

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

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

    PARTNER CONTENT

    文章评论1条评论)

    登录后参与讨论

    curton 2020-9-1 19:53

    支持  非常好
    相关推荐阅读
    southcreek 2025-01-22 06:34
    设置可执行程序图标
    在本文的示例中,图标文件名称为“logo.ico”,该文件位于项目主目录下。2.2 设置标题栏图标通过下列函数设置标题栏图标:setWindowIcon(QIcon("://logo.ico"));1...
    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文件的格式如下,这个文件可以事先编写。也可以在程序中生成。有一个大类,下面有一个小类使用等号设...
    我要评论
    1
    30
    关闭 站长推荐上一条 /3 下一条