PCA9685芯片手册学习求教

概述

项目使用树莓派和PCA9685模块连接舵机进行控制,参照pca9685模块手册写了驱动代码,但是不能按照预期进行控制舵机。
现将代码提供,希望大佬能够指点一二。万分感激。

    %PCA9685 此处提供此类的摘要
    %   初始化输入参数:芯片地址默认(0x40),输出通道(ch),输出频率(freq)
    %   pwm输出参数:脉宽pulse_widthXCZ范围默认(500us,2500us),输出占空比(0-100)

    properties
        device
        i2cdevice
        bus='i2c-1' %设备连接到i2c-1
        address = '0x40' %设备地址默认0x40
        freq = 50 % 设置输出频率默认50Hz,周期20ms,最小24Hz,'0xff',最大1526Hz,'0x03'        duty=0 % 输出占空比
        delay=0 %无延时
    end
    properties(Access=private)
        MODE1 = 0x00
        MODE2 = 0x01
        SUBADR1 = 0x02
        SUBADR2 = 0x03
        SUBADR3 = 0x04
        ALLCALLADR=0x05
        LED0_ON_L=0x06
        LED0_ON_H=0x07
        LED0_OFF_L=0x08
        LED0_OFF_H=0x09
        ALL_LED_ON_L = 0xFA
        ALL_LED_ON_H = 0xFB
        ALL_LED_OFF_L = 0xFC
        ALL_LED_OFF_H = 0xFD
        PRE_SCALE = 0xFE
    end
    properties
        precaleval = 25e6
        alpha=1 %修正系数
    end

    methods
        function obj = PCA9685(mypi,bus,address)
            % 构造一个PCA9685对象,类似i2c sensor
            % 定义i2c地址。
               obj.device=mypi;
               obj.i2cdevice=i2cdev(obj.device,bus,address);
               obj.bus=bus;
               obj.address = address; 

        end

        function setPWMFreq(obj,value)
            oldmode=readRegister(obj.i2cdevice,obj.MODE1); % 读MODE1寄存器
            %检查bit7(RESTART)是1则清空bit4(SLEEP),延时1000us

            newmode=bitor(bitand(oldmode,hex2dec('7f')),hex2dec('10'));% SLEEP mode
            writeRegister(obj.i2cdevice,obj.MODE1,newmode);% set bit4(SLEEP)
            % tic;
            % for t=0.001:0.001:1/1000
            %     while toc<t
            %     end
            % end 
            pause(5e-3);
            %wait 1ms
            writeRegister(obj.i2cdevice,obj.MODE1,bitor(oldmode,hex2dec('a1')));
            obj.freq=value;
            prescale=round(obj.precaleval/(4096*obj.freq*obj.alpha))-1; %计算填入寄存器的值
            writeRegister(obj.i2cdevice,obj.PRE_SCALE,prescale,'uint16')%填入寄存器
            newmode=bitset(newmode,5,0); % Normal mode
            writeRegister(obj.i2cdevice,obj.MODE1,newmode);% 置于正常模式

        end

        function setAngle(obj,ch,angle)
            %ch为通道号[0,15]
            %setPWMDuty(ch,duty)
            %ch是通道号0-15

                cycle=1000/obj.freq;
                min_led_on_time=round(4096/cycle*500e-6);
                max_led_on_time=round(4096/cycle*2500e-6);
                led_off_time=min_led_on_time+round((max_led_on_time-min_led_on_time)*angle/180);
                writeRegister(obj.i2cdevice,obj.LED0_ON_H+ch*4,bitshift(0,-8,"uint16"));
                writeRegister(obj.i2cdevice,obj.LED0_ON_H+ch*4,bitand(0,hex2dec('ff')));
                writeRegister(obj.i2cdevice,obj.LED0_OFF_H+ch*4,bitshift(led_off_time,-8,"uint16"));
                writeRegister(obj.i2cdevice,obj.LED0_OFF_H+ch*4,bitand(led_off_time,hex2dec('ff')));
            

        end
        function setPWMDuty(obj,ch,on,off)
            min_led_on=102;
            max_led_on=512;
            if off<min_led_on
                off=min_led_on;
            end
            if off> max_led_on
                off=max_led_on;
            end
            writeRegister(obj.i2cdevice,obj.LED0_ON_H+ch*4,bitshift(on,-8,"uint16"));
            writeRegister(obj.i2cdevice,obj.LED0_ON_H+ch*4,bitand(on,hex2dec('ff')));
            writeRegister(obj.i2cdevice,obj.LED0_OFF_H+ch*4,bitshift(off,-8,"uint16"));
            writeRegister(obj.i2cdevice,obj.LED0_OFF_H+ch*4,bitand(off,hex2dec('ff')));
        end

    end
