这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » jinchen1227的智能车DIY进程贴

共21条 2/3 1 2 3 跳转至
菜鸟
2015-10-09 09:30:24     打赏
11楼

八、蓝牙通讯实验


通过原理图来看,小车与蓝牙模块的通信应该是通过串口来进行的:



所用引脚为PB10和PB11,查芯片手册可以看出是USART3的接收和发送口。



所以蓝牙控制的原理就是蓝牙模块接收手机客户端发送的指令,通过串口把规定好的指令发送给mcu,产生串口中断,然后mcu控制电机进行相应的动作。查看相关串口程序,串口的初始化:

void uart3_init(u32 pclk2,u32 bound)
{  	 
	float temp;
	u16 mantissa;
	u16 fraction;	   
	temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
	mantissa=temp;				 //得到整数部分
	fraction=(temp-mantissa)*16; //得到小数部分	 
  mantissa<<=4; mantissa+=fraction; RCC->APB2ENR|=1<<3; //使能PORTB口时钟 RCC->APB1ENR|=1<<18; //使能串口时钟 GPIOB->CRH&=0XFFFF00FF; 
	GPIOB->CRH|=0X00008B00;//IO状态设置
	GPIOB->ODR|=1<<10; RCC->APB1RSTR|=1<<18; //复位串口1 RCC->APB1RSTR&=~(1<<18);//停止复位 //波特率设置 USART3->BRR=mantissa; // 波特率设置	 
	USART3->CR1|=0X200C;  //1位停止,无校验位.
	//使能接收中断
	USART3->CR1|=1<<8; //PE中断使能 USART3->CR1|=1<<5; //接收缓冲区非空中断使能 MY_NVIC_Init(3,3,USART3_IRQn,2);//组2,最低优先级 }

串口的中断程序:

void USART3_IRQHandler(void)
{	
	if(USART3->SR&(1<<5))//接收到数据
	{	  
	 static	int uart_receive=0;//蓝牙接收相关变量
		uart_receive=USART3->DR; 
		if(uart_receive<10)    mode_data[0]=uart_receive;

			if((mode_data[0]==six_data_2[0]
			&&mode_data[1]==six_data_2[1]
			&&mode_data[2]==six_data_2[2]
			&&mode_data[3]==six_data_2[3])
			||(mode_data[0]==six_data_1[0]
			&&mode_data[1]==six_data_1[1]
			&&mode_data[2]==six_data_1[2]
			&&mode_data[3]==six_data_1[3]))
		{	
			Flag_Stop=!Flag_Stop;
			mode_data[0]=0;	mode_data[1]=0;	mode_data[2]=0;	mode_data[3]=0;
		}
		if(uart_receive==0x00)	Flag_Qian=0,Flag_Hou=0,Flag_Left=0,Flag_Right=0;//////////////刹车
		if(uart_receive==0x01)	Flag_Qian=1,Flag_Hou=0,Flag_Left=0,Flag_Right=0;//////////////前
		if(uart_receive==0x05)	Flag_Qian=0,Flag_Hou=1,Flag_Left=0,Flag_Right=0;//////////////后
		else if(uart_receive==0x02||uart_receive==0x03||uart_receive==0x04)	
													Flag_Qian=0,Flag_Hou=0,Flag_Left=0,Flag_Right=1;
		else if(uart_receive==0x06||uart_receive==0x07||uart_receive==0x08)	
													Flag_Qian=0,Flag_Hou=0,Flag_Left=1,Flag_Right=0;

		mode_data[7]=mode_data[6];
		mode_data[6]=mode_data[5];
		mode_data[5]=mode_data[4];
		mode_data[4]=mode_data[3];
		mode_data[3]=mode_data[2];
		mode_data[2]=mode_data[1];
		mode_data[1]=mode_data[0];
	}  											 
} 

 

可以看出,通过蓝牙指令可以修改以下几个值,就可以控制小车做出动作。

Flag_Qian,Flag_Hou,Flag_Left,Flag_Right



菜鸟
2015-10-15 19:26:47     打赏
12楼

九、基于模型的平衡车设计概述


概述

本文作为技术贴,主要是以两轮自平衡车为研究对象,介绍采用先进的“基于模型的设计”方法进行机电控制系统的开发,讲解“基于模型的设计”的理念和优势、开发工具,涉及到机电系统建模、控制算法设计、自动代码生成等关键技术。

由于时间和水平有限,本文更多的是作为知识普及和原理介绍,为控制系统开发人员提供思路,故下面的内容多少会有很多不足和纰漏之处,请大家谅解和多多指导。

基于模型的设计概述

下面简单介绍下:什么是模型?什么是基于模型的设计?为什么要用基于模型的设计?

什么是模型

本文提到的模型主要是指数学模型。以控制系统为例,可分为被控对象和控制器。通常,被控对象可以通过数学建模方法得到,如下图中的直流电机,可以通过物理原理分析,建立系统方程,再通过建模工具建立模型;控制器模型根据系统任务、要求及被控对象模型特性进行设计,可以通过图形化的方法进行搭建,再通过仿真、优化等方法进行参数调节。



什么是基于模型的设计

基于模型的设计,即Model-Based Design,简称MBD,是一种采用模型仿真来开发、测试软件的设计技术,包括:可执行的规范、仿真与设计、自动代码生成和持续不断的测试和验证4部分要点。与传统的开发方式不同,基于模型的设计是以数学模型为核心,将前期的方案验证、详细设计、软件实现和系统测试都贯穿起来,不断地复用模型,细化模型。

以控制系统的开发为例,进行说明。首先,设计人员根据设计方案来搭建系统仿真模型,并进行仿真,验证方案是否合理;然后,通过各种仿真设计工具对控制系统进行详细设计;其次,将经过仿真验证的控制算法模型,自动生成代码,集成到实际的控制器中;最后,进行系统集成,如果发现问题,则可追溯到模型的某个部分,进行修改和迭代。

为什么用基于模型的设计

基于模型的设计是在当前控制系统的发展趋势和传统开发流程越来越不满足要求的情形下才产生的。在当今,控制系统已经融入到我们的生活、工作各个方面,出现越来越多的智能控制系统,算法的作用和软件的功能越来越重要。以一个商用车为例,目前的代码量已经达到了几千万行。所以对开发人员的要求和挑战越来越高。

传统的开发流程采用瀑布式,包括方案、设计、实现和测试,即前期根据经验来做设计方案,通过手写代码实现,当系统完成后才能进行充分的测试,这时难免会发现很多问题,而需要不断地返工,使得开发周期长、人力成本高。

基于模型的设计为了弥补传统流程的缺陷,提供了一系列的工具,使得:

(1)在开发的早期发现错误;

(2)通过模型验证提高了测试效率;

(3)提高了开发者之间的沟通效率;

(4)自动生成代码减少了编码时间和编码错误。


工具的选用

目前,对于控制系统的开发来说,主流的工具是美国Mathwork公司推出的MATLAB软件。MATLAB2006年开始,每年有2个版本更新,目前最新版本是R2015b。在大多数人眼里,可能MATLAB就是个做数学运算的软件。但其实MATLAB可以作为一个产品开发工具来使用。从下图可以看出,MATLAB包含很多工具箱,主要分成MATLABSimulink两大部分。MATLAB是所有模块的基础,通过M代码进行运算、画图、分析等,在此基础上针对不同领域有不同的toolbox,如控制、图像、信号等;SimulinkMATLAB基础上的用于系统建模仿真的图形化工具,同样有不同应用领域的扩展模型库;而作为连接仿真研究和实际应用的桥梁,MATLAB推出了一系列的代码生成工具,如MATLAB coderEmbedded coder可分别将M函数、mdl模型自动生成C源代码,这样免去了手写代码的麻烦和可能出现的问题。

小结

想进一步了解“基于模型的设计”,可以看mathwork官网上的视频短片和相关案例,推荐看刘杰老师的相关书籍。

再提一点,学习MATLAB的方法,一定要重视MATLABhelp,里面有很多资源和例程,还有mathwork官网上定期录制的网络研讨会视频可作为入门学习材料。



菜鸟
2015-10-15 19:29:58     打赏
13楼

十、两轮平衡车基于模型的设计流程


下面以两轮自平衡车的控制系统开发为例,介绍MBD流程和MATLAB相关软件的应用。

概述

对于两轮自平衡车来说,也许有人会说网上有很多现成的资源,可以直接拿来用,没有必要花时间先去做仿真。其实,这样做也没有问题。因为MBD是为了解决设计过程中遇到的问题才出现的,而不是为了用MBD而去用MBD。当需要开发一个新系统的时候,如果采用传统的流程难免会出现后期大量调试修改的问题,而采用MBD可以一定程度上避免这些问题。再者,对于一个老系统的改造,也可以采用MBD进行研究,从而获得更好的性能。

故,对于两轮自平衡车,应用MBD的好处在于可以开发新的算法、采用新的设计方案或者优化当前的控制性能。比如,可以通过MATLAB建模仿真,设计避障算法,设计走“8字”算法等等。

在本文中,主要介绍下面这些内容:

(1)使用MATLAB软件对两轮车进行数学建模,包括白箱法和物理建模法;

(2)使用MATLAB软件设计PID控制器,卡尔曼滤波器和走8字算法;

(3)MATLABSTM32芯片的自动代码生成及集成方法。

对于控制系统的设计,可以按照下面的流程进行。

(1)首先,要根据物理系统特性或实验数据建立被控对象的数学模型;

(2)然后根据功能要求来设计控制算法,并通过闭环仿真来验证是否满足要求;

(3)接着,可通过半实物仿真的方式将控制算法模型下载到实时仿真平台中,与实际被控对象连接,来快速验证控制算法的有效性和实时性;

(4)再次,将验证过的控制算法模型,自动生成嵌入式代码下载到实际硬件控制器中,可以进行SIL软件在环、PIL处理器在环测试;

(5)再次,同样通过半实物仿真的方式将被控对象模型下载到实时仿真平台中,与实际的控制器构成闭环,进行硬件在回路HIL仿真;

(6)最后,将实际的控制器与实际的被控对象进行系统联调。

被控对象建模

第一步,要建立两轮车被控对象模型。首先,要熟悉被控对象的组成,识别输入和输出,掌握基本特性;其次,采用MATLAB工具进行建模。

两轮车的被控对象包括车轮、电机、支架及其上面放置的驱动板、传感器等,这是一个多变量系统,输入是控制器输出的电机驱动信号PWM,状态变量包括:陀螺仪测得的车体角位移、角速度,编码器采集的电机转角、转速等。

在本文中,使用SimulinkSimMechanics进行被控对象建模。

控制算法设计

在被控对象模型搭建完成后,就可以设计控制算法了。MATLAB提供了很多专业的工具,可以进行被控对象的特性分析,通过时域或频域方法进行校正设计,采用模糊、神经网络、鲁棒控制等工具箱进行高级算法设计等。

两轮车的控制设计任务包括:设计自稳定控制算法,能使车体保持直立;设计陀螺仪的信号处理算法;设计“走8字”控制算法。

在本文中,使用Simulink Control DesignSimulinkStateflow等来设计、调节控制算法。

离线仿真验证

当控制器设计完成后,需要进行大量的仿真验证工作。通过设置不同的期望参考信号、扰动信号,来进行离线仿真,验证在各种情况下,整个系统是否能满足设计要求。

自动代码生成

当控制算法经过仿真验证之后,就可以自动生成代码了。针对具体的应用,需要采用不同的方法,可以分成2种情况:1、如果采用的控制芯片是MATLABEmbedded coder所支持的,那么IO接口驱动部分都已经有现成的驱动模块了,只需要将算法模型的输入、输出等与对应的IO驱动模块相连,配置好参数,就可以一键自动代码生成、下载了;2、如果采用的控制芯片不是Embedded coder所支持的,那么可以手写IO驱动代码和主函数等,只将控制算法模型生成C源代码,然后手动集成到工程中。

针对小车采用的STM32-F1芯片,MATLAB没有官方支持的库,这里采用的是第三方的库,需要从ST官网下载驱动库程序包STM32-MAT

说明

对于两轮车来说,一个理想的MBD过程,应该是从头到尾,用到的都是MATLAB模型,一键就能把模型下载到控制板中,然后小车就能够正常工作。能做到这一点其实很不容易,首先,这样的模型中就需要包括算法部分、驱动部分,能在多个任务中进行切换;其次,被控对象模型要与实物的特性相近,这样设计的控制算法才能直接应用在实物中。

但是,由于小车被控对象中的很多参数是未知的,如转动惯量、摩擦等,故很难建立精确的仿真模型。而且,针对小车采用的STM32-F1芯片,MATLAB没有官方支持的库,这里采用的是第三方库,笔者在使用I2C和串口进行通信时都遇到了各种问题。

故本文更多的是作为启发和科普性介绍,希望有兴趣的同学能更进一步。


菜鸟
2015-10-15 19:37:13     打赏
14楼

十一、基于模型的两轮车典型案例


典型的案例

这里给出一个成功的案例,为想进一步研究如何在两轮车上应用MBD的同学提供参考。这是一个采用MBD进行机电控制产品开发的典型案例。

概述

这是以LegoNXT机器人为平台进行自平衡两轮车的设计项目。相关资料和模型可以从mathwork官网上下载。


在这个案例中,制作团队开发了针对ARMIO驱动模块库,推导了被控对象的状态空间方程并测量了各个模型参数,设计了自平衡、避障等控制算法,能够通过蓝牙和手柄进行控制,使用MATLAB的虚拟现实工具箱进行可视化的仿真测试等等。

当开发人员想做自己的机电控制产品的时候,可以以这个为模板进行参考,积累自己的模型库、算法库和驱动库。当提出一个新的设想后,能够很快地搭建模型,进行仿真验证,而且能直接应用到硬件中,这样设计人员的主要精力都集中在了算法的研究和创新点的提出上,不必在耗费太多时间去进行手动编码和测试,这样能更快更好地做出新产品。


仿真模型

下面是仿真模型示意图,包括:参考信号输出子系统、环境设置子系统、控制器、小车本体、信号查看子系统。

说明

上面的系统用到的软件、硬件资源以及相关执行器、传感器如下图所示。

整个案例实现了如下目标:

(1)稳定系统,实现自平衡;

(2)伺服控制,实现精确定位;

(3)转向控制;

(4)避障;

(5)远程控制。

通过离线仿真验证,证明了设计的控制算法能达到设计要求。自动生成的代码也成功地应用在了实物中,实现了期望的功能。


菜鸟
2015-10-15 21:45:23     打赏
15楼

十二、两轮平衡车的建模

概述

主要介绍使用MATLAB工具创建被控对象的一般建模方法,并以两轮车为例,介绍2种建模方法的实际应用。

建模方法

如下图所示,汇总了几种常用的建模方法,适用于不同的情况。

(1)白箱法,也叫首要原则建模法。当系统的组成、原理及参数都很清楚的时候,可以推导数学方程,然后用Simulink图形模块进行搭建;

(2)黑箱法,也叫系统辨识。当对系统的特性无法完全了解的时候,可以通过激励实验的方法,获取反应系统特性的数据,然后通过数学运算,使用System Identification Toolbox辨识系统的数学模型;

(3)灰箱法,也叫参数估计法。当对系统的特性有一定了解但是一些元件参数无法精确得到的时候,可以先搭建系统的数学方程,然后利用实验数据对原模型进行参数校正,主要使用Simulink Design Optimization中的Parameter Estimation功能,调用优化工具箱;

(4)物理建模法,与白箱法类似,也需要了解系统的组成,但不需要推导方程,而是根据实际的物理连接方式将各个物理元件模块连接起来,使用多域物理建模平台Simscape及其各个扩展模型库。




MATLAB提供了各种建模工具:


两轮车的建模

下面以两轮车为例,介绍如何使用MATLAB工具进行建模。由于本项目中,对于两轮车的质量、转动惯量等参数无法获取,故没有真正实现。

白箱法

很多论文里都对两轮车的方程进行了理论推导,在此不做详细描述,只是引入一下。

基本步骤是:先画出两轮车的结构简图,进行力平衡分析;再建立平衡方程并化简;进行线性化处理;最终整理得到状态空间方程。



当状态空间方程推导完成之后,就可以利用Simulink进行建模了。从Simulink的连续系统模块库里选择“State-Space”模块,打开其参数设置界面,将状态矩阵A、输入矩阵B、输出矩阵C、直接矩阵D输入到对应的文本框中,示意图如下图所示。


物理建模方法

从上面的描述可知,对于像两轮车这样的复杂多体系统,如果采用白箱法建模,需要进行大量的理论推导、计算。在这种情况下,可以采用物理建模的方法。

MATLAB提供了多体系统的物理建模工具---SimMechanics,能实现:

(1)扩展了SimScape功能,提供了用于建立3-D机械系统模型的环境;

(2)使用仿真分析的方法分析运动和力,系统的动力学以可视化的形式展示;

(3)提供了刚体、各种约束副、传感和驱动等模块;

(4)可集成SolidWorksProEngineerCAD模型。



针对两轮车的建模,采用SimMechanics2代工具进行建模,可以分成如下几步:

(1)对实际机构进行化简,提取主要的结构及组成、连接方式,即可化简为左轮、右轮、连接轴、车身;

(2)使用solid模块分别设置各个主要元件的形状和转动惯量等参数;

(3)选择某个元件为参考点,逐步搭建其他各个连接的元件,本文以车身为参考点,分别设置了与参考地面的平动、转动约束副;与连接轴的刚性连接;刚性轴与轮子的转动副等;

(4)在轮子的转动副上添加驱动、传感接口,即可通过Simulink信号模块提供力矩信号,可输出转角信号;在车身的转动副上添加传感接口,即可输出俯仰角信号。

要实现车轮转过一点角度,对应的车子整体平动一端距离,本文采用的方法是:将车轮的转角信号通过车轮半径的计算转化为平动距离,然后再输入给车身的平动副。



在上面模型的基础上进行进一步修改,实现两轮车在X-Y平面内的转弯运动。首先,需要进行运动学分析,推导左、右车轮的转速与车身在X方向、Y方向的移动速度之间的转换关系。


模型仿真

下面通过设置左、右车轮不同的转速信号,验证小车是否能够实现转弯动作。

仿真过程视频:


视频地址:http://player.youku.com/player.php/sid/XMTM2MDU0MzM2NA==/v.swf







菜鸟
2015-10-16 10:13:40     打赏
16楼

十三、两轮平衡车算法设计(1)PID算法


主要介绍使用MATLAB工具进行PID控制器设计


PID控制器设计

本节介绍:什么是PIDPID的几种设计方法?

什么是PID

PID,即比例-积分-微分控制,是一种控制算法,它将当前的信息(误差)、过去的信息(误差的积分)、将来的信息(误差的微分)进行了综合运用。首先,要搞清楚它不只是一段代码,PID可以是模拟控制,如采用模拟电路搭建,也可以是计算机控制,如采用C语言进行编程;其次,PID是实现闭环控制,其输入是参考信号与实际输出信号的误差;再次,PID控制之所以应用非常广泛,是因为PID有很好的适用性,能够应用到各个系统,而且非常简单,不需要复杂的计算;对于PID的设计,大多数只是PID控制参数的调节,有很多计算方法,而且可以通过经验进行试凑得到;最后,PID控制器可以有多种变形,也可以灵活地组合,形成P控制、PI控制、PD控制等。

PID控制器有3个参数,分别是比例系数Kp、积分时间常数Ti、微分时间常数Td,这3个参数决定了控制系统的性能。要想获得良好的控制性能,就需要合理地设置这些参数。调节PID控制参数的过程,叫做PID整定。

1)比例作用

    Kp增大,系统振荡增强,稳定性下降;

    Kp增大,系统静差减小,但不能消除静差。

