基于DSP的智能轮椅仿真设计

关键词:轮椅  DSP  老龄化  弱势群体  智能

针对需要特殊护理人群的市场需求,设计了一种基于人机工程学的多功能智能轮椅。通过市场调研和社会调查,在老龄化日趋严重的当今社会,现在社会对轮椅需求量不断加大,他们需要类似轮椅这样的的工具辅助他们完成一些必要活动,而市场上的轮椅要么是无智能的普通轮椅或价格过于高昂的智能轮椅。两种轮椅都无法满足大部分身体不便且经济实力一般的人群。因此,越来越多的设计人员投入到轮椅的设计当中。手动轮椅的优势在于其方便携带、质量轻、价格非常廉价。但手动轮椅需要人推动才能前进,因此,需要使用者有健康的上肢或者需要有护理人员长期陪同,这对老年人或者上肢有严重残疾的人来说,有些是无法实现的。对于这样的人群来说,电动轮椅是他们的更好选择。现在国内市场上的很多智能轮椅,仅限于自主移动,功能过于简单,而国外高性能智能轮椅的发展水平要远远领先于国内,国外智能轮椅主要的供应商也大多集中于欧美发达国家,但是他们的产品销售价格却很昂贵,对于国内大多数残疾人来说是很难支付的。因此,研制一种结构可靠、便于操作而且价格又相对适中的多功能智能轮椅成为设计焦点,不仅能为老年人或者下肢有残疾的人提供性能优良和安全可靠的代步工具,也可以提升他们的生活水平。所以,我们决定仿真一款可以加速减速,改变运动方向,可以亮灯示警和鸣笛呼救的按键款智能轮椅。

 

我们设计的智能轮椅仿真系统主要基于DSP的ICETEK实验箱,根据我们的设计思路和设计原则,我们选用了以下几个模块完成不同的功能:

  1. 提示灯——用最直接的灯光显示方式对应不同的功能按键按触情况,直截了当的告知使用者按键是否被按下,是否需要再次进行操作,防止有些上肢力气不足的使用者在面对按键操作的情况不知道自己的操作是否成功有效。
  2. 液晶显示屏——防止误触。因为有些使用者可能因为眼睛视力下降,或者因为上肢行动不便造成误触求助按键,这里设置了防止误触的功能,给使用者一定的缓冲时间让其纠正自己的操作,防止打扰到周围其他人,造成“狼来了”的事故。
  3. 交通灯——给周围人警示。交通灯不同的灯光对应了不同的情况,灯光白天夜晚都很显眼,很直接的给周围人提示,防止因为使用者操作不便或者操作缓慢,导致周围人避让不及造成不必要的伤害。
  4. 直流电机——发动机。通过直流电机的转速转向直接仿真轮椅的速度和运动方向。
  5. 键盘——按键。

因为老师让做dsp课设,需要自己想题目,所以这里做了智能轮椅,用到了硬件全部的模块,一下是我做的课设代码,仅供大家参考

main()
{
	unsigned char dbScanCode,dbOld;
 	
 	dbScanCode=dbOld=0;
 	nCount=nCount1=0;
 	PLL_Init(20);
	SDRAM_init();
	LBDS=0;
	InitCTR();
	InitMcBSP();
	
   
   	uN=50;
	 PCR1|=2;
 CTRLR=0x09;
   CTRLR=0x49;
    CTRGR=1;		
LBDS=0xf;
    InitInterrupt();
	TIME_init();

  for (;;)
    {
		if ( nCount1==0 )
		{
			dbScanCode=GetKey();
			if ( dbScanCode!=dbOld )
			{
			  dbOld=dbScanCode;
		          if ( dbScanCode==9 )
			  break;

                          switch(dbScanCode)
			  {  
                case 1:
				    CTRLR=0x09;//东西方向绿灯亮
				    CTRLR=0x49;//南北方向绿灯亮
                  uN=40;     //设置直流电机占空比为40,转速较快
                  PCR1|=2;   //直流电机顺时针旋转
				 LBDS=1;
				 
		           break;
		         case 2:
		           CTRLR=0x12;//东西方向黄灯亮
				    CTRLR=0x52;//南北方向黄灯亮
                 uN=30;     //设置直流电机占空比为30,转速逐渐加快
                  PCR1|=2;   //直流电机顺时针旋转
                  LBDS=3;
				 
		           break;
		         case 3:
		           CTRLR=0x24;//东西方向红灯亮
				     CTRLR=0x40;
                 uN=60;     //设置直流电机占空比为60,转速逐渐减慢
                  PCR1&=0x0fffd;//直流电机逆时针旋转
                  LBDS=8;
                    
		           break;   
		        
		         case 4:
		           CTRLR=0x12;//东西方向黄灯亮
				    CTRLR=0x52;//南北方向黄灯亮
			       uN=40;     //设置直流电机占空比为40,转速明显加快
                  PCR1&=0x0fffd;//直流电机逆时针旋转
                 LBDS=0xc;
		           break;
				 

                case 5:
				lcd();
		          CTRLR=0x24;//东西方向红灯亮
				   CTRLR=0x64;//南北方向红灯亮
				   uN=100; //设置直流电机占空比为100,停止
				   LBDS=0xf;
				   
				  fengmingqi();
				  
				 
		          break;
			}

			}
			Delay(16);	
		}
	}

	CloseCTR();
    exit(0);
}