endab

树莓派使用mypi=raspi创建,然后可以创建servos=PCA9685(mypi,‘i2c-1’,‘0x40’),创建一个i2c设备,设备连接能够正常建立,按照舵机使用参考代码,led_off_time的范围是104~512,但是实际使用时感觉响应不按照预期。请求大佬帮助指点错误和修正方法。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/558082.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DDD领域设计基础

1概述 作为架构师&#xff0c;我们在业务建模的时候不能完全凭经验、感觉&#xff0c;还得有一套方法论&#xff0c;DDD领域驱动设计恰巧可以作为业务建模的方法论来使用。 2 为什么要使用DDD 2.1 为什么需要DDD 复杂系统设计&#xff1a;系统多&#xff0c;业务逻辑复杂&a…

四信遥测终端入选河南省水利先进实用技术推广目录

近期&#xff0c;河南省水利科技推广中心发布通知&#xff0c;四信自主研发的“遥测终端机RTU”&#xff0c;列入河南省水利先进实用技术推广目录&#xff0c;认定为水利先进实用技术。 四信遥测终端 F9164系列 ●一体化设计 ●工业级设计 ●接口丰富、标准易用 ●大容量储存空…

python爬虫 - 爬取微博热搜数据

文章目录 python爬虫 -爬取微博热搜数据1. 第一步&#xff1a;安装requests库和BeautifulSoup库2. 第二步&#xff1a;获取爬虫所需的header和cookie3. 第三步&#xff1a;获取网页4. 第四步&#xff1a;解析网页5. 第五步&#xff1a;分析得到的信息&#xff0c;简化地址6. 第…

代码随想录阅读笔记-回溯【全排列 II】

题目 给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序 返回所有不重复的全排列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,2]输出&#xff1a; [[1,1,2], [1,2,1], [2,1,1]] 示例 2&#xff1a; 输入&#xff1a;nums [1,2,3]输出&#xff1a;[[1,2,3],[1,…

JVM 性能调优命令(jps,jinfo,jstat,jstack,jmap)

常用命令&#xff1a;jps、jinfo、jstat、jstack、jmap jps jps查看java进程及相关信息 jps -l 输出jar包路径&#xff0c;类全名 jps -m 输出main参数 jps -v 输出JVM参数jps命令示例 显示本机的Java虚拟机进程&#xff1a; # jps 15729 jar 92153 Jps 90267 Jstat显示主类…

c 多文件编程

1.结构目录 声明类:用于声明方法,方便方法管理和调用&#xff1b; 实现类:用于实现声明的方法; 应用层:调用方法使用 写过java代码的兄弟们可以这么理解&#xff1a; 声明类 为service层 实现类 为serviceimpl层 应用层 为conlloter层 2.Dome 把函数声明放在头文件xxx.h中&…

外包干了7个月,技术退步明显。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入广州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

Spark01

Spark01 一. Spark概述二. Spark环境部署 - Local三. Spark环境部署 - Standalone1. Standalone集群概述2. Standalone环境部署3. 测试环境 四. Spark环境部署 - Standalone-HA1. 安装部署Zookeeper1. 下载2. zookeeper安装3. 配置StandAlone-HA集群 五. Spark On YARN -- 重点…

CSS 实现视差滚动效果

一、是什么 视差滚动&#xff08;Parallax Scrolling&#xff09;是指多层背景以不同的速度移动&#xff0c;形成立体的运动效果&#xff0c;带来非常出色的视觉体验 我们可以把网页解刨成&#xff1a;背景层、内容层、悬浮层 当滚动鼠标滑轮的时候&#xff0c;各个图层以不…

