最近在做一个项目,中间有个软件的要求是使用一个mcu来实现控制三个步进电机,于是我就想,若是对这三个步进电机的控制引脚分别进行配置等操作代码的整体结构会变得十分繁琐,我能不能用类似于stm32标准库那样的写法,就是通过typedef来定义一个结构体,这个结构体中包含了我所控制的对象的所有的属性,在需要实现对对象的控制时,只需要来通过给这个结构体的不同成员传递参数,然后调用提前写好的初始化的函数,就很快的完成了不同的电机控制的初始化配置,后面需要其他功能也是基于这个结构体去进行扩展。想到这里,我不禁想到了之前了解过的一个词语叫“面向对象编程(OOP)”,后来想来两者也确实有一定的相似之处,且看本篇文章的介绍。
一、分析并确定控制一个步进电机需要哪些MCU资源
最简单的情况下情况下,步进电机的驱动会带有一个使能引脚(EN)、一个步数引脚(STP)、一个方向引脚(DIR),其中使能引脚与方向引脚都是通过高低电平来控制电机的运动,而步数引脚则是需要通过输出一定脉冲数的pwm波来控制步进电机的运动。分析至此,我们可以基本确定需要的基本资源如下:
使能GPIO,普通GPIO,模式选择为推挽输出模式即可
方向GPIO,普通GPIO,模式选择为推挽输出模式即可
单片机定时器的某通道对应的GPIO口,定时器模式可选择为pwm输出模式或者输出比较模式(我选的是输出比较模式)
二、确定三个结构体
在这里我定义了三个结构体,一个是Step_Motor_Init_Struct,此结构体用于对控制电机的引脚进行一定的初始化配置,其成员包含了控制电机所用的GPIO和PIN和TIM等等;第二个结构体是Motor_Acc_Aata,此结构体主要是为了服务后边的电机控制的加减速算法而用,主要与算法相关,此处不过多介绍;第三个结构体Step_Motor_Struct,这个结构体在包含前两个结构体的前提下又新增了关于电机运动状态相关的众多成员变量,这些成员可以用作以后在控制算法中的状态机的实现。具体的配置情况如下图:
补充:此处还对步进电机运动状态和方向的情况定义了两个枚举型变量,如下图
三、具体的函数实现
此处以初始化函数为例,讲解具体的函数实现思路
如图所示,初始化函数传入的参数是初始化结构体的指针,在对不同的结构体配置的情况下能够实现不同的配置情况,这样我们可以实现一套代码来控制多个相同属性的对象,这有点类似于OOP中“封装性”的实现。(此处只展示部分的初始化函数,其余的部分都是调用stm32标准库的一些初始化函数对我们要控制的对象进行初始化)。
实际使用流程是:先定义一个Step_Motor_Init_Struct的结构体变量,将这个结构体的各个成员赋值之后,再调用初始化函数即可(如下图示例)。
四、总结
这种写法通过结构体封装状态 + 函数操作结构体,同时管理多个电机时,每个电机的状态通过各自的 Step_Motor_Struct 实例隔离,但是由于 C 语言本身不支持继承和多态,且缺乏访问控制,因此不能称为严格的面向对象编程,更准确地说,是基于结构化编程的 “对象式” 封装。
最后,各位有什么别的看法,不妨在评论区讨论一二。
————————————————
版权声明:本文为CSDN博主「laplace_gjn」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/2301_80796910/article/details/150118012
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
|