这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 意念控制平衡小车

共33条 2/4 1 2 3 4 跳转至
专家
2015-06-30 08:45:35     打赏
11楼

首先来科普下脑电波


脑电波(Electroencephalogram,EEG)是大脑在活动时,脑皮质细胞群之间形成电位差,从而在大脑皮质的细胞外产生电流。它记录大脑活动时的电波变化,是脑神经细胞的电生理活动在大脑皮层或头皮表面的总体反映。



现代科学研究已经知道,人脑工作时会产生自己的脑电波,可用电子扫描仪检测出,至少有四个重要的波段。经过研究证实大脑在至少有四个不同的脑电波。

脑电波是是一些自发的有节律的神经电活动,其频率变动范围在每秒1-30次之间的,可划分为四个波段,即δ(1-3Hz)、θ(4-7Hz)、α(8-13Hz)、β(14-30Hz)。 (这几种波的频率边界,在学界还没有完全统一的标准。亦有学者认为δ波小于4Hz,θ波4~7Hz,α波8~12Hz,β波13~35Hz,并认为有大于35Hz的脑电波,并命名为γ波。长期处于该状态下的人会有生命危险)

δ波,频率为每秒1-3次,当人在婴儿期或智力发育不成熟、成年人在极度疲劳和昏睡状态下,可出现这种波段。

θ波,频率为每秒4-7次,成年人在意愿受到挫折和抑郁时以及精神病患者这种波极为显著。但此波为少年(10-17岁)的脑电图中的主要成分。

α波,频率为每秒8-13次,平均数为10次左右,它是正常人脑电波的基本节律,如果没有外加的刺激,其频率是相当恒定的。人在清醒、安静并闭眼时该节律最为明显,睁开眼睛或接受其它刺激时,α波即刻消失。

β波,频率为每秒14-30次,当精神紧张和情绪激动或亢奋时出现此波,当人从睡梦中惊醒时,原来的慢波节律可立即被该节律所替代。

在人心情愉悦或静思冥想时,一直兴奋的β波、δ波或θ波此刻弱了下来,α波相对来说得到了强化。因为这种波形最接近右脑的脑电生物节律,于是人的灵感状态就出现了(摘自孙作东著《激活沉睡的脑》一书)。



脑电波或脑电图是一种比较敏感的客观指标,不仅可以用于脑科学的基础理论研究,而且更重要的意义在于它的临床实践的应用,与人类的生命健康息息相关。

脑电波是诊断癫痫的必要依据,脑电波对于各种颅内病变,如脑中风、脑炎、脑瘤、代谢性脑病变等,亦有很大的诊断帮助。脑波图仍是目前研究睡眠最客观的依据,藉由监测睡眠中脑波变化,人们可以区分睡眠中的不同时期。



院士
2015-06-30 09:17:01     打赏
12楼
请问那几个字母怎么念?

助工
2015-06-30 09:30:32     打赏
13楼
不错,但是现在用什么设备检测人的想法呢?

专家
2015-06-30 10:33:26     打赏
14楼
有点儿前卫,不敢想象,遥感识别很重要

菜鸟
2015-06-30 11:24:04     打赏
15楼

坐等直播啊  楼主这套脑电波采集东西也不便宜啊


菜鸟
2015-06-30 13:27:05     打赏
16楼
还能说什么呢,只能说楼主碉炸天

助工
2015-06-30 19:58:47     打赏
17楼
我也想搞一个……

菜鸟
2015-07-01 09:53:45     打赏
18楼

楼主你在进行效益很高很少有人做的项目,你的思想超前,很不错,在没有泛滥之前先搞好了,等到泛滥了,成熟了,我想你也收益的差不多了,这就是要做就做别人想不到的,用的很少的高科技技术才会更有发展,32我学好了,自平衡车玩熟了,会入手一个脑电波的模块用于四轴飞行器的控制,我们都支持你,别人很好搞得东西,认为很难的东西,你搞了,你就是牛人,加油


专家
2015-07-25 12:14:06     打赏
19楼

