APP下载

基于keil软件的一体化螺丝刀控制器设计

2019-11-14王飞杜向阳

软件 2019年9期
关键词:螺丝刀串口分组

王飞 杜向阳

摘  要: 针对低压断路器产品生产效率低、可操作性差等系列问题,提出了基于keil软件的一体化螺丝刀控制器设计。基于Keil5(Keil uVision5)的软件平台及STM32f10x封装函数包,在搭建好实物装置的基础上,建立控制模型及编写控制系统的运行程序。编写的程序主要是在一体化螺絲刀装置上的各个传感器等设备的监测下,完成以STM32f103ZET6为主控芯片的控制器来控制相应步进电机的运行及电磁阀的开断配合,完成一个完整的轨迹运行。并将设计的程序进行仿真、实验调试。实验最终表明:该装置可以实现低压断路器高效率的生产且该设计的控制器可操作性强。

关键词 Keil5;控制模型;STM32f103ZET6;仿真模拟;实验调试

中图分类号: TP319    文献标识码 A    DOI:10.3969/j.issn.1003-6970.2019.09.017

本文著录格式:王飞,杜向阳. 基于keil软件的一体化螺丝刀控制器设计[J]. 软件,2019,40(9):75-80

Design of Integrated Screwdriver Controller Based on Keil Software

WANG Fei, DU Xiang-Yang

School of Mechanical and Automotive Engineering, Shanghai University of Engineering and Technology, Shanghai 201620, China

Abstract: For the series of low-voltage circuit breaker products with low production efficiency and poor operability, an integrated screwdriver controller design based on leil software is proposed. Based on Keil (Keil uVision5) software platform and STM32f10x package function package, based on the physical device, the control model and the running program of the control system are established. The main task of the prepared control program code is to complete the control of the corresponding stepper motor with STM32f103ZET6 as the main control chip under the monitoring of various sensors and other devices on the integrated screwdriver device (one angle control motor, two displacement control motors), a control of the torque nut motor), the designed program running code for simulation, experimental debugging. The experiment finally shows that the device can achieve high-efficiency production of low-voltage circuit breakers and the controller of the design is operability.

Key words: Keil5; Control model; STM32f103ZET6; Simulation; Experimental debugging

0  引言

ARM公司[1]在2005年收购keil公司后,于2013年10月推出了最新的开发环境Keil5。Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。Keil官网虽然没有发布中文版本,但是Keil系列软件[2-3]却被中国80%以上的软硬件工程师使用,说明该系统软件的强大,以及它的发展前景。

此软件开发系统的优点:Keil5生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。因此,借助集成开发环境Keil5,在以STM32f103ZET6为主控芯片的控制器[4-6]硬件平台来控制一体化螺丝刀装置运行,提高装置的工作

1  装置结构与硬件设计

该装置控制器是对塑壳断路器生产设备控制方式的改进。系统指令实现的载体,是控制系统功能得以实现的执行者,硬件的执行方式决定了程序控制的设计。首先,了解一体化螺丝刀装置的组成。然后,分析该装置主要执行部分,如驱动电机、电磁阀及传感器等,知道各个构件的运行規律,选择与控制器相连接的IO口。一体化螺丝刀装置的控制装置结构:4个步进电机(一个角度控制电机,两个位移控制电机,一个控制扭螺母电机)、两个电磁离合器、扭矩[7]传感器、移动框架、组合套筒等。Driver代表步进电机驱动器,SEN1~3是传感器和离合器的驱动模块,UART串口通信,与PC机相连接。其电路原理[8]图如图1所示。

装置运行原理。为了使塑壳断路器内部核心器件跳闸金属片都能在某一设定的时间内顶跳触头,断开电路完成任务。由此,设计了一体化螺丝刀旋紧装置。我们先假定一个顶跳时间,给跳闸金属片通电,随着温度升高,金属片变形。这时通过CCD相机对

金属片上的特定位置进行数据采集,经过AD转换及通讯总线传输给下位机,读取指令到处理器[9],通过MCU输出指令传递给各个输出引脚和驱动器模块。图2为一体化螺丝刀控制器的硬件执行过程与联系。

2  软件设计

2.1工程建立与分组关系

先在Keil5项目栏里新建工程模板。由于STM32[10-11]这种级别的MCU包含数百个寄存器,如果通过操作每个寄存器来设计一个控制系统,即困难又浪费时间,因此,我们借助ST(意法半导体)推出的官方固件库[12],建立自己的工程模板,然后按照自己的意愿设计自己的控制代码。打开MDK新建工程文件夹YTHLSD(一体化螺丝刀英文所写),然后在此文件夹下建立文件夹USER、HARDWARE、SYSTEM、CORE、FWLIB和README等。

