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


    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亦是如此。

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

    代码讲解

    Timer

    1. tim = Timer(4, freq=50) #设置频率,初始化定时器4,将其设置为50HZ,也就是说一个PWM周期为20ms
    2. 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 //通道1
    2. 2 //通道2
    3. 3 //通道3

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

    1. Timer.PWM // 配置PWM模式下的定时器(高电平有效)
    2. 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;

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

  • 相关阅读:
    10分钟让你熟练Python闭包
    被误解的Event Sourcing
    阿里自爆秋招面试笔记,福音来了
    TypeScript24:TS中的声明文件
    【微信小程序】view和scroll-view组件的基本使用
    Java回顾-反射
    linux,windows命令行输出控制指令,带颜色的信息,多行刷新,进度条效果,golang
    11.定时任务&定时线程池详解
    【算法题】2651. 计算列车到站时间
    【Leetcode】买卖股票系列
  • 原文地址:https://blog.csdn.net/qq_63922192/article/details/128055499