2)积分作用

    Ti减小,积分作用增强,可消除静差;

    Ti减小,系统振荡增强,稳定性下降。

3)微分作用

   Td增大,调节时间减小,快速性增强;

   Td增大,系统抗干扰能力减弱。

PID设计方法

1、经验试凑法

试凑法是通过模拟或实际的闭环运行情况,观察系统的响应曲线,然后根据各调节参数对系统响应的大致影响,反复试凑参数,以达到满意的响应。一般做法是:先比例,后积分,再微分。

这种方法的优点在于,不依赖于被控对象的数学模型,故不管是专家还是操作员都可以根据经验来试凑得到,缺点在于整定过程依赖人的经验,不同的人可能得到不同的结果,而且比较耗时,很难得到最优的结果。

整定步骤:

(1)整定比例控制。将比例控制作用由小变到大,观察各次响应,直至得到反应快、超调小的响应曲线;

(2)整定积分环节。若在比例控制下稳态误差不能满足要求,需加入积分控制。先将步骤(1)中选择的比例系数减小为原来的5080%,再将积分时间置一个较大值,观测响应曲线。然后减小积分时间,加大积分作用,并相应调整比例系数,反复试凑至得到较满意的响应,确定比例和积分的参数;

(3)整定微分环节。若经过步骤(2),PI控制只能消除稳态误差,而动态过程不能令人满意,则应加入微分控制,构成PID控制。先置微分时间TD=0,逐渐加大TD,同时相应地改变比例系数和积分时间,反复试凑至获得满意的控制效果和PID控制参数。