温馨提示:图片中包含的相关目录在页面放大的情况下观看更清晰

看懂此教程后,包你对STM32的开发中减少绝大部分疑惑!


2、STM32F1xx Cortex-M3 Keil uVision 环境搭建及建立工程

内容及目的:以安装MDK5为例搭建STM32开发环境

准备工作:MDK5安装包(破解版,商业行为请购买正版!)

安装过程:略(鉴于大家多数都是玩过单片机的,对于MDK不再陌生,安装过程很简单,并且网上的安装及破解教程很多)

什么是STM32的库?

STM32库是由ST公司针对STM32提供的函数接口,即API(Application Program Interface,使用STM32的开发者可以调用这些函数接口来配置STM32的寄存器,使开发人员得以脱离最底层的寄存器操作(当然你很乐意玩抽象的寄存器的话,也可以试试寄存器版的STM32开发!只能说,然并卵!ST的工程师已经帮你做了这部分开发工作,那么较真干嘛),有开发快速、易于阅读、维护成本低的优点。

当我们调用库里的API时可以不用挖空心思去了解库底层的寄存器操作,就像我们最初学习C语言时使用printf()函数一样,不用去研究它的代码如何实现,只需要学会它的使用格式即可!

有过编码经验的开发人员都知道库是架设在寄存器与用户驱动层之间的代码,向下处理与寄存器直接相关的配置,向上为用户提供配置寄存器的接口。

STM32结构及库层次关系

必须了解什么是“CMSIS标准”!

CMSIS是ARM公司与多家不同的芯片和软件供应商一起紧密合作定义的,提供了内核与外设、实时操作系统中间设备之间的通用接口。同样,我们使用STM32,ST公司使用ARM公司的Cortex-M3片技术的授权,提供了在内核之外的部件,被我们称之为片上外设。如STM32芯片的模数转换器ADC、串口UART、定时器TIM等。

CMSIS标准中最主要的是CMSIS核心层,它包括:

※内核函数层:其中包含用于访问内核的名称、地址定义,主要有ARM公司定义

※设备外设访问层:提供了片上外设的地址和中断定义,主要由像ST这样的芯片生产厂商提供

可见CMSIS层位于硬件层与操作系统或用户层之间,提供了与芯片厂商无关的硬件抽象层,可以为借口外设、实时操作系统提供简单的处理器软件接口,屏蔽了各个芯片厂商的硬件差异,对软件的移植具有很大的好处。STM32固件库就是按照CMSIS标准建立的。也就是说如果今后我们学习其他芯片厂商如NXP、TI、Freescale、ADI等生产的Cortex-M3时同样可以灵活使用,达到举一反三。

那么在此我就提供一个STM32开发人员经常使用的STM32固件库,其实在网络中很容易下载得到,这里我借花献佛提供给伸手党

STM32F10x_StdPeriph_Lib_V3.5.0.rar

以及固件库开发相关的文档

STM32固件库使用手册的中文翻译版.pdf

Stm32寄存器与库函数概览(摘自固件库使用手册).doc


更多资料后续陆续上传......



库目录、文件简介

有了固件库文件,那么它的目录下面的目录和文件是做什么用的呢?

以上提供的3.5的固件库解压后内容如下:


1)_htmrescST 的logo 完全无用,不用理会

2)Libraries比较重要的文件包含STM32的系统文件和大量头文件,也就是库文件了

3)Project包含大量外设的例程,和各个软件版本的评估版工程模板。KEIL 对应的就是MDK-ARM 文件下的工程模板。你也可以利用这个工程模板来修
改,得到你自己的工程模块(不推荐)

4)Utilities就是评估版的相关文件:暂时不会用到,无视

5)Release_Notes.html:库版本更新说明

6)最后一个带问号的是库使用帮助文档

还有以上这些目录下的文件,

core_cm3.c/.h :CMSIS标准的核内设备函数层的CM3核通用的源文件和头文件



system_stm32f10x.c此文件的功能是设置STM32复杂的系统时钟和总线时钟