USER分组负责存放代码工程文件,如USER分组下的main.c主要存放主函数,其中包含ST提供的stm32f10x_it.c用来定义中断函数,System_ stm32f10x.c用来初始化时钟函数等。HARDWARE分组存放外部硬件驱动函数,该设计包含了led.c、key.c、driver.c三个硬件驱动函数,如driver.c中调用stm32f10x_gpio.c中的函数对driver进行初始化,每一个.c源文件对应一个.h头文件。SYSTEM分组存放了一些ST提供的公用代码,包括:延时函数,IO口位操作、寄存器操作及串口相关函数,方便我们调用这些函数。CORE分组放置固件库启动文件和核心文件,通常不需要改动。FWLIB分组下存放着ST官方提供的外设固件库原文件和头文件,根据各自设计需求添加或删除,同样每个.c源文件对应一个.h头文件。README分组是整理程序设计过程中的一些注意事项,方便他人使用及问题查找。这些分组之间的结构联系如图3所示。

2.2  程序设计

以该装置控制系统的执行器件的控制过程与电路原理图为依据,如图3代码层次结构,Keil5开发软件为平台及STM32f10x封装函数包,设计程序[13]驱动代码。设计过程包括主函数的设计,子函数的调用等。设计过程:

(1)打开YTHLSD下USER分组内的main.c主函数。首先将ST提供的存放在SYSTEM分组下的底层驱动函数包含进来。其中包含的头文件:#include "sys.h"(定义了I/O口的输入和输出宏定义)、#include "usart.h"(串口初始化和中断的接收)、#include "delay.h"(实现系统延时功能)。然后,将HARDWARE分组下的外部硬件驱动函数包含进来。其中包含的头文件:#include "key.h"(外设按键驱动代码)、#include "led.h"(外设led驱动代码)、#include "drivers"(外设步进电机驱动代码)。最后,将USMART分组下的串口调试函数#include "usmart.h"(串口调试组件)包含进来。

(2)写主函数(int main (void))。主函数内包含的初始化函数有:延时(delaine())、中断设置(NVIC_ PriorityGroupConfig (NVIC_PriorityGroup_2))、串口(uart_init (115200))、USMART (usmart_dev.init(72))、按键(KEY_Init())、传感SEN_Init();LED端口(LED_ Init())、高级定时器(TIM8_OPM_RCR_Init (999, 72- 1))和步进电机驱动函数(Driver_Init())、两个关键字(u8 I; u8 keyval)。步进电机驱动器端口与控制板引脚的连接如表1。

(3)在while()循环里面设定函数之间的逻辑关系,首先按下WKUP_PRES,调用绝对定位函数Locate_Abs(0, 10000);电机回初始设定点,SEN1_ ACT和SEN2_ACT是调用电磁阀和步进电机的函数,Locate_Rle(100000, 10000, CW/CCW)为相对运动函数,代表频率设定值是10kHz,当第三个参数选CW时,顺时针发出100K个脉冲,选为CCW时逆时针发出100K个脉冲,驱动步进电机转动确定的角度。

完整的主程序为:

#include "sys.h"

#include "usart.h"

#include "delay.h"

#include "key.h"

#include "led.h"

#include "usmart.h"

#include "driver.h"

上面部分为程序设计的第一部分,宏定义的声明。

int main(void)

{

u8 i;

u8 keyval;

delay_init();

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

uart_init(115200);

usmart_dev.init(72);

LED_Init();

KEY_Init();

SEN_Init();

Driver_Init();

TIM8_OPM_RCR_Init(999, 72-1);

中间部分为程序设计的第二部分,定义关键字i、keyval,延时、中断、串口通信、串口调试、led灯、按键、传感外设、步进电机驱动、高级计数器TIM8等函数初始化,中断优先级分组设为2位抢占优先级2位相应优先级,串口波特率设为115200,usmart设晶振设为72MHz;TIM8初始化计数器向上计数,自动重装载值arr设为999,预分频值pos设为72-1。

while(1)

{

keyval=KEY_Scan(0);

if(keyval==WKUP_PRES)

{

Locate_Abs(0, 10000);

}    else if(keyval==SEN1_ACT)

{

Locate_Rle(100000, 10000, CW);

}

else if(keyval==SEN2_ACT)

{

Locate_Rle(100000, 10000, CCW);

}

delay_ms(10);

i++;

if(i==50)

{

i=0;

LED1=!LED1;

}

}

}