主函数是主控模块,涉及到直流电机的运转,交通灯的点亮,蜂鸣器的鸣响

void lcd(){
		int i,nCount=0,nBW=0;

	PLL_Init(20);
	SDRAM_init();
	InitCTR();
	TurnOnLCD();				// 打开显示
	LCDCLS();				// 清除显示内存
	CTRLCDCMDR=LCDCMDSTARTLINE;		// 设置显示起始行
	Delay(LCDDELAY);
	CTRLCDCR=0;
	Delay(LCDDELAY);
	for (;;)
	{
		CTRLCDCMDR=LCDCMDPAGE;		// 设置操作页=0
		Delay(LCDDELAY);
		CTRLCDCR=0;
		Delay(LCDDELAY);
		CTRLCDCMDR=LCDCMDVERADDRESS;	// 起始列=0
		Delay(LCDDELAY);
		CTRLCDCR=0;
		Delay(LCDDELAY);
		for ( i=0;i<8;i++ )
		{
			CTRLCDLCR=( nBW==0 )?(ledkey[nCount][i]):(~ledkey[nCount][i]);	// 屏幕左侧第1至8行第i列赋值		port8002=0;			
			// (赋值后当前操作列自动加1,所以不需设置)
			Delay(LCDDELAY);
			CTRLCDCR=0;
			Delay(LCDDELAY);
		}
		Delay(520);
		nCount++;
		if ( nCount==10 )
		{
			nCount=0;
			nBW=1-nBW;
			break;
		}
	}
}

LCD显示屏的代码,可以让LCD显示屏实现一到九个数的计数

void fengmingqi(){
	int nMusicCount;
	int nWork;
	
 	PLL_Init(12);
	SDRAM_init();
	InitMcBSP();
	CTRSTATUS=0x88;
	CTRSTATUS=8;
	CTRSTATUS=0x88;
	CTRSTATUS=8;
   

    CTRGR=8;		// BUZZE=1 打开蜂鸣器, 见ICETEK-CTR的全局控制寄存器描述

    // 设置合适的音长和音高
    for ( nWork=0;nWork<nMusicNumber;nWork++ )
    {
    	music[nWork][0]*=3;
    	music[nWork][1]*=3;
	
	
    
    }

    // 设置DX0管脚为通用输出管脚以驱动蜂鸣器
//    SPCR0&=0x0fffeffff;	//  /XRST=0
//    PCR0|=0x2000;		// RIOEN=1
    InitInterrupt();
	TIME_init();
    nMusicCount=0;
    while ( 1 )
    {
		nMusicCount++;
		nMusicCount%=nMusicNumber;
		if ( music[nMusicCount][0]==0)
			*tcr0&=0x0fffffcff;		// 静音
		else
		{
			*prd0=music[nMusicCount][0];	// 切换音符
			*tcr0=0xe0;	
				*prd0=music[nMusicCount][1];
					
		}
		Delay(music[nMusicCount][1]);
		break;
    }
}

蜂鸣器的子程序,可以通过修改代码音长音高使蜂鸣器演奏不同的音乐

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

箬渊凡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值