stm32 IIC 协议控制PCA9685舵机驱动板

stm32 IIC 协议控制PCA9685舵机驱动板这篇教程与网上的大部分教程都不相同 着重讲述如何使用编程 PCA9685 而不是着重讲述原理 最后你还是一头雾水 这是一篇教你如何如何输出固定舵机角度 如何移植程序 从 PCA9685 的原理到如何移植的教程 在动手中学习理论 单片机型号 stm32f103c8t 使用 stm32 来控制一个舵机并不是难事 但是如果控制多个舵机 那硬件资源就显得捉襟见肘了 因此 必须使用神器 PCA9685 了 相信你能主动上网搜索 PCA9685 也一定知道 PCA9685 是多牛了 我就不去转述了 老规矩 将源码呈上

        这篇教程与网上的大部分教程都不相同,着重讲述如何使用编程PCA9685,而不是着重讲述原理,最后你还是一头雾水。这是一篇教你如何如何输出固定舵机角度,如何移植程序,从PCA9685的原理到如何移植的教程,在动手中学习理论。

stm32 IIC 协议控制PCA9685舵机驱动板

单片机型号:stm32f103c8t6

使用stm32来控制一个舵机并不是难事,但是如果控制多个舵机,那硬件资源就显得捉襟见肘了。

因此,必须使用神器,PCA9685了,相信你能主动上网搜索PCA9685,也一定知道PCA9685是多牛了,我就不去转述了。

我们从整体的keil工程来看一下:

stm32 IIC 协议控制PCA9685舵机驱动板

        我们需要注意的无非是两个文件,一个是IIC驱动文件,一个是PCA9685的驱动文件,进行移植的话,只要把这两个.C文件和对应的.h文件放到你的工程目录中,即可完成函数的调用,就这么简单? 对,就这么简单。接下来我们详细看一下PCA9685的驱动函数,以及讲解一下PCA9685函数的功能。

void pca_setfreq(float freq)//设置PWM频率 { u8 prescale,oldmode,newmode; double prescaleval; freq *= 0.92; prescaleval = ; prescaleval /= 4096; prescaleval /= freq; prescaleval -= 1; prescale =floor(prescaleval + 0.5f); oldmode = pca_read(pca_mode1); newmode = (oldmode&0x7F) | 0x10; // sleep pca_write(pca_mode1, newmode); // go to sleep pca_write(pca_pre, prescale); // set the prescaler pca_write(pca_mode1, oldmode); delay_ms(2); pca_write(pca_mode1, oldmode | 0xa1); }

        我们都知道舵机是在20ms周期的脉冲中产生一个0.5-2.5ms的脉冲进行控制的,PCA9685驱动中需要手动对舵机控制频率进行设置, 用的就是图上的这个函数,这个函数的具体原理需要参考手册,在这里不讲这些原理,你只要把这个函数直接拿去用,就可以了。

stm32 IIC 协议控制PCA9685舵机驱动板

        我们设置了频率,也要对占空比进行配置,这样舵机才能按照不同的角度进行控制,LED0_ON_L、LED0_ON_H、LED0_OFF_L、LED0_OFF_H+4这些是PCA9685的IIC地址,由于我们在这里只用到这一个模块,所以取的首地址,再往下看,num、on和off变量,num为模块的通道号,比如控制0号通道,控制1号通道,2号通道等等,取决于你的模块上连了几个舵机,以及你想用哪个舵机,on和off这两个变量是用来配置占空比的。

        on:pwm上升计数值0-4096;off:pwm下降计数值0-4096,一个pwm周期分成4096份。

        由0开始+1计数,计到on时跳变为高电平,继续计数到off时,跳变为低电平,直到计满4096重新开始。所以当on不等于0时,可作为延时,当on等于0时,0ff/4096的值,就是pwm的占空比。

        最后我们看一下舵机通道和角度控制函数,以及函数中一些参数是怎么计算来的。