最后部分為程序设计的逻辑部分,在while()循环中,通过if语句来判断当前应该执行的函数语句,来控制电磁阀和步进电机动作。其中主要的子函数设计为步进电机的端口初始、中断及相关参数设置,其中核心部分为步进电机的驱动程序设计[14],包含相对运动和绝对运动。相对运动对应相对定位函数:

void Locate_Rle(long num, u32 frequency, DIR_ Type dir)

{

if(num<=0)

{

printf("\r\nThe num should be greater than zero!!\r\n");

return;

}

if(TIM8->CR1&0x01)

{

printf("\r\nThe last time pulses is not send finished, wait please!\r\n");

return;

}

if((frequency<20)||(frequency>100000))

{

printf("\r\nThe frequency is out of range! please reset it!!(range:20Hz~100KHz)\r\n");

return;

}

motor_dir=dir;

DRIVER_DIR=motor_dir;

if(motor_dir==CW)

target_pos=current_pos+num;

else if(motor_dir==CCW)

target_pos=current_pos-num;//

rcr_integer=num/(RCR_VAL+1);

rcr_remainder=num%(RCR_VAL+1);

is_rcr_finish=0;

TIM8_Startup(frequency);

}

相对定位函数中语句if(num<=0)表示没有脉冲产生,不执行下列程序语句,直接返回。if(TIM8-> CR1&0x01),代表上一次脉冲还未发送完成时,程序将直接返回初始位置。语句if((frequency<20)|| (frequency>100000))为脉冲频率不在20Hz~100KHz范围内时,直接返回初始状态。motor_dir=dir;和DRIVER_DIR=motor_dir;为得到和设置电机旋转方向。然后通过if-else判断步进电机正传还是反转,if(motor_dir==CW)则表示正传,将目标位置加上num的值作为步进电机的目标值,否则else if (motor_dir==CCW)反转,将目标位置减去num的值作为步进电机的目标值,rcr_integer和rcr_remainder分别为重复计数的整数部分和余数部分,其中每计数(RCR_VAL+1)次,中断一次。由于重复计数,所以要通过语句is_rcr_finish=0;声明一下计数未结束,并在最后开启高级定时器TIM8。

绝对定位函数设计如下:

void Locate_Abs(long num, u32 frequency)

{

if(TIM8->CR1&0x01)

{

printf("\r\nThe last time pulses is not send finished, wait please!\r\n");

return;

}

if((frequency<20)||(frequency>100000))

{

printf("\r\nThe frequency is out of range! please reset it!!(range:20Hz~100KHz)\r\n");

return;

}

target_pos=num;

if(target_pos!=current_pos)

{

if(target_pos>current_pos)

motor_dir=CW;

else

motor_dir=CCW;

DRIVER_DIR=motor_dir;

rcr_integer=abs(target_pos-current_pos)/(RCR_VAL+1);

rcr_remainder=abs(target_pos-current_pos)%(RCR_VAL+1);

is_rcr_finish=0;

TIM8_Startup(frequency);

}

}

绝对定位函数与相对定位函数基本相同。其中不同点为:target_pos=num;该语句是步进电机经过num个计数后的目标位置。接下来通过if(target_ pos!=current_pos),判断当前位置和目标位置是否相同。如果当前位置没有达到目标位置,即if(target_ pos>current_pos),则步进电机顺时针转动;否则else,步进电机逆时针转动。DRIVER_DIR=motor_ dir;作用为设定步进电机旋转方向,在头文件driver.h中定义为#define DRIVER_DIR PCout(0),表示選用的控制板引脚是PC0,输出PC0的状态。

3  仿真与试验分析

Keil5具备软件仿真[15]的强大功能,该功能的优点是能检查程序的正确性与可行性。通过debug工具栏里的逻辑分析窗口,进行IO口的仿真与实验分析。仿真之前,需要设置Options for Target窗口下的Target栏里的参数(芯片型号和晶振频率)。然后选择debug栏里的Use Simulator开启仿真器,选择Run to mian(),即直接从主函数开始运行仿真。Dialog DLL和Parameter设置如图4。

设置完毕后点击仿真按钮,选择逻辑分析,并在其仿真界面中建立信号。根据电路原理图,设置逻辑分析信号PA0、PE2、PE3、PB5、PE5、PC0、PC2和PC7,选择信号的输出方式为Bit,如PORTC& 0x00000004为基地址与第五位求与,只取第2位PORTC_2,其他全为0。然后右移2为,如果结果为低电平0则0x00000000,结果为高电平1则为0x00000001。其它端口分析同理。下图5以步进电机的IO接口信号为示例。

