Go实现树莓派控制舵机

公式说明

毫秒(ms)是时间的单位,赫兹(Hz)是频率的单位,而DutyMax通常是一个PWM(脉冲宽度调制)信号中表示最大占空比的值。以下是它们之间的关系和一些相关公式:

  1. 频率(Hz)和周期(T): 频率是每秒周期性事件发生的次数。周期是频率的倒数,表示一个完整周期所需的时间。
    f=1/T, T=1/f 其中:

    • ( f ) 是频率,单位是赫兹(Hz)。
    • ( T ) 是周期,单位是秒(s)。
  2. 毫秒(ms)和周期(T): 毫秒是秒的千分之一,通常用于表示较短的时间间隔。
    Tms = T * 1000 其中:

    • ( Tms ) 是周期,单位是毫秒(ms)。
  3. 占空比(Duty Cycle): 占空比是PWM信号中高电平时间与整个周期时间的比例,通常以百分比表示。
    Duty Cycle = 高电平时间 / T * 100%

  4. DutyMax和占空比: 在某些库中,DutyMax可能代表PWM信号中最大的占空比值,用于设置PWM的占空比。在代码中,DutyMax可能是一个数值,用于表示100%的占空比。例如,如果DutyMax是255,那么一个50%的占空比将是127.5(DutyMax / 2)。

  5. 设置特定时间的占空比: 如果你想设置一个特定的高电平时间(例如2.5ms),你需要首先计算出这个时间对应的占空比,然后将其转换为PWM信号中的数值。 [
    Duty= 高电平时间ms/ Tms * DutyMax

    其中:

    • Duty 是PWM信号中的占空比数值。
    • Tms 是周期,单位是毫秒(ms)。

举个例子,如果频率是50Hz,那么周期T是20ms。如果你想要一个2.5ms的高电平时间,占空比计算如下:
Duty Cycle = 2.5ms/20ms * 100% = 12.5 %

如果DutyMax代表100%的占空比,并且是255(这是一个常见的值,用于8位PWM信号),那么对应的Duty数值将是:

Duty= 12.5%*255/100% = 31.875

在实际应用中,你可能需要将这个值四舍五入到最接近的整数,因为PWM的占空比数值通常是整数。

线路连接

在这里插入图片描述

实物连接图
在这里插入图片描述

代码

main.go

/*
getDutyCycle: 涉及的公式频率f单位赫兹 = 1/T周期T单位秒 = 1/fTms = 1/f * 1000Duty Cycly = (Th / T) * 100% => Th指高电平时间Duty = Thms/Tms * DutyMax
*/
func getDutyCycle(ms float64, hz int32) gpio.Duty {return gpio.Duty(((ms * float64(hz)) / 1000) * float64(gpio.DutyMax))
}
func main() {if _, err := host.Init(); err != nil {log.Fatalf("failed to initialize host: %v", err)}// 获取GPIO引脚,这里以GPIO18为例pin := gpioreg.ByName("GPIO27")if pin == nil {log.Fatalf("failed to open GPIO pin")}if err := pin.PWM(0, 50*physic.Hertz); err != nil {log.Fatalf("failed to set PWM: %v", err)}
/*占空比 = t / T 相关参数如下:
t = 0.5ms —————— 舵机会转到 -90 °
t = 1.0ms —————— 舵机会转到 -45°
t = 1.5ms —————— 舵机会转到 0°
t = 2.0ms —————— 舵机会转到 45°
t = 2.5ms —————— 舵机会转到 90°
*/duty := getDutyCycle(0.5, 50) //gpio.Duty(int32(float64((gpio.DutyMax / 20)) * 0.5))fmt.Println("DUTY1111111111: ", uint32(gpio.Duty(int32(float64((gpio.DutyMax/20))*0.5))))fmt.Println("DUTY===", uint32(duty), pin.PWM(duty, 50*physic.Hertz))time.Sleep(time.Second)duty = getDutyCycle(1, 50) //gpio.Duty(int32(float64((gpio.DutyMax / 20)) * 0.5))fmt.Println("DUTY===", uint32(duty), pin.PWM(duty, 50*physic.Hertz))time.Sleep(time.Second)duty = getDutyCycle(1.5, 50) //gpio.Duty(int32(float64((gpio.DutyMax / 20)) * 0.5))fmt.Println("DUTY===", uint32(duty), pin.PWM(duty, 50*physic.Hertz))time.Sleep(time.Second)duty = getDutyCycle(2, 50) //gpio.Duty(int32(float64((gpio.DutyMax / 20)) * 0.5))fmt.Println("DUTY===", uint32(duty), pin.PWM(duty, 50*physic.Hertz))time.Sleep(time.Second)duty = getDutyCycle(2.5, 50) //gpio.Duty(int32(float64((gpio.DutyMax / 20)) * 0.5))fmt.Println("DUTY===", uint32(duty), pin.PWM(duty, 50*physic.Hertz))time.Sleep(time.Second)
}

Note

需要sudo运行, 否则报错,例如 : bcm283x-gpio (GPIO27): bcm283x-dma not initialized; try again as root?

参考

RPi Low-level peripherals
Raspberry Pi hardware

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零开始学习Linux(6)----进程控制

1.环境变量 环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,我们在编写C/C代码时,链接时我们不知道我们链接的动态静态库在哪里,但可以连接成功,原因是环境变量帮助编译器进行查找,环境变量通常具有…

/proc/modules文件

/proc/modules文件中列出了内核加载的所有模块的信息,与使用lsmod命令类似。 第一列:模块名称 第二列:模块使用的内存大小,单位是bytes 第三列:模块被load的次数 第四列:是否有其他模块依赖此模块&#…

Android 系统省电软件分析

1、硬件耗电 主要有: 1、屏幕 2、CPU 3、WLAN 4、感应器 5、GPS(目前我们没有) 电量其实是目前手持设备最宝贵的资源之一,大多数设备都需要不断的充电来维持继续使用。不幸的是,对于开发者来说,电量优化是他们最后才会考虑的的事情…

论文笔记:仅一个进程故障就无法达成共识

仅一个进程故障就无法达成共识 仅一个进程故障指的是在异步的分布式系统中 摘要 异步系统的共识问题(consensus)涉及一组进程,其中有的进程可能不可靠(unreliable)。共识问题要求可靠的进程一致地从两个侯选中决定&…

揭秘电子杂志制作流程,从零开始

​随着数字媒体的发展,电子杂志已经成为一种新型的传播媒介。今天,我将为你揭秘电子杂志的制作流程,带你从零开始,轻松入门。 第一步:确定主题和内容 在开始制作电子杂志之前,你需要确定一个主题&#xff…

实时追踪维修进度,报修管理小程序让你省心又省力!

随着生活、工作节奏的日益加快,日常的售后报修、故障报修处理流程给我们带来种种困扰。我们都知道大多数企业、个人用户还在使用传统报修方式,如电话报修、纸质报修单等方式,不仅效率低下,而且难以追踪维修进度,给我们…

思维导图怎么画?6个软件轻松教你自己画出思维导图

思维导图怎么画?6个软件轻松教你自己画出思维导图 思维导图是一种用来展示思维结构、组织信息和解决问题的图形化工具。它以中心主题为核心,通过分支节点展开相关子主题,形成树状结构,帮助用户更清晰地理解和表达思想。下面介绍的六款软件可…

RedisTemplate操作Redis详解之连接Redis及自定义序列化

连接到Redis 使用Redis和Spring时的首要任务之一是通过IoC容器连接到Redis。为此,需要java连接器(或绑定)。无论选择哪种库,你都只需要使用一组Spring Data Redis API(在所有连接器中行为一致):…

商务分析方法与工具(十):Python的趣味快捷-公司财务数据最炫酷可视化

Tips:"分享是快乐的源泉💧,在我的博客里,不仅有知识的海洋🌊,还有满满的正能量加持💪,快来和我一起分享这份快乐吧😊! 喜欢我的博客的话,记得…

无尘室手套的选定标准

无尘室手套的选定标准主要包括以下几个方面: 材料选择: 考虑与应用的相容性,例如某些化学品可能对某些材料产生反应。是否存在乳胶过敏也是一个重要的考虑因素。常见的选择包括丁腈手套,它们通常比乳胶手套更耐用且化学稳定性更…

01-02-5

1、单链表中按位置查找 a.原理 通过传递的位置,返回该位置对应的地址,放到主函数定义的指针变量中。 我们认为位置从:有数据的节点开始计数 即如下结构: 查找位置,就是返回该位置对应的空间地址。 b.代码说明 Ⅰ…

【送书福利第七期】你好!Java(文末送书)

文章目录 编辑推荐内容简介作者简介目录前言/序言 编辑推荐 适读人群 :程序员;相关院校师生 本书以轻松幽默的语言,从零开始介绍Java语言。书名来源于编程语言中最经典的Hello World程序,寓意带读者从入门到精通。 书中每章都设有总结与扩展…