void Servo_angle(u8 num,u8 angle) { u32 off = 0; off = (u32)(158+angle*2.2); pca_setpwm(num,0,off); }

         这个函数主要功能是控制通道号和舵机旋转角度,其中一句off = (u32)(158+angle*2.2)有很多同学看不明白,158和2.2是如何得来的?

在这里我们举个例子:

以转到60度为例:

60度对应的脉宽 = 0.5ms+(60/180)*2(2.5ms-0.5ms) = 1.1666ms

换算成占空比= 1.1666ms / 20ms = off /4096,off = 239,50hz对应周期为20ms。

setPWM(num,0,239);

看到这里大家应该就明白158是怎么算的了,参考上面的239,就可以计算出158对应的占空比。

PS:0°对应的值大约为130,180°对应的值为530,最大为590.

158+angle *2.2 = 360.

这样我们就可以按照自己想法来定义舵机输出通道和角度了。

stm32 IIC 协议控制PCA9685舵机驱动板

工程中有一个doc文件,对程序中的一些难点加了一些解释和计算过程,希望能帮到大家。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/207549.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午1:38
下一篇 2026年3月19日 下午1:38


相关推荐

  • [双向链表排序]—-对双向链表中结(节)点的成员排序(冒泡排序)「建议收藏」

    [双向链表排序]—-对双向链表中结(节)点的成员排序(冒泡排序)「建议收藏」双向链表

    2022年10月11日
    4
  • c++语言入门教程–-17结构体

    c++语言入门教程–-17结构体

    2021年3月12日
    232
  • CORBA介绍

    CORBA介绍CORBA CommonObject 通用对象请求代理体系结构 是在当今快速发展的软件与硬件资源的情况下发展出的一种新技术 它可以让分布的应用程序完成通信 无论这种应用程序是什么厂商生产的 只要符合 CORBA 标准就可以相互通信 CORBA1 1 于 1991 年由 OMG 提出 同时还提出了接口定义语言 InterfaceDef

    2026年3月26日
    3
  • tomcat java_maven和java有什么区别

    tomcat java_maven和java有什么区别缓存什么是缓存[Cache]存在内存中的临时数据将用户经常查询的数据放在缓存(内存)中,用户去查询数据的时候就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。为什么使用缓存减少和数据库的数据交换次数,较少系统开销,提高系统效率什么样的数据库能使用缓存经常查询并且不经常改变的数据Mybatis缓存MyBatis 内置了一个强大的事务性查询缓存机制,它可以非常方便地配置和定制。默认情况下,只启用了本地的会话缓存,它仅

    2022年8月9日
    6
  • linux下解压rar文件的方法

    linux下解压rar文件的方法
      wgetlinux-3.8.0.tar.gz”>http://www.rarlab.com/rar_CN/rarlinux-3.8.0.tar.gz
      tarxzvfrarlinux-3.8.0.tar.gz
      cdrar
      makeinstall
      rarxfile.rar
      注意:rar目录中的rar文件就是可执行文件,如果没有makeinstall的权限,可以将rar放到PATH环境变量指定的目录中,直接运行r

    2022年7月11日
    18
  • 什么是公网IP和内网IP?NAT转换又是什么鬼?[通俗易懂]

    什么是公网IP和内网IP?NAT转换又是什么鬼?[通俗易懂]https://www.jianshu.com/p/4cd76e25b8941、引言搞网络通信应用开发的程序员,可能会经常听到外网IP(即互联网IP地址)和内网IP(即局域网IP地址),但他们的区别是什么?又有什么关系呢?另外,内行都知道,提到外网IP和内网IP就不得不提NAT路由转换这种东西,那这双是什么鬼?本文就来简单讲讲这些到底都是怎么回事。1、每台电脑都必须要一个公网IP吗?答案:不是。我们都知道,IPv4中的IP地址的数量是有限的(所以现在都在搞IPv6嘛),每..

    2022年5月29日
    42

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号