2、工程整定法

为了简化PID的整定过程,使其系统化、理论化,很多专家、学者提出了很多理论计算方法,形成了很多PID整定公式,如Z-N法、C-C法、K-T法、内模整定法等等。这些方法很多都是基于被控对象的简化模型,结合期望的设计指标,推导出了PID参数的计算公式。如下表是经典的Z-N整定法,原理是将被控对象化简为一阶惯性加延迟系统,以衰减比4:1为目标,得到的PID参数的计算公式。

这种方法的优点在于,提供了理论依据,能够直接应用公式进行计算,缺点在于大多数算法针对线性稳定系统,无法应用于非线性不稳定系统。

控制器

类型

根据FOPDT

根据临界点

a=K /T

Tu=2*pi / Wu

Kp

Ti

Td

Kp

Ti

Td

P

1/ a

 

 

0.5Ku

 

 

PI

0.9/ a

3L

 

0.4Ku

0.8Tu

 

PID

1.2/ a

2 L

L/2

0.6Ku

0.5Tu

0.12Tu

 

2、MATLAB提供的工具

MATLAB 2010版本之后提供了一个针对PID控制器整定的工具---PID Tuner,能够通过GUI操作进行PID调节,无需计算,非常地快速、方便。

操作过程:可从Simulink的连续系统库中找到PID controller模块,将其添加到控制回路中,打开其参数设置界面;点击“Tune”按钮,则会自动弹出PID tuner图形界面;在界面上拖动下方的“Response time”滑块,则可自动调节控制性能,并自动计算满足要求的PID参数。

