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

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

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的PWM
import time
from pyb import Pin, Timer
tim = 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    //决定使用的初始脉宽值百分比。
目录
相关文章
|
传感器
Arduino光敏传感器控制LED灯亮度
Arduino光敏传感器控制LED灯亮度
|
8月前
51单片机实现led灯亮度变化!
51单片机实现led灯亮度变化!
84 0
|
存储 编译器
单片机原理及其应用——单片机外部中断实验(八段数码管通过按键依次显示0~9数字)
单片机原理及其应用——单片机外部中断实验(八段数码管通过按键依次显示0~9数字)
单片机原理及其应用——单片机外部中断实验(八段数码管通过按键依次显示0~9数字)
STM32使用PWM脉冲呼吸灯
对于灯等来说有很多种方法,前面介绍了一些基础的点灯方法,比如直接点灯,按键控制点灯,按键中断点灯,但都是比较简单的一些方法也很基础,要问我有没有什么高级点的点灯方法,答案是有的,在这我要介绍一种高级点灯的方法就是使用PWM进行点灯。
198 0
STM32使用PWM脉冲呼吸灯
【单片机期中测试】10.利用定时器实现pwm呼吸灯
【单片机期中测试】10.利用定时器实现pwm呼吸灯
152 0
STM32使用PWM实现led亮度变化
STM32使用PWM实现led亮度变化
454 0
LabVIEW控制Arduino实现PWM呼吸灯(基础篇—5)
利用LIAT中的模拟I/O函数库,通过LabVIEW和Arduino Uno控制板实现LED灯亮度的调节,产生灯会呼吸的效果。
舵机应该如果选择?讲讲模拟舵机,数字舵机和总线舵机的区别
舵机应该如果选择?讲讲模拟舵机,数字舵机和总线舵机的区别
1180 0
|
IDE 开发工具
RA2E1两个灯交替闪烁
RA2E1两个灯交替闪烁
170 0
RA2E1两个灯交替闪烁