机器人.docx
- 文档编号:11625044
- 上传时间:2023-03-29
- 格式:DOCX
- 页数:34
- 大小:1.54MB
机器人.docx
《机器人.docx》由会员分享,可在线阅读,更多相关《机器人.docx(34页珍藏版)》请在冰豆网上搜索。
机器人
实训报告
课程名称一级项目(机器人2)
学院电子与电气
专业
班级
学号
学生姓名
实训报告内容
1、STM32单片机I0端口与伺服电机控制;
2、STM32单片机程序模块化设计与机器人运动控制;
3、STM32单片机中断编程与机器人触觉导航;
4、STM32单片机输入/输出接口综合应用与红外导航;
5、STM32单片机定时器编程与机器人的距离检测;
6、机器人运动综合控制。
一、实习目的
本次实习的目的在于加深对STM32单片机的理解和认识,初步学习STM32单片机的I0端口与伺服电机控制.程序模块化设计与机器人运动控制,中断编程与机器人触觉导航以及输入/输出接口综合应用与红外导航等。
初步掌握单片机应用系统的设计方法;掌握常用接口芯片的正确使用方法;强化单片机应用电路的设计与分析能力;提高学生在单片机应用方面的实践技能;培育学生综合运用理论知识解决问题的能力,力求实现理论结合实际,学以至用的原则
二STM32单片机的介绍
STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARMCortex-M3内核。
按性能分成两个不同的系列:
STM32F103“增强型”系列和STM32F101“基本型”系列。
增强型系列时钟频率达到72MHz,是同类产品中性能最高的产品;基本型时钟频率为36MHz,以16位产品的价格得到比16位产品大幅提升的性能,是16位产品用户的最佳选择。
两个系列都内置32K到128K的闪存,不同的是SRAM的最大容量和外设接口的组合。
时钟频率72MHz时,从闪存执行代码,STM32功耗36mA,是32位市场上功耗最低的产品,相当于0.5mA/MHz。
ARM公司的高性能”Cortex-M3”内核
1.25DMips/MHz,而ARM7TDMI只有0.95DMips/MHz
一流的外设
1μs的双12位ADC,4兆位/秒的UART,18兆位/秒的SPI,18MHz的I/O翻转速度
低功耗
在72MHz时消耗36mA(所有外设处于工作状态),待机时下降到2μA
最大的集成度
复位电路、低电压检测、调压器、精确的RC振荡器等。
三STM32单片机I0端口与伺服电机控制
STM32是32位的单片机,但端口是16位的。
“端口的位数”和“单片机位数”没有直接联系,根据生产或者需要想引出几个就几个,比如STM32F103C8T6单片机是32位的,端口都是16位的,端口A和B就有16个引脚,端口C只引出了3个引脚,端口D只引出2个引脚
控制机器人伺服电机以不同速度运动是通过让单片机的输入/输出(I/O)口输出不同的脉冲序列来实现的。
STM32-M3系列单片机有5个16位的并行I/O口:
PA、PB、PC,PD.和PE。
这五个端口既可以作为输入也可以做为输出,可按16位处理,也可按位方式处理。
STM32的每个GPIO端口都有两个特别的寄存器,GPIOx_BSRR和GPIOx_BRR寄存器,通过这两个寄存器可以直接对对应的GPIOx端口置'1'或置'0'。
GPIOx_BSRR的高16位中每一位对应端口x的每个位,对高16位中的某位置'1'则端口x的对应位被清'0';寄存器中的位置'0',则对它对应的位不起作用。
GPIOx_BSRR的低16位中每一位也对应端口x的每个位,对低16位中的某位置'1'则它对应的端口位被置'1';寄存器中的位置'0',则对它对应的端口不起作用。
简单地说GPIOx_BSRR的高16位称作清除寄存器,而GPIOx_BSRR的低16位称作设置寄存器。
另一个寄存器GPIOx_BRR只有低16位有效,与GPIOx_BSRR的高16位具有相同功能
GPIO端口的每个位可以由软件分别配置成多种模式。
在STM32中选用IO模式
(1)浮空输入_IN_FLOATING——浮空输入,可以做KEY识别,RX1
(2)带上拉输入_IPU——IO内部上拉电阻输入
(3)带下拉输入_IPD——IO内部下拉电阻输入
(4)模拟输入_AIN——应用ADC模拟输入,或者低功耗下省电
(5)开漏输出_OUT_OD——IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。
当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。
可以读IO输入电平变化,实现C51的IO双向功能
(6)推挽输出_OUT_PP——IO输出0-接GND,IO输出1-接VCC,读输入值是未知的
(7)复用功能的推挽输出_AF_PP——片内外设功能(I2C的SCL,SDA,TX1)
(8)复用功能的开漏输出_AF_OD——片内外设功能(MOSI,MISO.SCK.SS)
I/O口的输出模式下,有3种输出速度可选(2MHz、10MHz和50MHz),这个速度是指I/O口驱动电路的响应速度而不是输出信号的速度,输出信号的速度与程序有关(芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路)。
通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。
高频的驱动电路,噪声也高,当不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的EMI性能。
当然如果要输出较高频率的信号,但却选用了较低频率的驱动模块,很可能会得到失真的输出信号。
关键是GPIO的引脚速度跟应用匹配(推荐10倍以上?
)。
比如:
1.1.1对于串口,假如最大波特率只需115.2k,那么用2M的GPIO的引脚速度就够了,既省电也噪声小。
1.1.2对于I2C接口,假如使用400k波特率,若想把余量留大些,那么用2M的GPIO的引脚速度或许不够,这时可以选用10M的GPIO引脚速度。
1.1.3对于SPI接口,假如使用18M或9M波特率,用10M的GPIO的引脚速度显然不够了,需要选用50M的GPIO的引脚速度。
1.2GPIO口设为输入时,输出驱动电路与端口是断开,所以输出速度配置无意义。
1.3在复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式。
1.4所有端口都有外部中断能力。
为了使用外部中断线,端口必须配置成输入模式。
1.5GPIO口的配置具有上锁功能,当配置好GPIO口后,可以通过程序锁住配置组合,直到下次芯片复位才能解锁
实例程序
IO配置:
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;//IR输入
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
电机顺时针旋转程序
GPIO_SetBits(GPIOB,GPIO_Pin_3);
delay_nus(1700);
GPIO_ResetBits(GPIOB,GPIO_Pin_3);
delay_nms(20);
STM32单片机程序模块化设计与机器人运动控制
程序调试:
下面介绍一下一些常用的调试按钮:
就是Reset,相当于单片机最简,系统的复位按钮,按下后,所有的系统状态将变成初始状态
这是全速运行,相当于单片机的通电执行。
这个就是停止全速运行的按钮。
stepinto逐语句;进入并单步执行;单步执行
stepover逐过程
stepout跳出
首先:
打开一个已编译通过的单片机项目(如何新建与编译单片机程序项目这里省略)
选择Debug下面的Start/StopDebugSession,这个选项可以打开调试也可以关闭调试
接下来看到的窗口就是调试窗口了:
下面具体说说相关子窗口的功能:
1:
左侧的ProjectWorkspace
Regs是片内内存的相关情况值,Sys是系统一些累加器、计数器等。
Regs很简单就不多说。
控制机器人运动的程序
STM32单片机中断编程与机器人触觉导航
触觉需要的材料及安装和电路图
二:
触觉的检测
•例程:
尝试让机器人行走,当在其路线上遇到障碍物,它将后退、旋转并转向另一个方向。
•源程序:
参照教材P70例程RoamingWithWhiskers.c
带着胡须机器人怎样行走
主程序中的语句首先检查胡须的状态。
如果两个胡须都触动了即P1_4state()和P2_3state()都为0,调用Backward(),紧接着调用Left_Turn()两次;如果只是右胡须被触动即只有P1_4state()==0,程序调用Backward(),然后再调用Left_Turn();如果左胡须被触动即只有P2_3state()==0,程序调用Backward(),然后再调用Right_Turn();如果两个胡须都没有触动,在这种情况下,在else中调用Forward()语句。
现在看探测连续而交替触动墙角的部分
•首先要检查的是,是否有且只有一个胡须被触动。
简单的方法就是询问“是否P1_4state()不等于P2_3state()”。
其具体判断语句如下:
if(P1_4state()!
=P2_3state())
假如真有胡须被触动,接下来要做的事情就是检查当前状态是否确实与上次不同。
换句话说,是old2不等于P1_4state()和old3不等于P2_3state()吗?
如果是,就在胡须触动计数器上加1,同时记下当前的状态,设置old2等于当前的P1_4state(),old3等于当前的P2_3state()。
•如果发现胡须连续四次被触动,那么计数值置1,并且进行“U”型拐弯。
•紧接的else语句是机器人没有陷入墙角情况,故需要将计数器值置1。
之后的程序和RoamingWithWhiskers.c中的一样。
STM32单片机的中断介绍
ARMCoetex-M3内核共支持256个中断,其中16个内部中断,240个外部中断和可编程的256级中断优先级的设置。
STM32目前支持的中断共84个(16个内部+68个外部),还有16级可编程的中断优先级的设置,仅使用中断优先级设置8bit中的高4位。
STM32可支持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字节PRI_n(8位,但是STM32中只使用4位,高4位有效),每4个通道的8位中断优先级控制字构成一个32位的优先级寄存器。
68个通道的优先级控制字至少构成17个32位的优先级寄存器。
4bit的中断优先级可以分成2组,从高位看,前面定义的是抢占式优先级,后面是响应优先级。
按照这种分组,4bit一共可以分成5组第0组:
所有4bit用于指定响应优先级;第1组:
最高1位用于指定抢占式优先级,后面3位用于指定响应优先级;第2组:
最高2位用于指定抢占式优先级,后面2位用于指定响应优先级;第3组:
最高3位用于指定抢占式优先级,后面1位用于指定响应优先级;第4组:
所有4位用于指定抢占式优先级。
所谓抢占式优先级和响应优先级,他们之间的关系是:
具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套。
当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。
如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。
每一个中断源都必须定义2个优先级。
GPIO外部中断STM32中,每一个GPIO都可以触发一个外部中断,但是,GPIO的中断是以组位一个单位的,同组间的外部中断同一时间只能使用一个。
比如说,PA0,PB0,PC0,PD0,PE0,PF0,PG0这些为1组,如果我们使用PA0作为外部中断源,那么别的就不能够再使用了,在此情况下,我们智能使用类似于PB1,PC2这种末端序号不同的外部中断源。
每一组使用一个中断标志EXTIx。
EXTI0–EXTI4这5个外部中断有着自己的单独的中断响应函数,EXTI5-9共用一个中断响应函数,EXTI10-15共用一个中断响应函数。
对于中断的控制,STM32有一个专用的管理机构:
NVIC。
对于NVIC的详细解释,可以参考《ARMCortex-M3权威指南》,JosephYiu著,宋岩译,北京航空航天大学出版社出版,第8章NVIC与中断控制。
中断的使能,挂起,优先级,活动等等部都是NVIC在管理的。
因为我学习STM32重点在于如何开发程序,所以内部的一些东西,在此我就不详细说明了,有感兴趣的可以参看上面提到的那本数。
配置中断
1、分配中断向量表:
/*SettheVectorTablebaselocationat0x20000000*/
NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);
2、设置中断优先级:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);//设置中断优先级
3、初始化外部中断:
/*允许EXTI4中断*/
NVIC_InitStructure.NVIC_IRQChannel=EXTI4_IRQChannel;//中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=PreemptionPriorityValue;//强占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//次优先级
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//通道中断使能
NVIC_Init(&NVIC_InitStructure); //初始化中断
注意:
如果我们配置的外部针脚为PA4,或PB4,或PC4,PD4等,那么采用的外部中断也必须是EXTI4,同样,如果外部中断针脚是PA1,PB1,PC1,PD1那么中断就要用EXTI1,其他类推。
2配置GPIO针脚作为外部中断的触发事件
1、选择IO针脚
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
注意,如果的针脚是端口的4号针脚,配置的中断一定是EXTI4
2、配置针脚为输入
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
3、初始化针脚
GPIO_Init(GPIOD,&GPIO_InitStructure);
3配置EXTI线,使中断线和IO针脚线连接上
1、将EXTI线连接到IO端口上
将EXTI线4连接到端口GPIOD的第4个针脚上
GPIO_EXTILineConfig(GPIO_PortSourceGPIOD,GPIO_PinSource4);
注意:
如果配置的针脚是4号,那么参数必须是GPIO_PinSource4
如果配置的针脚是3号,那么参数必须是GPIO_PinSource3
2.把相应的IO口设置为中断线路
由于GPIO并不是专用的中断引脚,因此在用GPIO来触发外部中断的时候需要设置将GPIO相应的引脚和中断线连接起来,
具体代码如下:
voidEXTI_cfg()
{
EXTI_InitTypeDefEXTI_InitStructure;//清空中断标志
EXTI_ClearITPendingBit(EXTI_Line2);
EXTI_ClearITPendingBit(EXTI_Line3);EXTI_ClearITPendingBit(EXTI_Line5);//选择中断管脚PC.2PC.3PC.5
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource2);GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource3);GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5);EXTI_InitStructure.EXTI_Line=EXTI_Line2|EXTI_Line3|EXTI_Line5;//选择中断线路235
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//设置为中断请求,非事件请求
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising_Falling;//设置中断触发方式为上下降沿触发
EXTI_InitStructure.EXTI_LineCmd=ENABLE;//外部中断使能EXTI_Init(&EXTI_InitStructure);}
EXTI_cfg中需要调用到的函数都在stm32f10x_exti.c。
机器人的触觉导航程序
#include”HelloRobot.h”
IntPE2state(void)
{
ReturnGPIO_ReadInputdatebit(GPIOE,GPIO_pin_2);
}
IntPE3state(void)
{
ReturnGPIO_ReadInputdatebit(GPIOE,GPIO_pin_3);
}
VoidForward(void)
{
GPIO_Setbits(GPIOE,GPIO_pin_10);
Delay_nus(1700);
GPIO_Resetbits(GPIOE,GPIO_pin_10);
GPIO_Setbits(GPIOE,GPIO_pin_9);
Delay_nus(1300);
GPIO_Resetbits(GPIOE,GPIO_pin_9);
Delay_nms(20);
}
VoidLeft_Turn(void)
{
intI;
for(i=0;i<=26;i++)
{
GPIO_Setbits(GPIOE,GPIO_pin_10);
Delay_nus(1300);
GPIO_Resetbits(GPIOE,GPIO_pin_10);
GPIO_Setbits(GPIOE,GPIO_pin_9);
Delay_nus(1300);
GPIO_Resetbits(GPIOE,GPIO_pin_9);
Delay_nms(20);
}
}
VoidRight_Turn(void)
{
inti;
for(i=0;i<=26;i++)
{
GPIO_Setbits(GPIOE,GPIO_pin_10);
Delay_nus(1700);
GPIO_Resetbits(GPIOE,GPIO_pin_10);
GPIO_Setbits(GPIOE,GPIO_pin_9);
Delay_nus(1700);
GPIO_Resetbits(GPIOE,GPIO_pin_9);
Delay_nms(20);
}
}
VoidBackward(void)
{
inti;
for(i=0;i<=26;i++)
{
GPIO_Setbits(GPIOE,GPIO_pin_10);
Delay_nus(1300);
GPIO_Resetbits(GPIOE,GPIO_pin_10);
GPIO_Setbits(GPIOE,GPIO_pin_9);
Delay_nus(1700);
GPIO_Resetbits(GPIOE,GPIO_pin_9);
Delay_nms(20);
}
}
Intmain(void)
{
BSP_Init();
USART_Configuration();
Printf(“ProgramRunning!
\n”);
While
(1)
{
If(PE2state()==0)&&(PE3state()==0))
{
Backward();
Left_Turn();
Left_Turn();
}
Elseif(PE2state()==0)
{
Backward();
Left_Turn();
}
Elseif(PE3state()==0)
{
Backward();
Right_Turn();
}
Else
Forward();
}
}
STM32单片机输入/输出接口综合应用与红外导航
使用红外线前灯探测道路
宝贝车机器人使用红外线两极管LED作为前灯,他们发射红外光,在一些情况下,红外线从物体反射从机器人前进的方向折回。
宝贝车机器人的眼睛是红外检测器。
红外检测器发出信号来表明它们是否检测到从物体反射回的红外线。
宝贝车机器人的大脑,微控制器据此做出判断并基于这个传感器的输入控制伺服电机。
IR(红外线)检测器有内置的光滤波器,除了需要我们用它的内部的光敏二极管传感器检测的980nm红外线,它几乎不允许其它光通过。
红外检测器也有一个电子滤波器,它只允许大约38.5kHz的信号通过。
换句话说,检测器只寻找每秒闪烁38,500次的红外光。
搭建并测试IR发射和探测器对
元件清单:
(1)两个红外检测器
(2)两个IRLEDs
(3)两对IRLED套管
(4)两个220Ω电阻(红-红-棕)
(5)两个1kΩ电阻(棕-黑-红)
当没有IR信号返回时,探测器的输出状态为高。
当它探测到被物体反射的38500Hz和声时,它的输出为低。
当发送红外信号后,IR探测器的输出处于低状态不到1毫秒,因此当发送完后立即将IR探测器的输出存储到变量中是很重要的。
这些存储的值会显示在调试终端或被机器人用来导航。
红外导航的相关程序例程
#include”stm32f10x_heads.h”
#include“helloRobot,h”
#defineLeftLaunch_1GPIO_Setbits(GPIOE,GPIO_pin_1);
#defineLeftLaunch_0GPIO_Setb
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 机器人