stm32f10x.h包含STM32中寄存器地址和结构体类型定义,使用到STM32固件库的地方都要包含此头文件

启动文件:不同的文件对应不同的芯片型号,使用时需要注意

※cl:互联型产品,stm32f105/107系列

※vl:超值型产品,stm32f100系列

※xl:超高密度(容量)产品,stm32f102/103系列

※ld:低密度产品,flash小于64KB

※md:中等密度产品,flash等于64KB或128KB

※hd:高密度产品,flash大于128KB

提示:本次活动采用的是STM32F103C8T6,flash为64KB,故在下面将要建立的MDK工程中选择英文缩写为md的文件!



STM32F10x_StdPeriph_Driver文件夹包含inc(include)和src(source)两个文件夹,属于CMSIS设备外设函数。src里面的每个设备外设驱动程序.具体到每个.c文件的用途,有点单片机知识的都会知道是干什么用的,以后在使用中用到再提一下。



stm32f10x_it.c和stm32f10x_conf.h下图的文件夹下存放了官方的库工程模板,我们在用库建立一个完整的工程时,需要添加stm32f10x_it.c、stm32f10x_it.h和stm32f10x_conf.h这三个文件。stm32f10x_it.c专门用来编写中断服务函数,其中包含了相当多的中断函数接口,实现函数都是空的,需要开发人员自己编写实现中断处理函数,并且这些中断处理函数的名称是不可以随便修改的。stm32f10x_conf.h文件被包含在了stm32f10x.h文件中,用来配置工程当中使用了什么外设的头文件。

其它






一、建立工程模板

1)启动Keil uVision5,通过工具栏Project->New uVision Project新建工程,并保存在事先计划好的目录下


2)接下来选择目标器件,此次活动选用的是STM32F103C8T6

由于MDK5的特性和之前版本有些许差别,这里会弹出我已经安装过的器件系列,之前玩过BLE,所以会出现这个,选择默认的第一个选项跳转到器件选择



选择相应器件






这里会弹出我之前下载安装过的一些东西,先无视,直接  ok






新建立的工程下目录是空的,为了便于工程的结构清晰,我们首先需要在工程目录下建立这样几个新文件夹

USER(用于存放工程文件和用户层代码,包裹主函数main.c)

FWlib(用于存放STM32库里的inc和src这两个文件夹,这两个文件夹包含了芯片上的所有驱动,这两个文件夹下的文件是不需要我们修改的)

CMSIS(用于存放库为我们自带的文件和一些位于CMSIS层的文件)

Output(用于保存软件编译厚输出的文件,如最终的烧写到STM32的flash里的.HEX文件)

Listing(由于MDK编译生成的大量链接文件,便于归类,建立此文件夹加以保存)

...

这些文件夹不是必须的,只是为了做一个习惯良好的“处女座”(PS:其实楼主是巨蟹!)



楼主事先建好的文件夹,已经添加好相应的文件


步骤:

1)将下图的inc和src文件夹放在自己建立的工程目录下的目录FWlib(楼主的.../Demo/FWlib)



放置后的结果



2)将下图的工程模板放到USER目录下(楼主的.../Demo/USER)



放置后的结果


3)将下图的几个文件和文件夹放在CMSIS文件夹下(楼主的.../Demo/CMSIS)





放置后的结果



好了,接下来回到Keil工程

右键Target1图标->Manage Project Iterms...

弹出的对话框添加以上几个文件夹,相应的,你可以在该工程文件夹下手动先建立这几个文件夹STARTCODE、USER、FWlib、CMSIS







向这几个工程文件夹下添加相应的文件或/和文件夹

STARTCODE工程文件夹下为启动文件(此次活动主器件STM32F103C8T6对应startup_stm32f10x_md.s)


USER工程文件夹下添加main.c和stm32f10x_it.c



FWlib工程文件夹下添加src文件夹下的所有.c文件(当然遇到具体的需求按照需求添加,有些文件可能不需要,全选会避免漏掉某个文件,但是会大大延长Keil编译工程的时间)