完成上述设置后。在功能区Peripherals下的通用输入输出接口下,设置PA.0为下拉输入,其电平状态对应复位按钮动作状态;设置PB.5和PE.5为推挽输出,作用为控制led;设置PE.2和PE.3为上拉输入,代表传感器的响应电平;设置PC.0为推挽输出,其输出电平控制电机的触发脉冲方向;设置PC.2为推挽输出,作用是使能驱动器;设置PC.7为复用推挽输出,输出高级定时器TIM8_CH2的PWM脉冲。

最后运行仿真,虽然上面我们设置了各个选定IO口的输出输入模式,但Keil5不会自动设置外部硬件的响应状态,因此需要手动设置相应的输入IO口状态来模仿外部硬件的状态。为模仿复位功能,

需手动设置PA.0为高电平,进行间隔为0.2秒的仿真。同时PC.2使能driver函数,板载led灯的绿灯开始闪烁,表示程序正常运行。PB.5一直为高电平,处于灭的状态,代表系统运行正常。然后,设置PE.2位高电平,代表外部传感器一(SEN1)动作。同PC.7开产生方波脉冲,当PE.2的电平恢复后,PC.7口的脉冲停止产生;设置PE.3为高电平,代表外部传感器二(SEN2)动作。PC.7产生的方波形式,原理同上,但方向发生改变。最后PE.2和PE.3电平均为低电平,方波停止产生系统运行完毕。控制系统仿真如图6。

4  结束语

设计根据电路原理图,以Keil5环境为主要平台,设计了一体化螺丝刀控制器。其中先建立工程模板,在建立的工程下设计自己的外设及内部系统的相关函数块,通过设置输入IO的电平状态,来模拟外部硬件的实际工作情况,证明了控制器可以完成指定的运动。并且自己所建立的工程,可以根据自己的需要添加自己需要的外部驱动函数,其灵活性、移植性强,节省了资源。对其外部指定函数做一定改动就可以应用到相类似的控制系统中,将提高产品的生产效益。

参考文献

[1] 王伟, 持续创新的ARM&中国的技术创新专访ARM公司中国区总裁谭军先生[J]. 电子技术应用, 2008(8).

[2] 马得秀, 韩佳奇, 赵铭, 逯玉兰. 基于51单片机的温室自动灌溉系统设计[J]. 软件, 2019, 40(05): 30-32.

[3] 张英梅, 傅仕杰. STM32的智能温室控制系统[J]. 软件, 2010, 31(12): 14-18.

[4] 陈玉楼, 单片机原理与应用技术[M]. 北京: 科学出版社, 2015.

[5] 李宁, 基于MDK的STM32处理器应用开发[M]. 北京: 北京航空航天大学出版社, 2008.

[6] 意法半導体, STM32中文参考手册, 第10版. 意法半导体(中国)投资公司, 2010.

[7] 刘汝斌, 程武山. 扭矩传感器在步进电机控制系统中的应用[J]. 仪表技术与传感器, 2012, (7): 1-3.

[8] 王波, 鞠飞. 电子电路仿真技术在电子应用开发中的运用[J]. 电子技术与软件工程, 2019(13): 74.

[9] 王燕东, 基于嵌入式实时系统的步进电机协同运动控制系统设计与实现[D], 河北工业大学, 2016.

[10] 常文泰, 张冉, 王利华, 张雷刚. 虚拟样机技术及虚拟样机试验[J]. 软件, 2016, 37(07): 84-88.

[11] 沈红卫, 任沙浦, 朱敏杰, 杨亦红, 卢雪萍,STM32单片机应用与全案例实践[M]. 电子工业出版社, 2017, 6(1): 62-70.

[12] 意法半导体, STM32F1开发指南库函数版V1.1. 意法半导体(中国)投资公司, 2010.

[13] 彭治国, 刘海浪, 陈辉金. 基于“卓越计划”C语言程序设计实验教学研究[J]. 装备制造技术, 2012(7).

[14] 谭浩强, C程序设计第四版[M]. 清华大学出版社, 2010, 6(4): 87-89, 115-120.

[15] 张玲, 晏伯武. 时序仿真和驱动编写在数字电路实践教学中的应用研究[J]. 软件, 2016, 37(03): 107-109.

猜你喜欢

螺丝刀串口分组
浅谈AB PLC串口跟RFID传感器的通讯应用
分组搭配
怎么分组
自制磁性螺丝刀
分组
实用的螺丝刀装置
USB接口的多串口数据并行接收方法探索
带螺丝刀的剪刀
基于蓝牙串口适配器的GPS接收机与AutoCAD的实时无线通信
基于并行控制的FPGA多串口拓展实现