原理:点击“Tune”之后,后台首先自动调用线性化工具,对PID的被控对象进行线性化处理,得到传递函数;之后,根据GUI界面上设置的闭环系统指标,采用一套算法自动计算得到满足指标要求的PID参数。

两轮车中的PID设计

对于两轮车的自平衡控制,可以将其简化为倒立摆设计问题,一般采用PD控制算法,以车身与垂直方向的夹角和角速度作为输入,输出控制信号给车轮。

此系统为不稳定系统,故采用经典的整定算法,如Z-N等无法适用。本文推荐采用经验法或PID Tuner工具进行设计。

对于经验法来说,可以想象成将一个木棍放在人的手指上,人通过移动手指使木棍保持直立。要实现这个功能,凭借人的经验就可以完成,比如木棍向前方倾斜了,则手指向前送,这里就相当于P控制;加入预判断,比如感觉木棍会向前方倾斜,则手指提前向前方送,这里就相当于D控制。木棍的倾斜程度导致手指产生多大的动作,对应于PD不同的参数。

故,对于两轮车的自平衡来说,采用PD控制可以实现自稳定。在参数调试时,可以采用经验法,先给比例控制,能让小车在倾斜时产生动作,而不至于突然摔倒,之后再加入微分控制,进一步提高稳定性。

