完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
本次所介绍的是伺服电机模块,主要参考《基于ARM Cortex-M3的STM32系列嵌入式微控制器应用实践》内的对机器人的伺服电机模块的控制。本书作者依照对机器人的伺服电机控制讲的从简入深,简明易懂。
作者先介绍了机器人可以前后左右的移动,这里所说的机器人其实就是一个小车。对于它的巡航动作中,必须先知道两个车轮如何转圈,例如小车向前走,那么从左边看,小车的轮子是逆时针旋转,也就是伺服电机就是逆时针旋转,从右边看,小车的轮子是顺时针旋转,伺服电机就是顺时针旋转喽。 再一个需要知道,单片机给引脚发送的高电平时间决定了伺服电机的速度与方向,当中可以加入for循环,而for循环的参数控制了发送给电机的脉冲数量,而每一个脉冲的时间是相同的,所以for循环也控制伺服电机的运行的时间, 下面给出的是小车向前走3s的程序,是的!没错,就是3s,时间很短,现在这一点就不用讲,先把程序看懂。 #include"stm32f0x_heads.h" #include"HelloRobot.h" int main() { intcounter; BSP_Init();//开发板初始化 USART_Configuration(); for(counter=0;counter<130;counter++)//运行3s { GPIO_SetBits(GPIOD,GPIO_Pin_10);//左侧电机逆时针旋转 delay_nus(1700); GPIO_ResetBits(GPIOD,GPIO_Pin_10); GPIO_SetBits(GPIOD,GPIO_Pin_9);//右侧电机顺时针旋转 delay_nus(1300); GPIO_ResetBits(GPIOD,GPIO_Pin_9); delay_nus(20); } while(1); } 通过程序就可以知道小车可以向前运行,整个for循环执行130次,大约需要3s,就可以知道小车向前运行3s。先不管运行多短,看懂程序才是王道。时间只是修改一个数字而已,但面临的问题是由于小车的运动惯性的问题,小车会在程序停止后,还会向前运动,会使小车不稳定。 还会有这样的疑问,为什么会设为1700与1300,首先要告诉的就是1700是电机逆时针运行的最大速度,而1300是顺时针运行的最大速度。所以可以知道要使电机停止,应该为多少呢?对,就是1500,这个数值能尽量使小车停止,即毫无疑问就可以使小车减速。 下面我们我们编写一下使小车向前,向后,左转,右转的程序: #include"stm32f0x_heads.h" #include"HelloRobot.h" int main() { intcounter; BSP_Init();//开发板初始化 USART_Configuration(); for(counter=0;counter<=65;counter++)//向前跑 { GPIO_SetBits(GPIOD,GPIO_Pin_10);//左侧电机逆时针旋转 delay_nus(1700); GPIO_ResetBits(GPIOD,GPIO_Pin_10); GPIO_SetBits(GPIOD,GPIO_Pin_9);//右侧电机顺时针旋转 delay_nus(1300); GPIO_ResetBits (GPIOD,GPIO_Pin_9); delay_nus(20); } for(counter=0;counter<=26;counter++) //向左转跑 { GPIO_SetBits(GPIOD,GPIO_Pin_10);//左侧电机顺时针旋转 delay_nus(1300); GPIO_ResetBits (GPIOD,GPIO_Pin_10); GPIO_SetBits(GPIOD,GPIO_Pin_9);//右侧电机顺时针旋转 delay_nus(1300); GPIO_ResetBits (GPIOD,GPIO_Pin_9); delay_nus(20); } for(counter=0;counter<=26;counter++) //向右转跑 { GPIO_SetBits(GPIOD,GPIO_Pin_10);//左侧电机逆时针旋转 delay_nus(1700); GPIO_ResetBits (GPIOD,GPIO_Pin_10); GPIO_SetBits(GPIOD,GPIO_Pin_9);//右侧电机逆时针旋转 delay_nus(1700); GPIO_ResetBits (GPIOD,GPIO_Pin_9); delay_nus(20); } for(counter=0;counter<=65;counter++) //向后跑 { GPIO_SetBits(GPIOD,GPIO_Pin_10);//左侧电机顺时针旋转 delay_nus(1300); GPIO_ResetBits (GPIOD,GPIO_Pin_10); GPIO_SetBits(GPIOD,GPIO_Pin_9);//右侧电机逆时针旋转 delay_nus(1700); GPIO_ResetBits (GPIOD,GPIO_Pin_9); delay_nus(20); } } while(1); } 下面我们使小车原地旋转,程序: 向右顺时针原地旋转: GPIO_SetBits(GPIOD,GPIO_Pin_10);//左侧电机停止旋转 delay_nus(1500); GPIO_ResetBits (GPIOD,GPIO_Pin_10); GPIO_SetBits(GPIOD,GPIO_Pin_9);//右侧电机顺时针旋转 delay_nus(1300); GPIO_ResetBits (GPIOD,GPIO_Pin_9); delay_nus(20); 同理,我们就知道向左原地旋转: GPIO_SetBits(GPIOD,GPIO_Pin_10);//左侧电机逆时针旋转 delay_nus(1700); GPIO_ResetBits (GPIOD,GPIO_Pin_10); GPIO_SetBits(GPIOD,GPIO_Pin_9);//右侧电机停止旋转 delay_nus(1500); GPIO_ResetBits (GPIOD,GPIO_Pin_9); delay_nus(20); 刚才就说了,如果小车一下子运行时间长的话,程序停止,会使小车倾倒,这就是涉及到加速,匀加速,匀减速的问题,我们可以设计一个变量,能够使小车慢慢加速。 匀加速程序如下: for(pulseCount=10; pulseCount <=200; pulseCount= pulseCount +10) { GPIO_SetBits(GPIOD,GPIO_Pin_10); delay_nus(1500+pulseCount); GPIO_ResetBits(GPIOD,GPIO_Pin_10); GPIO_SetBits(GPIOD,GPIO_Pin_9);//右侧电机顺时针旋转 delay_nus(1500-pulseCount); GPIO_ResetBits(GPIOD,GPIO_Pin_9); delay_nus(20); } 没错,就是这么简单,循环一次变量pulseCount就会增加10,第一次循环时,pulseCount为10,发送给PD10,PD9的脉冲宽度分别为1.51ms,1.49ms,第二次循环时,pulseCount值为20,宽度为1.52,1.48,······循环20次,pulseCount为200,此时的宽度为1.7ms和1.3ms,此时的电机全速运转。注意是全速,分别以1700,1300旋转。 匀减速的程序,需要修改的地方主要是for循环: for(pulseCount=200; pulseCount >=0; pulseCount= pulseCount -10) 具体程序,你应该能写出来了。 程序可以进行简化,具体可以参考上面我所说的书籍,如果找不到书的话,可以给我留言,我给你发过去。 |
|
|
|
只有小组成员才能发言,加入小组>>
2361 浏览 0 评论
8625 浏览 4 评论
36347 浏览 18 评论
4961 浏览 0 评论
24056 浏览 34 评论
1310浏览 2评论
1540浏览 1评论
1916浏览 1评论
1372浏览 0评论
1803浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-2 21:20 , Processed in 1.276749 second(s), Total 78, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号