Nuclei 减少漏报的使用小技巧

在最近工作的渗透测试项目中发现Nuclei存在一个问题&#xff0c;就是相同的网站连续扫描多次会出现漏报的情况&#xff0c;此前没有注意过这个情况&#xff0c;所以写篇文章记录一下。 在此之前我的常用命令都是一把梭&#xff0c;有就有没有就继续其他测试 $ nuclei -u htt…

锂电池寿命预测 | Matlab基于GRU门控循环单元的锂电池寿命预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 锂电池寿命预测 | Matlab基于GRU门控循环单元的锂电池寿命预测 Matlab基于GRU的锂电池剩余寿命预测 基于GRU的锂电池剩余寿命预测&#xff08;单变量&#xff09; 运行环境Matlab2020及以上 锂电池的剩余寿命预测是…

【简单介绍下K-means聚类算法】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

​面试经典150题——从前序与中序遍历序列构造二叉树

​ 1. 题目描述 2. 题目分析与解析 二叉树的前序、中序和后序遍历 二叉树的前序、中序和后序遍历是树的三种基本遍历方式&#xff0c;它们是通过不同的顺序来访问树中的节点的。 前序遍历&#xff08;Pre-order traversal&#xff09;&#xff1a; 访问根节点 前序遍历左子树…

Linux-Stunnel介绍

1、定义 Stunnel是一个自由的跨平台软件&#xff0c;用于提供全局的TLS/SSL服务。针对本身无法进行TLS或SSL通信的客户端及服务器&#xff0c;Stunnel可提供安全的加密连接。该软件可在许多操作系统下运行&#xff0c;包括Unix-like系统&#xff0c;以及Windows。Stunnel依赖于…

15、ESP32 BLE

低功耗蓝牙&#xff1a; 低功耗蓝牙&#xff0c;简称 BLE&#xff0c;是蓝牙的省电版本。BLE 的主要应用是短距离传输少量数据&#xff08;低带宽&#xff09;。与经典蓝牙不同&#xff0c;BLE 始终保持睡眠模式&#xff0c;除非启动连接&#xff0c;这使得它消耗的功率非常低。…

智能设备订购如何使药品供应链受益

自从 Covid-19 大流行扰乱全球供应链以来&#xff0c;制药行业对增强弹性的需求变得比以往任何时候都更加重要。药品供应链已经开始数字化转型&#xff0c;采用新技术有助于确保药品和关键物资按时到达目的地并支持长期业务战略。其中一种解决方案是在移动设备上进行智能设备订…

在 Ubuntu 12.10 安装 wxPython

安装 wxPython 可以使用 pip 工具&#xff0c;但在 Ubuntu 12.10 上需要首先安装 wxPython 的依赖项。请注意&#xff0c;Ubuntu 12.10 已于2013年终止支持&#xff0c;建议升级到更高版本的 Ubuntu。以下是在 Ubuntu 12.10 上安装 wxPython 的一般步骤&#xff1a; 一、问题背…

HTML学习笔记:(二)框架实例

2、 框架实例 注意&#xff1a;frameset不能和body标签共存 <frameset>元素是用于创建框架页面的&#xff0c;它允许在一个浏览器窗口中显示多个HTML页面。然而&#xff0c;<frameset>是一种较旧的方式来构建网页&#xff0c;它不符合现代Web标准&#xff08;比如…

【VTKExamples::Meshes】第 十四期 ExtractEdges

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例ExtractEdges,并解析接口vtkExtractEdges,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~…

深入理解JAVA垃圾收集器CMS,G1工作流程原理 GC流程图 什么社会触发Minor GC?触发MinorGC过程。Full GC 过程。

java CMS&#xff0c;G1垃圾收集器工作流程原理浅析 JVM内存空间基础知识点&#xff08;基于JDk1.8&#xff09; 1.方法区&#xff1a;逻辑概念&#xff0c;元空间&#xff0c;方法区主要用于存储类的信息、常量池、方法数据、方法代码等。方法区逻辑上属于堆的一部分&#xf…