下面对于前面使用SimMechanics创建的被控对象采用PD控制算法进行控制,通过仿真验证算法是否能使两轮车自平衡。

有兴趣的同学,可以进一步采用PID Tuner或理论计算方法进行参数整定。

小结

想进一步深入学习PID控制的同学,推荐学习“Advanced PID control”这本书。


菜鸟
2015-10-16 10:20:42     打赏
17楼

十四、两轮平衡车算法设计(2)卡尔曼滤波算法


卡尔曼滤波器设计

本节主要简单介绍卡尔曼滤波器的基本概念和用MATLAB进行卡尔曼滤波器的设计。

什么是卡尔曼滤波

为了消除信号中的高频噪声,使用低通滤波器将高于所关心频段的那些信号进行滤除。而当信号中的噪声为随机信号时,低通滤波器就无法完全消除了,这时可以利用卡尔曼滤波器。

卡尔曼滤波(Kalman filtering)一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法。Kalman滤波在测量方差已知的情况下能够从一系列存在测量噪声的数据中,估计动态系统的状态。由于,它便于计算机编程实现,并能够对现场采集的数据进行实时的更新和处理,Kalman滤波是目前应用最为广泛的滤波方法,在通信、导航、制导与控制等多领域得到了较好的应用。



卡尔曼滤波的算法流程为:





