OpenMV输出PWM,实现对舵机控制

article/2025/8/18 18:21:13

OpenMV的定时器官方函数介绍:Timer类 – 控制内部定时器

目录

OpenMV的PWM资源介绍

为什么要用OpenMV输出PWM

OpenMV的PWM资源分配

资源

注意 

建议

PWM输出代码

代码讲解

Timer

Timer.channel

tim.channel与Timer.channel区别

Timer.channel解析


OpenMV的PWM资源介绍

为什么要用OpenMV输出PWM

OpenMV有9个外接IO可以供我们使用,很多时候我们只是把OpenMV当成一个图像识别的工具,这样并没有充分利用他的资源

OpenMV的9个IO口中6个可以输出PWM,而且控制方法特别简单。在我们进行比赛过程中,可能要对物块进行颜色识别并且抓取,我比较推荐使用OpenMV做出颜色识别之后,控制机械臂抓取物体。这样减少了主控的负担,充分利用了资源。由于OpenMV的PWM输出极其简单,也减少了工作量

注意:我们这里只会讲解输出PWM的部分,关于OpenMV的定时器编码器模式,比较模式和捕获模式需要自行研究

OpenMV的PWM资源分配

资源

OpenMV的PWM资源如下

注意 

定时器1不能作为PWM输出口,在官方文档里面说了定时器(1)用于摄像头,所以不能动用定时器1

 如果我们动用了定时器1,会报错

建议

因为我们只能使用6个IO输出PWM,然后P4P5是要用于与主控进行串口通讯的。所以刚好可以使用4个PWM输出,正好可以使用四轴机械臂。如果机械臂多于4个舵机,慎用!!!

PWM输出代码

OpenMV其实就是一个STM32的单片机,相信绝大多数打比赛的人都是使用的STM32F103进行的入门学习。我们都知道,STM32可以进行硬件PWM的输出,他的1个定时器有4个通道。每个通道都能输出PWM。OpenMV亦是如此。

# PWM 控制例子
#
# 这个例子展示了如何使用OpenMV的PWMimport time
from pyb import Pin, Timertim = Timer(4, freq=50) #设置频率,初始化定时器4,将其设置为50HZ,也就是说一个PWM周期为20ms
Tim = Timer(2, freq=50) #设置频率,初始化定时器2,将其设置为50HZ,也就是说一个PWM周期为20ms# 生成50HZ方波,使用TIM4,channels 1,2,3分别是 5% , 10% ,15占空比。
tim.channel(1, Timer.PWM, pin=Pin("P7"), pulse_width_percent=5)
tim.channel(2, Timer.PWM, pin=Pin("P8"), pulse_width_percent=10)
tim.channel(3, Timer.PWM, pin=Pin("P9"), pulse_width_percent=15)# 生成50HZ方波,使用TIM2,channel  1,2,3分别是 20% , 25% ,30占空比。
Tim.channel(1, Timer.PWM, pin=Pin("P6"), pulse_width_percent=20)
Tim.channel(4, Timer.PWM, pin=Pin("P5"), pulse_width_percent=25)
Tim.channel(3, Timer.PWM, pin=Pin("P4"), pulse_width_percent=30)while (True):time.sleep_ms(1000)

代码讲解

Timer

tim = Timer(4, freq=50) #设置频率,初始化定时器4,将其设置为50HZ,也就是说一个PWM周期为20ms
Tim = Timer(2, freq=50) #设置频率,初始化定时器2,将其设置为50HZ,也就是说一个PWM周期为20ms

(1)我们看这个代码很简单,就是说,现在定时器4的PWM输出频率为50HZ。

(2)什么是HZ,1HZ表示1S变化一次,如果是50HZ,表示1S变化50次,1/50s=20ms。那么现在一个PWM周期为20ms

(3)现在对tim的控制,就是对以50HZ跳变的定时器4控制。Tim是对以50HZ跳变的定时器2控制。

Timer.channel

tim.channel与Timer.channel区别

因为之前tim = Timer(4, freq=50),那么现在tim就是Timer类,通俗来说现在tim就是Timer。而tim.channel现在就可以理解为Timer.channel。同理Tim.channel可以理解为Timer.channel

Timer.channel解析

我们只讲PWM有关部分!

我们先看官方手册的解释:

 (1)这个表明,我们必须传入通道变量channel。这个值可以是如下:

1  //通道1
2  //通道2
3  //通道3

(2)之后还可以传入参数mode。 可选参数有多个,我只讲PWM部分!

Timer.PWM            // 配置PWM模式下的定时器(高电平有效)
Timer.PWM_INVERTED   //配置PWM模式下的定时器(低电平有效)

(3)callback ,这个是设置定时器中断里面的函数的。不用管他

与PWM无关,不解释。想了解的自行学习!

(4) pin ,设置PWM输出我引脚。比如我想让定时器2的通道3输出PWM,就写成pin=Pin("P4")。大写字母P

个人建议使用pulse_width_percent因为这样可以直观的设置占空比是多少。比如我们要设置占空比为50%,就可以写成pulse_width_percent=50;

pulse_width            //决定使用的初始脉宽值。
pulse_width_percent    //决定使用的初始脉宽值百分比。


http://chatgpt.dhexx.cn/article/d8ZC0FmI.shtml

相关文章

舵机控制原理及常见问题

舵机控制 工作电压:3.5V/4,2V/4.8V —— 6V/6.8V/7.2V/8.4V(看具体型号参数) 切记:舵机不要接在电脑USB上调试,舵机启动瞬间大电流(10-24倍工作电流)可能会导致电脑死机 注意事项:PWM波形正确时&#xf…

第9章 舵机控制