CMSIS工程文件夹下添加core_cm3.c、system_stm32f10x.c文件


至此,MDK工程已经基本能建好



接下来配置MDK的某些选项卡

点击Options for Target...选项


1)Output选项指向我们建立的Output文件夹,选中Create HEX File选项



2)ListingOutput选项指向我们建立的Listing文件夹


3)在C/C++选项的下图两个地方添加内容

其中Define:栏添加两个宏定义:USE_STDPERIPH_DRIVER,STM32F10X_MD

添加USE_STDPERIPH_DRIVER时因为我们使用ST的官方库,添加STM32F10X_MD是因为我们使用的芯片是中等容量的。

在Include Path:栏添加头文件目录



添加完成后的结果



4)由于本次活动提供了串口和SWD两种程序下载接口,在Keil工程中以STLink为下载器设置相关选项



下图选择SW模式


Flash Download选项添加芯片下载算法



若下载完复位并且启动,勾选此项

Utilities选项勾选去除图中选项


选择STLink

至此,所有设置完毕!



专家
2015-07-25 17:10:21     打赏
20楼

3、趁热打铁——玩转GPIO之点亮LED

所需3.5版本固件库文件:

※STARTCODE/start_stm32f10x_md.s

※CMSIS/core_cm3.c

※CMSIS/system_stm32f10x.c

※FWlib/stm32f10x_gpio.c(GPIO配置相关)

※FWlib/stm32f10x_rcc.c(时钟配置相关)

用户代码:

※USER/main.c

※USER/stm32f10x_it.c(中断服务程序,此处没有用到)

※USER/led.c、led.h及其它

/*****************************************

led.c

******************************************/

#include "stm32f10x.h"
#include "led.h"

/************************************************************

硬件连接 LED------>GPIOB.8

*************************************************************/
void LED_Init(void)
{
//定义一个GPIO_InitTypeDef类型的的结构体
GPIO_InitTypeDef GPIO_InitStructure;
//开启GPIOB的外设时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
//选择需要控制的引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
//设置引脚模式为通用推挽输出,因为本次活动的原理图中LED用GPIO驱动的,为了提高驱动能力,故选择推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
//设置引脚速率为50MHz
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//调用库函数初始化GPIOB
GPIO_Init(GPIOB,&GPIO_InitStructure);
//默认关闭LED灯,输出高电平关闭,低电平开启
GPIO_SetBits(GPIOB,GPIO_Pin_8);
}

/***********************************************

端口模式借鉴正点原子的做法,使用起来很方便

port.h

************************************************/

#ifndef __PORT_H
#define __PORT_H
#include "stm32f10x.h"

//便于GPIO的操作,这里引入宏定义,定义GPIO输入还是输出
//IO口操作宏定义
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))

//IO口地址映射
#define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C
#define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C
#define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C
#define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C
#define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C
#define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C
#define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C

#define GPIOA_IDR_Addr    (GPIOA_BASE+8) //0x40010808
#define GPIOB_IDR_Addr    (GPIOB_BASE+8) //0x40010C08
#define GPIOC_IDR_Addr    (GPIOC_BASE+8) //0x40011008
#define GPIOD_IDR_Addr    (GPIOD_BASE+8) //0x40011408
#define GPIOE_IDR_Addr    (GPIOE_BASE+8) //0x40011808
#define GPIOF_IDR_Addr    (GPIOF_BASE+8) //0x40011A08
#define GPIOG_IDR_Addr    (GPIOG_BASE+8) //0x40011E08

//IO口操作,只对单一的IO口!
//确保n的值小于16!
#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //输出
#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //输入

#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出
#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //输入

#define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //输出
#define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //输入

#define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //输出
#define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //输入

#define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //输出
#define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //输入

#define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //输出
#define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //输入

#define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //输出
#define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //输入

#endif


/***************************************************

main.c

****************************************************/

#include "stm32f10x.h"
#include
#include "led.h"

int main(void)
{
LED_Init();//LED初始化
while(1)
{
LED = ON; //开启LED

}

}










共33条 2/4 1 2 3 4 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]