为什么用matlab仿真研究卡尔曼滤波

通过上面的算法描述可以看出,卡尔曼滤波算法中包括很多矩阵计算过程,而且需要设置矩阵A\B及噪声协方差等参数。使用MATLAB\Simulink可以很方便地搭建卡尔曼滤波器模型,能够通过仿真来验证滤波结果从而调节这些滤波参数直到达到满意的效果。




两轮车中的卡尔曼滤波器设计

在两轮车中应用卡尔曼滤波,主要是根据陀螺仪反馈的俯仰角速度来估计俯仰角。具有如下关系:


则系统的状态方程和量测方程为:


在具体测试时,可以通过MPU6050传感器的I2C接口将陀螺仪信号传输给控制板,然后再通过控制板的串口将数据传输给PC机,保存一定的实验数据。然后将数据文件导入到MATLAB中,使用From Workspace模块将实验数据作为信号源输入给卡尔曼滤波模块,运行仿真,查看滤波器的输出,分析滤波结果。



菜鸟
2015-10-16 10:37:58     打赏
18楼

十五、走8字算法仿真


介绍一个简单的实现两轮车走8字的算法。原理就是当左轮和右轮的转速不一致时,两轮车就会转弯,当转过一个圆周之后,再重设速度。如首先设置左轮速度为5,右轮速度为1,则两轮车顺时针转动,通过特定的时间,两轮车回到初始点,此时,令左轮速度为1,右轮速度为5,则两轮车会逆时针转动,如此反复。



