一种STM32控制多路步进电机同步运行的控制系统及控制方法
技术领域
本发明涉及单片机控制系统领域,尤其涉及的是一种STM32单片机控制多路步进电机同步运行的控制系统及控制方法。
背景技术
在嵌入式控制领域里,步进电机是工业控制中的一种常用执行部件,具有控制灵活、价格低等优点,因而在许多设备和装置中常被采用。而对多个步进电机进行同步控制,传统的嵌入式解决方案是采用FPGA或CPLD等芯片。采用FPGA芯片虽然可以精确地对多路步进电机进行同时控制,但其成本高昂。由于单片机里的程序是一条条顺序执行的,对多个步进电机的控制也只能是一个紧接着一个顺序地进行。若要采用单片机实现对N个电机的同步控制,则要用N+1块单片机;其中的N块单片机负责单独驱动N个电机,另外的一块负责整体控制,通过串口命令对其他的N个电机进行控制,这样也可以达到同步控制的目的,但是非常浪费单片机资源。
因此,现有技术还有待于改进和发展。
发明内容
本发明的目的在于提供一种STM32控制多路步进电机同步运行的控制系统及控制方法,以解决现有技术中同步控制步进电机存在如下问题:
1.采用FPGA或CPLD等芯片虽然可以精确地对多路电机同时控制,但其成本高昂。
2.若要采用单片机实现对N个电机的同步控制则要用N+1块单片机,
非常浪费单片机资源。
本发明的技术方案如下:
一种STM32控制多路步进电机同步运行的控制系统,其中,包括一STM32单片机、步进电机驱动器和多路步进电机,所述STM32单片机和所述步进电机驱动器连接,步进电机驱动器驱动步进电机,单片机控制多路步进电机同步运行。
所述的STM32控制多路步进电机同步运行的控制系统,其中,所述每一路步进电机配置有一个用于复位的位置传感器。
所述的STM32控制多路步进电机同步运行的控制系统,其中,所述STM32单片机包括至少一组用于推挽输出的GPIO,GPIO连接所述步进电机驱动器,驱动电平信号经比较放大后输出到多路步进电机上。
所述的STM32控制多路步进电机同步运行的控制系统,其中,所述STM32单片机还包括外部中断,所述外部中断配置为上拉输入并和所述位置传感器连接,用于接收电机复位信号。
所述的STM32控制多路步进电机同步运行的控制系统,其中,所述STM32单片机还包括定时器,所述定时器用于产生某一频率的时钟信号,控制电机运行的步数和运行的速度。
所述的STM32控制多路步进电机同步运行的控制系统,其中,所述STM32单片机还包括一与外界通讯的RS232串口。
一种STM32控制多路步进电机同步运行的控制方法,其中,包括以下步骤:
步骤a:单片机主函数执行电机初始化函数,对连接到步进电机的GPIO端口进行初始化,并根据具体应用来设定定时器的频率;
步骤b:根据用户需求,调用用户需求的步进电机运行函数,将相应电机的运行参数通过全局变量传递到定时器中断函数中,在中断函数里设置对应电机的开关、电机速度等参数;
步骤c:若有电机运行函数被调用,则触发定时器中断函数,执行步骤d操作,否则执行步骤m操作。
步骤d:如果第一路步进电机函数有调用,执行步骤e操作,否则执行i操作。
步骤e:在定时器内,打开对应电机的开关,再根据对应电机的速度参数值设置需要等待的定时器时钟个数;
步骤f:在没有触发到位传感器的情况下,执行步骤g操作;否则执行步骤h操作。
步骤g:电机先加速运行,达到指定的速度后开始匀速运行,在最后预计的步数内做减速运动,最后停止在预定的位置上,然后跳转至步骤i执行操作。
步骤h:电机减速到用户预设值后,再反向运行一定步数。
步骤i:程序进入下一个电机的执行函数入口。
步骤j:如果第二路电机函数有调用,执行步骤e-h操作;否则执行步骤i操作。
步骤k:如果第三路电机函数有调用,执行步骤e-h操作;否则执行步骤i操作。
步骤l:直至最后第N路电机函数被调用,程序重复步骤e-h操作;否则执行步骤m操作。
步骤m:退出定时器中断函数,返回主程序执行。
所述的STM32控制多路步进电机同步运行的控制方法,其中,在步骤a中,所述定时器的频率设置为40K。
本发明的有益效果:本发明利用单片机的定时器资源模拟FPGA里的CLK时钟信号,把定时器中断函数里的代码执行时间近似成一个时刻点(相对于低速的步进电机),来模拟FPGA的并行执行效果,对多路电机进行同步控制,控制灵活,成本低。
附图说明
图1是本发明中STM32控制多路步进电机同步运行的控制系统电路图。
图2是本发明中单片机的主程序流程图。
图3是本发明中单片机中串口中断流程图。
图4是本发明中定时器的中断函数流程图。
具体实施方式
为使本发明的目的、技术方案及优点更加清楚、明确,以下参照附图并举实施例对本发明进一步详细说明。
参阅图1,本发明提供一种STM32控制多路步进电机同步运行的控制系统,其中,包括一STM32单片机1、步进电机驱动器2和多路步进电机3,所述STM32单片机1和所述步进电机驱动器2连接,步进电机驱动器驱动步进电机3,单片机控制多路步进电机3同步运行。
进一步地,所述每一路步进电机3配置有一个用于复位的位置传感器31。在本发明中,步进电机用于照相机或其他成像设备的镜头、机身的自动对焦、电子变焦,位置传感器31用于准确探测步进电机3的准确位置以使步进电机3精确复位。
进一步地,所述STM32单片机1包括若干用于推挽输出的GPIO11,GPIO11连接所述步进电机驱动器2,驱动电平信号经比较放大后输出到多路步进电机3上。
进一步地,所述STM32单片机还包括外部中断12,所述外部中断12配置为上拉输入并和所述位置传感器31连接,用于接收步进电机3的复位信号。
进一步地,所述STM32单片机1还包括定时器13,所述定时器13用于控制步进电机运行的步数。步进电机3收到一个脉冲,需要延时大约250微秒才能运行,如果步进电机3接收到的脉冲频率过快则会造成步进电机3不能启动。在本实施例中,定时器13频率设定为40K,定时器中断函数每隔25微秒就会被调用一次。
进一步地,所述STM32单片机1还包括一个与外界通讯的RS232串口14。
参阅图2,图2是单片机主程序流程图,单片机上电后开始对串口、GPIO、定时器以及外部中断进行初始化。初始化完成后复位步进电机3,若是步进电机3没有检测到位置传感器31程序将停止前进并提示错误信息,否则程序进入到一个主循环。在该循环里,程序每隔5毫秒获取消息队列中的消息,如消息队列为空,没有获得命令,则等待5毫秒后继续获取;如果获取到的消息不为空,则执行相应的命令。如果命令执行成功,等待5毫秒后继续重复如上操作;如果命令执行失败,再次尝试执行,如果尝试3次后都失败,丢弃该命令并提示错误信息。
图3是串口中断函数流程图,串口14初始化完成后串口中断函数就可响应外部事件。当串口14收到命令后,中断函数首先对命令做解析,解析完毕后把命令存放到消息队列中通知主函数读取,然后跳转到主函数里。
参阅图4,本发明还提供一种STM32单片机控制多路电机同步运行的控制方法,其中,包括以下步骤:
步骤a:单片机主函数执行电机初始化函数,对步进电机进行初始化,根据具体应用来设定定时器的频率,在本实施例中,由于电机的运行的最高频率为4K,因此设置定时器频率为40K,留有供电机加减速的调节的余地;
步骤b:根据用户需求,调用用户需求的步进电机运行函数,将相应电机的运行参数通过全局变量传递到定时器中断函数中,在中断函数里设置对应电机的开关、电机速度等参数;
步骤c:若有电机运行函数被调用,则触发定时器中断函数,执行步骤d操作,否则执行步骤m操作。
步骤d:如果第一路步进电机函数有调用,执行步骤e操作,否则执行i操作。
步骤e:在定时器内,打开对应电机的开关,再根据对应电机的速度参数值设置需要等待的定时器时钟个数;
步骤f:在没有触发到位传感器的情况下,执行步骤g操作;否则跳转至步骤h执行操作。
步骤g:电机先加速运行,达到指定的速度后开始匀速运行,在最后预计的步数内做减速运动,最后停止在预定的位置上,然后跳转至步骤i执行操作。
步骤h:电机减速到用户预设值后,再反向运行一定步数。
步骤i:程序进入下一个电机的执行函数入口。
步骤j:如果第二路电机函数有调用,执行步骤e-h操作;否则执行步骤i操作。
步骤k:如果第三路电机函数有调用,执行步骤e-h操作;否则执行步骤i操作。
步骤l:直至最后第N路电机函数被调用,程序重复步骤e-h操作;否则执行步骤m操作。
步骤m:退出定时器中断函数,返回主程序执行。
虽然实质上单片机并非严格意义上的同时发送脉冲给多路步进电机3,而是按照先后顺序对各路步进电机3发送脉冲,但由于单片机执行一条指令时间大约十几到几十纳秒,相对于低速运行的步进电机(脉冲间延时至少需要250微秒)而言,整个中断函数里的所有代码可以认为在同一时刻完成的,再加上中断函数每隔25微秒执行一次,所以可以等效成FPGA的并行效果。本发明利用单片机的定时器资源模拟FPGA里的CLK同步时钟信号,把定时器中断函数里的代码执行时间近似成一个时刻点(相对于低速的步进电机),来模拟FPGA的并行执行效果,对多路电机进行同步控制,控制灵活,成本低。
当然,本发明控制多路步进电机同步运行的控制系统及方法不仅仅应用于STM32单片机,本发明同样可以应用于其他型号的单片机。
应当理解的是,本发明的应用不限于上述的举例,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,所有这些改进和变换都应属于本发明所附权利要求的保护范围。