有一种电机可以在程序的控制下,在一定范围内连续改变输出轴角度并且可以保持住。这种电机最早被用在航模和船模等遥控模型中,控制各种舵面的转动,这就是舵机。现在舵机除了运用在 遥控模型中,也大量的运用在各种机器人、机械臂的关…

Arduino入门001 - 舵机控制

Arduio基础入门篇001 - 舵机控制 一、舵机介绍 1,结构组成 一般来讲舵机主要由以下几个部分组成,舵盘、减速齿轮组、位置反馈电位计、直流电机、控制电路等。舵机的输入线共有三条,如图1所示,红色中间,是电源线&…

舵机控制(STM32F103C8T6)

前言 本文是以STM32F103C8T6作为主控芯片,通过PB6端口输出PWM,实现控制180舵机。 一、舵机控制原理 (一)概述 舵机是一种位置伺服驱动器器,是一种带有输出轴的小装置。当我们向伺服器发送一个控制信号时,…

Java 源代码怎么执行的

许多 Java 虚拟机的执行引擎在执行 Java 代码的时候都是解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码执行)混合运行。 大体流程为: 编写 java 文件源码通过 javac 编译器将 java 源码编译为字节码流…

Java基础-java程序代码截取字符串及判断字符串是否包含某个字符(串)

文章目录 有一串字符串,是一串拼接码,如何截取获取想要的字段?判断字符串是否包含某个字符(串)indexOf方法 有一串字符串,是一串拼接码,如何截取获取想要的字段? public class Inte…

编写高质量JAVA程序代码的建议

--------------------------------------------------------------------------------------------------- 前言:原著《改善JAVA程序的151个建议》有151个建议,我在拜读的过程根据自己的理解合并了其中的几个,并将每个建议的核心要义进行了一…

java简单记事本代码_简单记事本的java程序代码

展开全部 天啊, 冖_Na0 为什么会有62616964757a686964616fe4b893e5b19e31333262343038我编的记事本代码呢???呵呵……你肯定是“请教”过我的吧?? 呵呵……我自己编了一个,不过呢,没…

IntelliJ IDEA 写java程序代码

快捷键 注释 单行:选中代码 ctrl/ 再来一次就是取消 多行:选中代码 ctrlshift/ 再来一次就是取消 格式化 CtrlAltL

Android studio如何运行java程序代码

先看Java程序类 public class GGG {public static void main(String[] args) {System.out.println("我是java程序");} }就是这么简单的一个java程序,在之前studio上可以直接运行,但是像现在升级studio后就发现运行报错: 首先java…

怎样使用lntelliJ IDEA 编写Java程序代码?

下面使用IDEA创建一个Java程序,实现在控制台上打印HelloWorld!的功能,具体步骤如下。 1.创建Java项目 进入New Project界面后,单击New Project选项按钮创建新项目,弹出New Project对话框,如下图所示。 New Projeet 对…

Java学习代码合集

其实我学习java最根本的原因是:我是一个挺关注外在的人,虽然是个程序员,所以我很喜欢写出那些带有漂亮的界面的程序,因为C总是控制台,我不是很喜欢,在这份java代码合集中,我会记录自己学习Java界…

Java开发常用代码

一.获取UUID UUID uuid UUID.randomUUID(); String str uuid.toString(); // 去掉“-” String s str.replaceAll("-", "");二.获取固定格式的时间字符串 第一种 //获取当前时间对象 Date d new Date(); //创建日期格式化类对象,”yyyy/MM/dd HH:mm…

一个简单的Java例程

编写一个程序,输出如下: 1.在IDEA中新建一个helloworld类,注意Java中严格区分大小写 2.在文件中添加如下代码: 源代码如下: public class helloworld{public static void main(String[] args){System.out.println(&q…

Python3读取大文件的方法

Python3读取大文件的方法 1. 方法一:利用yield生成器2. 方法二:利用open()自带方法生成迭代对象,这个是一行一行的读取3. 二者的比较 1. 方法一:利用yield生成器 def readPart(filePath, size1024, encoding"utf-8"):w…

大文件处理(上传,下载)思考

文件处理一直都是前端人的心头病,如何控制好文件大小,文件太大上传不了,文件下载时间太长,tcp直接给断开了😱😱😱等 效果 为了方便大家有意义的学习,这里就先放效果图,如…

python拆分大文件(大文件分割)

python拆分大文件 前言实现过程实验结果 前言 在工作中常常会遇见一些大文件,由于内容太多,使用比如记事本、notePad等软件也打不开,无法查看内容,最好是将整个文件进行拆分,分开处理,现在处理的文件原本是…

如何快速地向服务器传大文件,大文件如何快速传输

在这个互联网时代,信息更新速度逐渐加快。用户在进行文件传输时,一定是希望既稳定又快速的,并且还能够保证安全。但是通常来讲,FTP文件传输并不能同时实现这三点的,特别是上传大文件时,FTP上传文件速度明显…

Linux - 怎么实现大文件传输

一 前言 博文《PageCache》中介绍了 PageCache 的优缺点,其实在处理大文件中 PageCache 作用反而没有那么好。所以本文介绍 Linux 是怎么处理大文件的。 二 起因 首先看一下一个 read() 系统调用流程发生了什么,如下图: 当调用 read 方法时…

如何快速传输大文件:4 种大文件传输有效的方法

文件大小正在爆炸式增长,随之而来的挑战是如何仍然以快速、安全的方式发送。从这个意义上说,弄清楚如何快速传输大文件似乎是一项几乎不可能完成的任务。随着工作流程不断适应数字化,这对于自由职业者、业余视频编辑、后期制作公司和广播公司…