可以看出,整个过程两轮车运行在两种状态:顺时针转动,逆时针转动。这里使用MATLAB的有限状态机建模仿真工具Stateflow搭建相应的模式切换模块。如下图所示,分成clockanticlock两个状态,分别设置左、右轮转速,以时钟作为输入信号,当达到一定时间后,从一种状态切换到另一种状态。



仿真过程视频:


视频地址:http://player.youku.com/player.php/sid/XMTM2MDU0NDAxNg==/v.swf



菜鸟
2015-10-20 08:35:18     打赏
19楼

十六、自动算法生成


概述

主要介绍MATLAB的自动代码生成相关知识及工具,并针对两轮车的STM32芯片,介绍代码生成、集成方法及例程。

自动代码生成

本节介绍:什么是自动代码生成?为什么要用自动代码生成?MATLAB提供了哪些代码生成工具?

什么是自动代码生成

众所周知,MATLAB是一种仿真工具,所用的语法是解释性编程语言,不管是M语言代码还是Simulink图形化模型都无法直接应用的实际的控制器中。故,很多人也只是把MATLABSimulink作为研究工具,通过仿真对系统和算法进行定性研究,之后再通过手写代码实现算法。这样形成了仿真研究和实际应用的脱节。而自动代码生成技术及工具的出现,则架起了之间的桥梁,实现了算法研究和应用的一致性和快速性。

自动代码生成是指不用手写代码,而是通过代码生成工具将MATLAB的函数文件、模型文件自动转换为CC++源代码。

为什么用自动代码生成

通过使用自动代码生成,可以:

(1)避免在Simulink模型中手写代码;

(2)消除手写代码的错误;

(3)保持代码质量的一致性;

(4)通过一键点击重生成代码。

也许有人会质疑自动生成的代码的可靠性和效率。下面是一篇外文文献提供的数据,经过验证可知,在ROMRAM的占用上,自动生成的代码和手写代码能基本一致。当然,这需要熟练掌握自动代码生成工具,能够根据实际需要来适当配置相关参数,这样能够提供代码的效率和可读性。

