1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
水下机器人之无刷电机电调控制——arduino使用millis()函数控时改变高低电平产生PWM信号
前言 当你想让代码在一个不变的时间间隔后执行时,你可以很简易的用delay()函数来实现。 但是,这只是让程序暂停一个特定的时间段。特别是如果你需要同时让处理器做其他处理时,这么做同时也是一种浪费。 回顾: 先让我们来看看原来的程序吧: 之前我们制作的水下机器人的简单工作思路是利用控制高低电平持续时间产生PWM信号,控制推进器运动。但是后来我们发现这个方法虽然可以控制推进器运动与调速,但是推进器程序运行过程中会占用整个程序大部分的时间(因为我们是用delay()函数来实现的,会让程序暂停在一个特定的时间段),导致其他程序未按预期执行。因此我们计划利用多线程(严格来说arduino是类多线程)来实现多段程序的同时处理,但是网上的多线程对于小白来说不太友好,最简单的多线程库SCoop也不知因什么原因无法使用(很多小白都出现这种情况)。 状态机(State Machine)思路 上面我们也说了,我们是通过使用delay()函数控制高低电平持续时间产生PWM信号,控制推进器运动。 既然delay()函数在使用过程中,它会霸占整个处理器,那么可不可以不用delay()延时函数,控制程序时间呢? 诶,你还别说,还真有! 这里就要引入一个状态机的概念了——State Machine 简单来说就是用变量记住了当前状态和前一次的状态。在每次loop时,程序通过millis()获取当前时间戳来判断是否需要改变的状态。 还不理解嘛?可以看看这篇文章——arduino定时器控制舵机_Arduino如何多任务(上) 这样一来我们的思路就清晰了:可以设置previousMillis变量和currentMillis变量,利用millis()函数获取当前的时间戳,并记录好当前的状态,每经过一段时间就改变高低电平的状态,达到控制pwm的目的。如下: 定时器中断思路 当然,除此之外,还有一种思路,就是不在程序端利用延迟产生PWM信号,而是通过FlexiTimer2库(定时器中断),利用板子里的定时器来让中断定时发生,可以精确控制时间,产生PWM信号。 在写程序之前,需要先在Arduino开发环境中导入一个库,即FlexiTimer2(网上还有一些其他的定时器的库,例如MsTimer2库),这个库可以在官网上下载。然后直接打开“项目—加载库—添加一个.ZIP库”。 这里需要特别说明的是,每一类型的Arduino开发板的中断引脚不同,Mega 2560开发板有2,3,21,20,19,18共六个中断引脚,而我们使用的arduino UNO就只有2,3两个中断引脚。 FlexiTimer2 Methods: 关于FlexiTimer2库这里不做详细讲解,详细请看官方文档: 简单来说: FlexiTimer2::set(unsigned long ms, void (*f)()) 设置定时器中断,(时长,中断函数); FlexiTimer2::start() 开始计时; FlexiTimer2::stop() 结束。 具体如何实现大家可以自己后续再思考思考。 后言 实际上想产生PWM的方法有很多,关键在于自己思考,这里由于时间和精力的原因不再过多阐述。 |
|
|
|
只有小组成员才能发言,加入小组>>
2435 浏览 0 评论
9100 浏览 4 评论
36773 浏览 19 评论
5026 浏览 0 评论
24745 浏览 34 评论
1528浏览 2评论
1743浏览 1评论
2193浏览 1评论
1553浏览 0评论
524浏览 0评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 20:44 , Processed in 1.208511 second(s), Total 76, Slave 60 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号