基于stm32的仿生机械手.docx
- 文档编号:25060160
- 上传时间:2023-06-04
- 格式:DOCX
- 页数:20
- 大小:33.57KB
基于stm32的仿生机械手.docx
《基于stm32的仿生机械手.docx》由会员分享,可在线阅读,更多相关《基于stm32的仿生机械手.docx(20页珍藏版)》请在冰豆网上搜索。
基于stm32的仿生机械手
学年论文
题目:
基于stm32的仿生机械手的设计与实现
学生姓名:
贾亮
学号:
0141121904
专业班级:
14级自动化1班
指导教师:
于国晨
2016年8月5日
目录
第1章引言…………………………………………………1
第2章STM32的基本理论知识…………………………3
2.1STM32芯片的介绍………………………………..3
2.2STM32的库函数…………………………………10
第3章设计的主体内容…………………………………12
3.1大脑——STM32开发板…………………………12
3.2思想——用库函数写程序……………………….12
3.3实物的机械设计…………………………………27
3.4实物的花样展示…………………………………27
第4章结果的分析与讨论………………………………28
第5章结论………………………………………………28
参考文献………………………………………………….29
第1章引言
世界首个走向市场的最先进的仿生手“i-LIMB”赢得英国科技创新头奖。
仿生手手有5根可自由活动的手指,它击败了其他进入决赛的三项发明,荣获英国皇家工程学院2008年的麦克罗伯特(MacRobert)杰出科技创新奖。
在此次评奖中,其它进入决赛的三项发明包括一套照看保存在零度以下的数百万份生物样品的机器人系统、一个可以探测早期疾病迹象的化学传感器和一种专为柴油汽车设计的压缩型过滤器。
截至2007年7月,这项仿生手技术已用在200多人身上,包括在伊拉克战争中失去四肢的美国士兵和截肢者协会首席执行官雷·爱德华兹等。
英国最早配备这种装置的爱德华兹1987年因患霍奇金病而导致手脚都截肢了,他在装上i-LIMB仿生手1个月后说它改变了他的生活。
触摸仿生公司首席执行官斯图亚特·米德说:
“i-LIMB仿生手是世界假肢市场中最引人注目的产品之一。
这种仿生手有2个主要的独特特点。
一是我们把发电机放进每个手指,让每个手指通过关节连接具有独立性;二是它的拇指能像我们的拇指一样弯曲90度。
它是首个在形状和功能上模仿人手的仿生手。
”
触摸仿生公司小组的努力获得了英国科技界的认可,他们这次获得5英镑的奖金和一块金牌。
公众可以在2008年9月前到伦敦科学博物馆观看i-LIMB仿生手。
仿生手最早是为了帮助受镇静催眠药撒利多胺危害的儿童,作为一项研究项目的一部分,i-LIMB看起来和动起来就像真手一样。
之后,世界第一家“仿生手”工厂――触摸仿生公司在英国苏格兰正式成立,并开始为客户量身定做这种假手。
如今经过改进的仿生手采用了最前沿的电子和机械技术,并由高强度的塑料制成,此轻便手首次成了世界新一代假肢产品。
第2章STM32的基本理论知识
2.1STM32芯片的介绍
STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARMCortex-M3内核,按内核架构分为不同产品:
其中STM32F1系列有:
STM32F103“增强型”系列
STM32F101“基本型”系列
STM32F105、STM32F107“互联型”系列
增强型系列时钟频率达到72MHz,是同类产品中性能最高的产品;基本型时钟频率为36MHz,以16位产品的价格得到比16位产品大幅提升的性能,
是32位产品用户的最佳选择。
两个系列都内置32K到128K的闪存,不同的是SRAM的最大容量和外设接口的组合。
时钟频率72MHz时,从闪存执行代码,
STM32功耗36mA,是32位市场上功耗最低的产品,相当于0.5mA/MHz。
内核:
ARM32位Cortex-M3CPU,最高工作频率72MHz,1.25DMIPS/MHz。
单周期乘法和硬件除法。
存储器:
片上集成32-512KB的Flash存储器。
6-64KB的SRAM存储器。
时钟、复位和电源管理:
2.0-3.6V的电源供电和I/O接口的驱动电压。
上电复位(POR)、掉电复位(PDR)和可编程的电压探测器(PVD)。
4-16MHz的晶振。
内嵌出厂前调校的8MHzRC振荡电路。
内部40kHz的RC振荡电路。
用于CPU时钟的PLL。
带校准用于RTC的32kHz的晶振。
低功耗:
3种低功耗模式:
休眠,停止,待机模式。
为RTC和备份寄存器供电的VBAT。
调试模式:
串行调试(SWD)和JTAG接口。
DMA:
12通道DMA控制器。
支持的外设:
定时器,ADC,DAC,SPI,IIC和UART。
3个12位的us级的A/D转换器(16通道):
A/D测量范围:
0-3.6V。
双采样和保持能力。
片上集成一个温度传感器。
最多高达112个的快速I/O端口:
根据型号的不同,有26,37,51,80,和112的I/O端口,所有的端口都可以映射到16个外部中断向量。
除了模拟输入,所有的都可以接受5V以内的输入。
最多多达11个定时器:
4个16位定时器,每个定时器有4个IC/OC/PWM或者脉冲计数器。
2个16位的6通道高级控制定时器:
最多6个通道可用于PWM输出。
2个看门狗定时器(独立看门狗和窗口看门狗)。
Systick定时器:
24位倒计数器。
2个16位基本定时器用于驱动DAC。
最多多达13个通信接口:
2个IIC接口(SMBus/PMBus)。
5个USART接口(ISO7816接口,LIN,IrDA兼容,调试控制)。
3个SPI接口(18Mbit/s),两个和IIS复用。
CAN接口(2.0B)。
USB2.0全速接口。
SDIO接口。
ECOPACK封装:
STM32F103xx系列微控制器采用ECOPACK封装形式。
系统作用
1、集成嵌入式Flash和SRAM存储器的ARMCortex-M3内核。
和8/16位设备相比,ARMCortex-M332位RISC处理器提供了更高的代码效率。
STM32F103xx微控制器带有一个嵌入式的ARM核,所以可以兼容所有的ARM工具和软件。
2、嵌入式Flash存储器和RAM存储器:
内置多达512KB的嵌入式Flash,可用于存储程序和数据。
多达64KB的嵌入式SRAM可以以CPU的时钟速度进行读写(不待等待状态)。
3、可变静态存储器(FSMC):
FSMC嵌入在STM32F103xC,STM32F103xD,STM32F103xE中,带有4个片选,支持四种模式:
Flash,RAM,PSRAM,NOR和NAND。
3个FSMC中断线经过OR后连接到NVIC。
没有读/写FIFO,除PCCARD之外,代码都是从外部存储器执行,不支持Boot,目标频率等于SYSCLK/2,所以当系统时钟是72MHz时,外部访问按照36MHz进行。
4、嵌套矢量中断控制器(NVIC):
可以处理43个可屏蔽中断通道(不包括Cortex-M3的16根中断线),提供16个中断优先级。
紧密耦合的NVIC实现了更低的中断处理延迟,直接向内核传递中断入口向量表地址,紧密耦合的NVIC内核接口,允许中断提前处理,对后到的更高优先级的中断进行处理,支持尾链,自动保存处理器状态,中断入口在中断退出时自动恢复,不需要指令干预。
5、外部中断/事件控制器(EXTI):
外部中断/事件控制器由用于19条产生中断/事件请求的边沿探测器线组成。
每条线可以被单独配置用于选择触发事件(上升沿,下降沿,或者两者都可以),也可以被单独屏蔽。
有一个挂起寄存器来维护中断请求的状态。
当外部线上出现长度超过内部APB2时钟周期的脉冲时,EXTI能够探测到。
多达112个GPIO连接到16个外部中断线。
6、时钟和启动:
在启动的时候还是要进行系统时钟选择,但复位的时候内部8MHz的晶振被选用作CPU时钟。
可以选择一个外部的4-16MHz的时钟,并且会被监视来判定是否成功。
在这期间,控制器被禁止并且软件中断管理也随后被禁止。
同时,如果有需要(例如碰到一个间接使用的晶振失败),PLL时钟的中断管理完全可用。
多个预比较器可以用于配置AHB频率,包括高速APB(PB2)和低速APB(APB1),高速APB最高的频率为72MHz,低速APB最高的频率为36MHz。
7、Boot模式:
在启动的时候,Boot引脚被用来在3种Boot选项种选择一种:
从用户Flash导入,从系统存储器导入,从SRAM导入。
Boot导入程序位于系统存储器,用于通过USART1重新对Flash存储器编程。
8、电源供电方案:
VDD,电压范围为2.0V-3.6V,外部电源通过VDD引脚提供,用于I/O和内部调压器。
VSSA和VDDA,电压范围为2.0-3.6V,外部模拟电压输入,用于ADC,复位模块,RC和PLL,在VDD范围之内(ADC被限制在2.4V),VSSA和VDDA必须相应连接到VSS和VDD。
VBAT,电压范围为1.8-3.6V,当VDD无效时为RTC,外部32KHz晶振和备份寄存器供电(通过电源切换实现)。
9、电源管理:
设备有一个完整的上电复位(POR)和掉电复位(PDR)电路。
这条电路一直有效,用于确保从2V启动或者掉到2V的时候进行一些必要的操作。
当VDD低于一个特定的下限VPOR/PDR时,不需要外部复位电路,设备也可以保持在复位模式。
设备特有一个嵌入的可编程电压探测器(PVD),PVD用于检测VDD,并且和VPVD限值比较,当VDD低于VPVD或者VDD大于VPVD时会产生一个中断。
中断服务程序可以产生一个警告信息或者将MCU置为一个安全状态。
PVD由软件使能。
10、电压调节:
调压器有3种运行模式:
主(MR),低功耗(LPR)和掉电。
MR用在传统意义上的调节模式(运行模式),LPR用在停止模式,掉电用在待机模式:
调压器输出为高阻,核心电路掉电,包括零消耗(寄存器和SRAM的内容不会丢失)。
11、低功耗模式:
STM32F103xx支持3种低功耗模式,从而在低功耗,短启动时间和可用唤醒源之间达到一个最好的平衡点。
休眠模式:
只有CPU停止工作,所有外设继续运行,在中断/事件发生时唤醒CPU;停止模式:
允许以最小的功耗来保持SRAM和寄存器的内容。
1.8V区域的时钟都停止,PLL,HSI和HSERC振荡器被禁能,调压器也被置为正常或者低功耗模式。
设备可以通过外部中断线从停止模式唤醒。
外部中断源可以使16个外部中断线之一,PVD输出或者TRC警告。
12、待机模式:
追求最少的功耗,内部调压器被关闭,这样1.8V区域断电。
PLL,HSI和HSERC振荡器也被关闭。
在进入待机模式之后,除了备份寄存器和待机电路,SRAM和寄存器的内容也会丢失。
当外部复位(NRST引脚),IWDG复位,WKUP引脚出现上升沿或者TRC警告发生时,设备退出待机模式。
进入停止模式或者待机模式时,TRC,IWDG和相关的时钟源不会停止。
2.2STM32的库函数
意法半导体在推出STM32微控制器之初,也同时提供了一套完整细致的固件开发包,里面包含了在STM32开发过程中所涉及到的所有底层操作。
通过在程序开发中引入这样的固件开发包,可以使开发人员从复杂冗余的底层寄存器操作中解放出来,将精力专注应用程序的开发上,这便是ST推出这样一个开发包的初衷。
但这对于许多从51/AVR这类单片机的开发转到STM32平台的开发人员来说,势必有一个不适应的过程。
因为程序开发不再是从寄存器层次起始,而要首先去熟悉STM32所提供的固件库。
那是否一定要使用固件库呢?
当然不是。
但STM32微控制器的寄存器规模可不是常见的8位单片机可以比拟,若自己细细琢磨各个寄存器的意义,必然会消耗相当的时间,并且对于程序后续的维护,升级来说也会增加资源的消耗。
对于当前“时间就是金钱”的行业竞争环境,无疑使用库函数进行STM32的产品开发是更好的选择。
本文将通过一个简单的例子对STM32的库函数做一个简单的剖析。
以最常用的GPIO设备的初始化函数为例,
如下程序段一:
GPIO_InitTypeDefGPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed=
GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure
这是一个在STM32的程序开发中经常使用到的GPIO初始化程序段,其功能是将GPIOA.4口初始化为推挽输出状态,并最大翻转速率为50MHz。
第3章设计的主体内容
3.1大脑——STM32开发板
STM32开发板就是一种STM32的最小系统,它上面链接有基础的功能电路,而且耐用,附有学习光盘,对初学者十分的合适。
通过对程序的编写,可以得到所需要的果。
3.2思想——用库函数写程序
Main.c
#include"public.h"
#include"pwm.h"
#include"systick.h"
#include"jixieshou.h"
intmain()
{pwm_init();
while
(1)
{
if(anjian==0)
{shouzhang();
tiaoxin();
}
}
}
Systick.c
#include"systick.h"
voiddelay_ms(u32i)
{
u32temp;
SysTick->LOAD=9000*i;SysTick->CTRL=0X01;SysTick->VAL=0;
do
{
temp=SysTick->CTRL;}
while((temp&0x01)&&(!
(temp&(1<<16))));SysTick->CTRL=0;
SysTick->VAL=0;
}
Systick.h
#ifndef_systick_H
#define_systick_H
#include
voiddelay_us(u32i);
voiddelay_ms(u32i);
#endif
Pwm.c
voidpwm_init()
{
GPIO_InitTypeDefGPIO_InitStructure;
TIM_TimeBaseInitTypeDefTIM_TimeBaseInitStructure;
TIM_OCInitTypeDefTIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE|RCC_APB2Periph_TIM1,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3|RCC_APB1Periph_TIM4|RCC_APB1Periph_TIM5|RCC_APB1Periph_TIM2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOE,&GPIO_InitStructure);
TIM_TimeBaseInitStructure.TIM_Period=9999;TIM_TimeBaseInitStructure.TIM_Prescaler=143;
TIM_TimeBaseInitStructure.TIM_ClockDivision=0;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1,TIM_TimeBaseInitStructure);
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);
TIM_TimeBaseInit(TIM5,TIM_TimeBaseInitStructure);
TIM_TimeBaseInit(TIM2,TIM_TimeBaseInitStructure);GPIO_PinRemapConfig(GPIO_FullRemap_TIM2,ENABLE);
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
TIM_OC1Init(TIM3,&TIM_OCInitStructure);
TIM_OC2Init(TIM3,&TIM_OCInitStructure);
TIM_OC3Init(TIM3,&TIM_OCInitStructure);
TIM_OC4Init(TIM3,&TIM_OCInitStructure);
TIM_OC1Init(TIM5,&TIM_OCInitStructure);
TIM_OC4Init(TIM5,&TIM_OCInitStructure);
TIM_OC2Init(TIM5,&TIM_OCInitStructure);
TIM_OC3Init(TIM5,&TIM_OCInitStructure);
TIM_OC1Init(TIM4,&TIM_OCInitStructure);
TIM_OC2Init(TIM4,&TIM_OCInitStructure);
TIM_OC3Init(TIM4,&TIM_OCInitStructure);
TIM_OC4Init(TIM4,&TIM_OCInitStructure);
TIM_OC3Init(TIM2,&TIM_OCInitStructure);
TIM_OC4Init(TIM2,&TIM_OCInitStructure);
TIM_OC2InitÇTIM_OCInit
TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);
TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);
TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);TIM_OC1PreloadConfig(TIM5,TIM_OCPreload_Enable);TIM_OC2PreloadConfig(TIM5,TIM_OCPreload_Enable);TIM_OC3PreloadConfig(TIM5,TIM_OCPreload_Enable);°
TIM_OC4PreloadConfig(TIM5,TIM_OCPreload_Enable);
TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable);TIM_OC2PreloadConfig(TIM4,TIM_OCPreload_Enable);
TIM_OC3PreloadConfig(TIM4,TIM_OCPreload_Enable);
TIM_OC4PreloadConfig(TIM4,TIM_OCPreload_Enable);TIM_OC4PreloadConfig(TIM2,TIM_OCPreload_Enable);
TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Enabl
TIM_ARRPreloadConfig(TIM3,ENABLE);
TIM_ARRPreloadConfig(TIM2,ENABLE);
TIM_ARRPreloadConfig(TIM4,ENABLE);
TIM_ARRPreloadConfig(TIM5,ENABLE);
TIM_CtrlPWMOutputs(TIM2,ENABLE);
TIM_CtrlPWMOutputs(TIM3,ENABLE);
TIM_CtrlPWMOutputs(TIM4,ENABLE);
TIM_CtrlPWMOutputs(TIM5,ENABLE);
TIM_Cmd(TIM3,ENABLE);
TIM_Cmd(TIM4,ENABLE);
TIM_Cmd(TIM5,ENABLE);
TIM_Cmd(TIM2,ENABLE);
}
Pwm.h
#ifndef_pwm_H
#define_pwm_H
#include"stm32f10x.h"
voidpwm_init(void);
#defineanjianGPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)
#endif
Jixieshou.c
voidtiaoxin()
{swxz=1250;
swqh=950;
TIM_SetCompare4(TIM3,swqh);
delay_ms(500);
TIM_SetCompare4(TIM4,swxz);
delay_ms(700);
szqd=460;
szzd=270;
szhd=300;
zzqd=410;
zzzd=270;
zzhd=270;
wmzqd=385;
wmzzd=270;
wmzhd=400;
dmzhd=700;
dmzzd=270;
dmzqd=430;
TIM_SetCompare1(TIM3,szqd);
delay_ms(500);
TIM_SetCompare2(TIM3,szzd
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 stm32 仿生 机械手