ElectronBot教程之数字舵机

描述

 

 

相信这个东西很多人都见过,大佬做的一个机器人

 

大部分人都是在关注功能本身,只有我看上了这个改装的小舵机。因为市面上的舵机只能接收PWM信号,进行角度控制。

 

这就有问题了。

在这种情况下我们只能发送指令,让舵机运动,却不能接收指令,从而知道它的运动状态。同时,想要让舵机进行反驱,就必须能让舵机随时进行输出力矩的切换。小驱动器支持IIC总线通信,PID闭环控制,位置回传,还能设置最大的输出力矩,断电储存参数等。

 

PWM

 

更加详细的一些内容在readme里面

 

魔改后的舵机通过I2C接口和控制板进行通信,STM32F4的控制板为主机,舵机为从机。通信的过程始终是主机发起的,主机首先下发位置、参数等指令,然后即时取回相关数据完成一个通信来回。

 

每个舵机作为从机接收两个地址的指令:自己的ID号,以及0号广播。广播用于在没有给舵机设置地址的时候作为通配地址使用(比如你刚烧写完舵机固件,此时舵机的Flash是没有储存自己的ID的,只能通过0号地址通信)。

值得注意的是:舵机和主机的上电需要有先后顺序,一定要先让从机初始化完成开始监听数据,再让主机发送指令!

如果主机发送指令的时候从机不响应,或者多个舵机地址相同同时响应,都可能引起通信错误,因此需要保证上述的顺序。

由于硬件上主机和舵机上电都是同时的,所以在主机的固件代码中,有一个延时2S的代码(其实可以不用那么久),就是等待舵机都上电初始化完成再开始通信。

调试的时候,一个舵机一个舵机调试,注释掉其他未连接的舵机的通信代码,不然也会造成轮询等待超时。

 

PWM

 

舵机指令的含义

 

PWM

 

大概的样子

 

PWM

 

改装后的样子

 

PWM

 

在库里面,我画图的地方是舵机库的位置

 

PWM

 

一开始的话就看fw这个就行,下面是用较为低级的一个库写的。

 

PWM

 

单独的keli工程

 

 

 

终于里面的芯片是这样的,舵机马达的驱动IC

 

PWM

 

IC简单的介绍

 

PWM

 

DK是右边的,方便调试和下载,量产的时候就用前面的就行。

 

PWM

 

右边就是我们的驱动IC了

 

PWM

 

这是两个版本的正反面

 

PWM

 

当然AD里面可以拿到两个

 

PWM

 

LP2992

 

PWM

PWM

 

两版的原理图

 

PWM

 

这个就是LDO,输入的是5V,输出就3V3

 

PWM

 

这个驱动芯片需要5V

 

PWM

 

3,4是PWM的脚

 

PWM

 

内部的框图

 

PWM

 

这个是控制的真值表

 

PWM

 

这个是预定的一些参数

 

PWM

 

典型波形图

 

PWM

 

舵机的话,就使用这样的原理图

 

PWM

 

这个是main文件

 

PWM

 

但是具体的实现是在CPP文件里面

 

PWM

 

这个主控文件,就是这么简单

 

PWM

 

在一开始会声明两个对象,一个舵机,一个板子的配置

 

PWM

 

在这个类里面,他包装了一下舵机的信息,包括实现的PID功能

 

PWM

 

这些就是共有的接口

 

PWM

 

私有的变量,命名清晰赞一个

 

PWM

 

设置要转的角度

 

PWM

 

设置是否开启舵机

 

PWM

 

设置转矩的设置

 

PWM

 

输入是是位置和值

 

PWM

 

这个就是PWM的输出函数

 

PWM

 

放大一点看

 

PWM

 

这个库函数的参数

 

PWM

 

  1. 定时器的句柄,

2.已经被配置好的定时器通道,

3.要对比的寄存器值

 

电机的转速是和PWM的占空比成正比的。

 

PWM

 

 

PWM波的生成

 

PWM

 

生成的原理

 

PWM

 

这里就是使用了两个定时器

 

PWM

 

下面是4个定时器的通道

 

PWM

 

还记得板子的断电信息存储的功能吗?这就是储存数据

 

PWM

 

在每次上电后,都会取里面的数据

 

PWM

 

判断目前的配置情况

 

PWM

 

进行数据的赋值

 

PWM

 

把取到的数据都放在motor的类里面,以便于后面的使用,最后一个就是装载完成。

 

PWM

 

初始化两个PWM的通道

 

PWM

 

然后这才开始初始化IIC硬件

 

PWM

 

就是一段代码了,应该是很简单的

 

PWM

 

IIC的寄存器就是这些了

 

PWM

 

使用7位模式

 

PWM

 

最后的三行代码

 

在从模式下接收一定量的数据,在非阻塞模式下使用中断 。

param hi2c 指向 I2C_HandleTypeDef 结构的指针,该结构包含 * 指定 I2C 的配置信息。 

param pData 指向数据缓冲区的指针 

param Size 要发送的数据量 * @retval HAL 状态

 

PWM

 

200HZ下获取数据

 

PWM

 

频繁的判断,舵机要工作的模式

 

PWM

 

对电压的测量是使用的回调函数

 

PWM

 

接下来是大段的协议封装

 

也就是我们的中断回调函数

 

PWM

 

会先来判断一下HAL的状态

 

PWM

 

这是要发送和接受的I2C数组

 

PWM

 

看右边

 

PWM

 

自己看这个数组的顺

 

PWM

 

使用的是switch的结构来解读信息

 

当这个信息是0x01的话,

 

PWM

 

会从这里的进行一个数据的组装

 

PWM

 

TX万事了RX,安排发送

 

PWM

 

最后是一个控制数据的发送,从ADC读取,接着是angle角度的计算,把角度给PID的函数处理,平滑轨迹,最后设置PWM。

 

代码还是看的有点粗,还有很多的细节没有写,但是学到的东西已经很多了。

 

 

 

不过多数是这样的。。。确实很强的大佬~

 

  •  
https://github.com/peng-zhihui/ElectronBot
  •  
https://www.tech-harry.cn/archives/4511
  •  
https://item.szlcsc.com/145106.html

  审核编辑:汤梓红


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分