在当前,很多国外的军工和汽车电子产品开发都应用到了自动代码生成技术。感兴趣的同学可以从mathwork官网上查看相关案例。


自动代码生成工具

MATLAB提供了很多代码生成工具。

(1)MATLAB Coder---MATLAB函数生成C/C++代码,可支持将图形、信号处理等工具箱中的高级函数;

(2)Simulink Coder(以前叫RTW---SimulinkStateflow模型生成C/C++代码,主要针对实时仿真平台实现半实物仿真或非实时系统实现快速仿真运行;

(3)Embedded Coder---SimulinkStateflow模型生成高质量、可优化的C/C++代码,针对嵌入式平台。

(4)HDL Coder--- FPGA ASIC 设计生成 Verilog VHDL 代码;

(5)PLC Coder---为可编程逻辑控制器 (PLC) 和可编程自动化控制器 (PAC) 设备生成 IEC 61131 结构化语句。

通常,开发控制系统要用到Embedded Coder。下面着重介绍:

Embedded Coder 可以针对支持的嵌入式处理器、面向目标的快速控制原型板,及微处理器的需要和微处理器生成代码,它提供了配置选项和可以更好的控制生成代码的函数、文件和数据的高级优化选项,因此它扩展了 MATLAB Coder Simulink CoderEmbedded Coder 提高了代码效率,并且能很方便的集成已有代码,数据类型和产品中的标定参数。

因为在实际的控制器中运行的代码除了控制算法,还要用IO驱动代码、底层系统等,故要想实际应用嵌入式代码生成,可以有2种方式:

1)只生成算法代码。这种方法是通用的,不限定于指定的芯片。只通过Embedded coder将控制算法部分生成C源代码,而IO驱动代码等通过手写完成,之后将算法代码集成到项目工程中;

2)生成算法+驱动代码。这种方法需要具备指定芯片的IO驱动模块。Embedded coder提供了一些TI等芯片的驱动库,能够直接利用;而不在支持列表中的芯片,则需要用户自己开发这些IO驱动模块。

 


Embedded Coder自动生成的代码文件如下图所示。

想要进一步了解的同学,可以从mathwork官网查看相关介绍材料和视频,还有刘杰老师的书籍。


两轮车中的自动代码生成

下面着重介绍针对两轮车采用的STM32芯片---STM32 F103C8T6,如何实现MATLAB的自动代码生成及下载。

工具

本项目中,采用的相关工具如下:

(1)基于stm32f103c8的开发板(与小车使用的芯片一致)

(2)MATLAB R2014a 32位;

(3)ST官司推出的STM32驱动库---STM32-MAT 版本4.1

(4)ST官司推出的STM32图形化配置工具---STM32CubeMX 版本4.8

(5)编译工具---Keil 4 MDK-ARM 版本4.73

 

下载地址:

http://www.st.com/web/en/catalog/tools/PF258513

http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1533/PF259242?s_searchtype=keyword

STM32的自动代码生成流程

1、安装STM32驱动库,并导入MATLAB


2、搭建Simulink模型,并进行仿真验证;

3、设置模型求解器为定步长求解器,设置步长大小;


4、设置代码生成系统目标文件为stm32.tlc;



5、在模型中添加STM32_Config模块,双击打开配置界面;

6、选择或创建新的ioc文件,自动弹出STM32 CubeMX,创建工程,设置芯片类型,设置引脚功能;设置编译器为Keil



7、在模型中添加IO驱动模块,并配置;



8、点击“build”按钮或“Ctrl+B”,则自动将模型生成代码,并创建keil工程,打开keil软件;

9、keil上编译工程,之后下载到芯片中。


STM32自动代码生成例子

下面是一个简单的LED灯闪烁的例程。

1、通过查看开发板产品手册,找到LED灯对应的控制引脚为PB1

2、搭建模型,添加脉冲输出模块,设置周期和占空比等参数;

3、创建STM32 CubeMX工程;


4、设置GPIO输出模块;


5、自动生成的代码示例。


6、使用Keil编译工程,生成hex文件;



7、可使用PZISP烧录软件,将hex文件通过USB下载到控制板中。


助工
2015-10-23 22:58:50     打赏
20楼
matlab很方便啊,顶一个,楼主加油!

共21条 2/3 1 2 3 跳转至

回复

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