相信这个东西很多人都见过,大佬做的一个机器人
大部分人都是在关注功能本身,只有我看上了这个改装的小舵机。因为市面上的舵机只能接收PWM信号,进行角度控制。
这就有问题了。
在这种情况下我们只能发送指令,让舵机运动,却不能接收指令,从而知道它的运动状态。同时,想要让舵机进行反驱,就必须能让舵机随时进行输出力矩的切换。小驱动器支持IIC总线通信,PID闭环控制,位置回传,还能设置最大的输出力矩,断电储存参数等。
更加详细的一些内容在readme里面
魔改后的舵机通过I2C接口和控制板进行通信,STM32F4的控制板为主机,舵机为从机。通信的过程始终是主机发起的,主机首先下发位置、参数等指令,然后即时取回相关数据完成一个通信来回。
每个舵机作为从机接收两个地址的指令:自己的ID号,以及0号广播。广播用于在没有给舵机设置地址的时候作为通配地址使用(比如你刚烧写完舵机固件,此时舵机的Flash是没有储存自己的ID的,只能通过0号地址通信)。
值得注意的是:舵机和主机的上电需要有先后顺序,一定要先让从机初始化完成开始监听数据,再让主机发送指令!
如果主机发送指令的时候从机不响应,或者多个舵机地址相同同时响应,都可能引起通信错误,因此需要保证上述的顺序。
由于硬件上主机和舵机上电都是同时的,所以在主机的固件代码中,有一个延时2S的代码(其实可以不用那么久),就是等待舵机都上电初始化完成再开始通信。
调试的时候,一个舵机一个舵机调试,注释掉其他未连接的舵机的通信代码,不然也会造成轮询等待超时。
舵机指令的含义
大概的样子
改装后的样子
在库里面,我画图的地方是舵机库的位置
一开始的话就看fw这个就行,下面是用较为低级的一个库写的。
单独的keli工程
终于里面的芯片是这样的,舵机马达的驱动IC
IC简单的介绍
DK是右边的,方便调试和下载,量产的时候就用前面的就行。
右边就是我们的驱动IC了
这是两个版本的正反面
当然AD里面可以拿到两个
LP2992
两版的原理图
这个就是LDO,输入的是5V,输出就3V3
这个驱动芯片需要5V
3,4是PWM的脚
内部的框图
这个是控制的真值表
这个是预定的一些参数
典型波形图
舵机的话,就使用这样的原理图
这个是main文件
但是具体的实现是在CPP文件里面
这个主控文件,就是这么简单
在一开始会声明两个对象,一个舵机,一个板子的配置
在这个类里面,他包装了一下舵机的信息,包括实现的PID功能
这些就是共有的接口
私有的变量,命名清晰赞一个
设置要转的角度
设置是否开启舵机
设置转矩的设置
输入是是位置和值
这个就是PWM的输出函数
放大一点看
这个库函数的参数
定时器的句柄,
2.已经被配置好的定时器通道,
3.要对比的寄存器值
电机的转速是和PWM的占空比成正比的。
PWM波的生成
生成的原理
这里就是使用了两个定时器
下面是4个定时器的通道
还记得板子的断电信息存储的功能吗?这就是储存数据
在每次上电后,都会取里面的数据
判断目前的配置情况
进行数据的赋值
把取到的数据都放在motor的类里面,以便于后面的使用,最后一个就是装载完成。
初始化两个PWM的通道
然后这才开始初始化IIC硬件
就是一段代码了,应该是很简单的
IIC的寄存器就是这些了
使用7位模式
最后的三行代码
在从模式下接收一定量的数据,在非阻塞模式下使用中断 。
param hi2c 指向 I2C_HandleTypeDef 结构的指针,该结构包含 * 指定 I2C 的配置信息。
param pData 指向数据缓冲区的指针
param Size 要发送的数据量 * @retval HAL 状态
200HZ下获取数据
频繁的判断,舵机要工作的模式
对电压的测量是使用的回调函数
接下来是大段的协议封装
也就是我们的中断回调函数
会先来判断一下HAL的状态
这是要发送和接受的I2C数组
看右边
自己看这个数组的顺
使用的是switch的结构来解读信息
当这个信息是0x01的话,
会从这里的进行一个数据的组装
TX万事了RX,安排发送
最后是一个控制数据的发送,从ADC读取,接着是angle角度的计算,把角度给PID的函数处理,平滑轨迹,最后设置PWM。
代码还是看的有点粗,还有很多的细节没有写,但是学到的东西已经很多了。
不过多数是这样的。。。确实很强的大佬~
https://github.com/peng-zhihui/ElectronBot
https://www.tech-harry.cn/archives/4511
https://item.szlcsc.com/145106.html
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !