SOPC课程设计报告.docx
《SOPC课程设计报告.docx》由会员分享,可在线阅读,更多相关《SOPC课程设计报告.docx(22页珍藏版)》请在冰豆网上搜索。
SOPC课程设计报告
中国地质大学(武汉)
机电学院电子信息工程专业
片
上
系
统
设
计
报
告
指导老师:
小组成员:
日期:
设计题目:
基于NIOSII软核的两轮自平衡小车
摘要:
本设计采用FPGA的SOPC技术利用在FPGA内部构建NIOSII软核并在软核中例化定时器模块、PWM模块、UART模块和外部中断等特定的IP核。
在规定10ms周期内CPU需要完成采集MPU6050陀螺仪和加速度计的数据,通过卡尔曼滤波计算出小车的姿态;通过外部中断触发方式采集电机自带编码器的输出脉冲信号,计算当前小车左右轮子车速;采用PID闭环控制算法,计算出维持车身姿态的电机驱动信号PWM波的占空比,驱动电机实现小车平衡。
关键词:
FPGA;SOPC;NIOSII;IP核;陀螺仪;卡尔曼滤波;PID算法
1.系统方案
1.1系统结构
1.1.1系统总体框架
图1系统整体框图
此设计的二轮平衡车系统主要分为以下功能模块:
(1)NiosII软核:
用来读取各传感器数据,进行算法运算,产生控制信号维持平衡车姿态。
(2)JTAG_UART:
用来下载程序和调试软件各部分功能。
(3)MPU6050:
六轴姿态传感器,内部集成三轴陀螺仪和三轴加速度计,用以检测小车姿态。
(4)蓝牙无线收发:
连接NiosII软核中的串口内置外设,用以将传感器数据发送给上位机,来进行小车算法调试。
(5)电机驱动:
用来将NiosII软核输出的PWM信号转换成电机驱动电流,驱动大功率电机正常运转。
(6)电机自带编码器:
用来检测小车左右两个电机的转速,反馈给软核用于下一步运动的解算。
本设计利用FPGA的SOPC功能在FPGA芯片内部利用SOPCBuilder设计符合系统要求的NiosII软核,在顶层文件中添加该软核和其他一些硬件资源(PLL,逻辑单元等)并完成引脚分配,最终实现实际电路的综合,配合NiosIIIDE开发软件,开发系统软核实现控制二轮小车直立等动作。
1.2.NIOSII软核
1.2.1NiosII软核整体框架
本系统根据两轮自平衡小车设计的实际需求,采用黑金动力的CycloneIV代核心板提供核心控制。
系统的硬件由一块FPGA芯片、MPU6050、电机驱动模块、编码及编码整形电路、外部存储SDRAM、外部串行FLASH(EPCS64)等几个模块构成。
FPGA芯片主要实现NiosII软核处理器和各种接口驱动等功能,其包括NiosII系统和外设两部分。
NiosII系统包括NiosII处理器、存储器、定时器、通用串行通讯接口、I2C接口、PWM接口和连接各个组件的Avalon总线。
其中I2CInterface实现与MPU6050的通信,PWM接口实现电机的速度控制,带中断的PIO实现速度编码器的信号捕获,实现车模的速度测量和运动方向测量,定时器Timer为系统控制提供精确的定时周期,通用串行通讯接口用于系统算法的调试。
软核整体结构,如图2所示。
图2NiosII系统框图
1.2.2NiosII软核使用资源
根据硬件结构及设计需要,使用QuartusII的SOPCBuilder构建了一个NiosII软核,除了建立了系统需要的硬件资源控制器如NiosIIProcessor、SDRAM、EPCS、JTAGUART调试模块;还为系统配备了硬件需要的接口如I2C接口、PWM控制器、电机方向控制接口、电机编码器输入接口等,为了方便调试;系统还预留了一些方便测试使用的LED接口、PIO_TEST测试专用接口等。
具体使用资源如下图所示。
图3CPU选型及存储配置
图4NIOSII软核资源
图5NIOSII软核资源(续)
1.2.3NiosII软核顶层文件和管脚分配
通过创建新的.bpf文件作为工程的顶层文件,在此文件中以图形方式进行NiosII软核例、PLL锁相环的配置和例化并进行相应的连线。
运行TCL脚本文件,实现NIOSII软核各接口引脚与外部硬件的真正互联,并对一些输入输出信号做相应的初始化。
通过PinPlanner进行引脚连接情况的检查。
具体使用情况如下图所示,图6为整体系统及接线情况,图7为整体引脚分部(此处使用的是黑金FPGA开发板提供的脚本文件)。
图6bpf文件中的连接情况
图7实际管脚分配
图8第一次构建软核成功后编译通过内部资源使用情况
1.3硬件选型及系统主要电路设计
1.3.1黑金核心板硬件资源
本设计采用黑金的CycloneIV核心板,能够最大限度的减小控制板占用的空间,同时核心板上集成有丰富的硬件存储资源和大量的外置引脚,功能完善,且能独立工作,适合此次课程设计的需求。
另外,配套资料非常丰富,适合我们初学者上手。
图9为核心板图片展示及资源。
图9黑金FPGA核心板
1、FPGA:
EP4CE15F17C8N
2、SDRAM:
256Mbit (16M*16bit)
3、SRAM:
4Mbit(256K*16bit)
4、串行FLASH:
64Mbit (EPCS64)
5、并行FLASH:
32Mbit (4M*8bit)
6、排座:
2.0mm22*2
7、双晶振:
50M/40M
8、IO数量:
扩展出的IO口有110根
9、下载方式:
支持AS模式和JTAG模式
10、自定义指示灯:
4个
11、复位按键:
1个
12、下载指示灯:
1个
1.3.2姿态传感器MPU6050
MPU-60X0是全球首例9轴运动处理传感器。
它集成了3轴MEMS陀螺仪,3轴MEMS加速度计,以及一个可扩展的数字运动处理器DMP(DigitalMotionProcessor),可用I2C接口连接一个第三方的数字传感器,比如磁力计。
扩展之后就可以通过其I2C或SPI接口输出一个9轴的信号(SPI接口仅在MPU-6000可用)。
MPU-60X0也可以通过其I2C接口连接非惯性的数字传感器,比如压力传感器。
MPU-60X0对陀螺仪和加速度计分别用了三个16位的ADC,将其测量的模拟量转化为可输出的数字量。
为了精确跟踪快速和慢速的运动,传感器的测量范围都是用户可控的,陀螺仪可测范围为±250,±500,±1000,±2000°/秒(dps),加速度计可测范围为±2,±4,±8,±16g。
图10为MPU6050模块电路图
图10MPU6050模块电图
1.3.3电动机选型
本设计选用自带光电式编码器的直流减速电机冯哈勃Faulhaber空心杯减速电机2342L012,通过自带光电式编码器检测电机转动速度和转向,从而闭环控制小车运动。
直流减速电机Faulhaber2342L012输出功率17W,减速器减速比64:
1,驱动能力及转速均完全满足二轮车直立的需求。
自带光电式编码器HEDL5540,带线驱动,数字信号输出,每旋转一周输出12*64个脉冲,精度高,抗干扰能力强,易于单片机处理。
直流减速电机和光电式编码器一体化,构成闭环控制电路,稳定控制平衡车姿态。
电机参数如下:
型号:
德国冯哈勃Faulhaber带编码器空心杯减速电机2342L012
工作电压:
12V
空载转速:
8100RPM(转每分钟)
减速后速:
120RPM(转每分钟)
直 径:
30mm
电机长度:
42mm
总共长度:
85mm
出轴直径:
6mm
出轴长度:
35mm
输出功率:
17W
扭 矩:
大扭矩(1.72Nm)
空载电流:
75mA
堵转电流:
1400mA
减速箱型号:
日本定制(全金属精密行星减速箱)
减速比:
64:
1
编码器:
光电式
输出路数:
AB双路输出
每圈脉冲:
12CPR(脉冲每圈)[可以改装其他高分辨率的光电编码器]
1.3.4测速功能电机自带编码器
通过电机自带的编码器模块,输出两路相差90°的方波信号,将此信号经过施密特触发器整形后输出陡升陡降的方波接入FPGA进行处理。
当电机正转,第二个脉冲落后90°,此时第一个脉冲触发中断信号,在中断处理函数中判断第二个脉冲信号的高低电平就能测算数电机转向和转速。
图11电机编码器接线图
方波信号整形采用CD40106由六个施密特触发器电路组成,利用其中四个作为左右两个电机的编码器输出信号整形,然后对整形后的信号进行限幅。
采用二极管进行钳位,利用二极管的钳位作用,将5V电平转换为3.3V电平,R1的作用是限流,但串联了限流电阻R1会降低输入开关的速度。
采用此电路时,会通过二极管D1向3.3V电源输入电流,如果电流过高可能会使3.3V电源电压超过3.3V。
CD40106内部原理和钳位电路原理如下图所示。
图12CD40106内部原理
图13二极管钳位电路
1.3.5电机驱动
减速直流电机的驱动采用经典的H桥电路,使用两片BTS7960搭建成一个完整的H桥控制电路控制一个电机。
BTS7960是NovalithIC家族三个独立的芯片的一部分:
一是p型通道的高电位场效应晶体管,二是一个n型通道的低电位场效应晶体管,结合一个驱动晶片,形成一个完全整合的高电流半桥。
所有三个芯片是安装在一个共同的引线框,利用芯片对芯片和芯片叠芯片技术。
电源开关应用垂直场效应管技术来确保最佳的阻态。
由于p型通道的高电位开关,需要一个电荷泵消除电磁干扰。
通过驱动集成技术,逻辑电平输入、电流取样诊断、转换速率调整器,失效发生时间、防止欠电压、过电流、短路结构轻易地连接到一个微处理器上。
BTS7960可结合其他的BTS7960形成全桥和三相驱动结构。
图框如下:
图14BTS7960内部原理结构图
本设计的电机驱动电路图如下:
图15两片BTS7960搭建的H桥电路
2.理论分析与计算
2.1电动机性能分析
本设计选用自带光电式编码器的直流减速电机冯哈勃Faulhaber空心杯减速电机2342L012,通过自带光电式编码器检测电机转动速度和转向,从而闭环控制小车运动。
直流减速电机Faulhaber2342L012输出功率17W,减速器减速比64:
1,驱动能力及转速均完全满足二轮车直立的需求。
自带光电式编码器HEDL5540,带线驱动,数字信号输出,每旋转一周输出12*64个脉冲,精度高,抗干扰能力强,易于单片机处理。
直流减速电机和光电式编码器一体化,构成闭环控制电路,稳定控制平衡车姿态。
2.2车模姿态检测
本设计车身姿态检测采用MPU-6050模块(三轴陀螺仪+三轴加速度),MPU6050是目前飞行器、二轮自平衡车和倒立摆等应用中姿态检测最为普遍的选择方案,有完整的开发资料,考虑到电子陀螺仪存在很大的零飘,而加速度计需要校正,所以采用同时读取陀螺仪和加速度计的数据再通过卡尔曼滤波对陀螺仪和加速度计的值进行滤波,得到稳定的车身姿态信息。
经测试,该方法稳定性好,数据波形稳定。
2.3驱动与控制算法
本设计基于PID控制算法实现对二轮直立车模的稳定控制。
系统由PID控制器和被控对象组成,PID控制系统原理框图如图16所示。
图16PID控制系统原理框图
PID控制器是一种线性控制器。
图16中,假设系统的给定值为
,实际输出值为
,根据给定值和实际输出值构成控制偏差
:
(公式1)
PID的控制规律为:
(公式2)
传递函数的形式:
(公式3)
式中,
是比例系数,
是积分时间常数,
是微分时间常数。
PID控制器各部分校正环节的作用如下:
(1)比例环节:
反比例的控制系统的偏差信号
,偏差一旦产生,控制器立即产生控制作用,以减少偏差。
(2)积分环节:
主要用于消除静差,提高系统的无差度。
积分作用的强弱取决于积分时间常数
,
越大,积分作用越弱,反之则越强。
(3)微分环节:
反映偏差信号的变化趋势,并能在偏差信号变得太大之前,在系统中引入一个有效的早期修正信号,从而加快系统的动作速度,减少调节时间。
本装置属于单输入多输出系统,采用PID双回路控制,选MPU6050采集车身姿态、编码器采集车轮子转速作为反馈信号,此方案中,不仅对系统的车身姿态进行闭环控制,而且对小车车速也进行闭环控制,考虑到车身平衡是与车轮与地面摩擦系数等一系列因素有关,本设计控制参数主要是在自由摆运动理论的基础上通过实验测试获得。
系统PID双回路控制结构图如图17所示。
图17双回路PID控制结构图
4.NIOSII软件程序设计
4.1软件整体框架
主程序框图如图18所示:
图18主程序框图
图18中,程序上电运行后,便进行初始化。
初始化包括两部分:
一个是NIOSII应用的各个模块的初始化,如MPU6050初始化、串口初始化;另一个是应用程序的初始化,如定时器初始化、中断初始化、PWM初始化等。
初始化完成后就启动了车模的平衡控制,车模可以根据自身的状态信息进行闭环控制,使车模维持平衡。
启动了车模平衡控制后,主程序就进入了主循环,程序在主循环中不停检测定时器中断中置为的标志位,当检测到标志位证明定时时间到达,这时进入处理流程,计算车模姿态信息,计算当前电机位移和车速,PID计算PWM值,蓝牙输出MPU6050采集到的姿态信息,方便进行车模的调试。
使用NIOSII软核的一个定时器,产生以10ms为周期的中断。
定时器中断服务中只是将定时器标志位timflag置位,然后清除中断标志,使下一次的中断触发正常进行。
4.2主要函数说明
4.2.1初始化部分的函数说明
初始化部分的函数主要是在系统上电开始的时候,给系统各个变量、应用到的各个模块、应用程序进行初始化,方便后续程序的正常运行,这里主要介绍各个模块和应用程序的初始化。
1、InitMPU6050():
MPU6050初始化函数(mpu6050.h)
MPU6050作为整合三轴加速度和三轴陀螺仪的姿态感知传感器,为了后续正常使用这个模块,在初始化时需要对MPU6050芯片的寄存器做简单的配置,对它的操作使用I2C总线实现。
主要包括:
1、解除休眠状态;
2、设定陀螺仪采样率:
125Hz;
3、设定陀螺仪测量范围:
2000deg/s5Hz;
4、设定低通滤波频率:
5Hz;
5、设定加速度加速度测量范围:
2G;
6、设定高通滤波频率:
5Hz;
2、PWM_init():
PWM软核的初始化函数(motor.h)
PWM脉宽调制是电机控制的重要手段,本设计的PWM模块是利用学长资料中写好的PWM的IP核,初始化时主要有两个任务:
1、设定PWM的周期(频率):
10KHz;
2、使能PWM模块;
3、Init_speed_left_int():
左轮编码器测速中断的初始化函数(右轮同理)
电机速度的编码器使用正交编码,我们利用其中一路信号作为中端请求信号,以此信号进行速度测量,我们通过在中断中采集另一路信号的的电平来测量速度的方向,初始化的任务主要有三个:
1、使能外部中断;
2、清除中断标志;
3、注册中断服务程序:
SPEED_LEFT_ISR;
4、Init_timer():
定时器初始化函数
程序的控制算法是在时间上严格精确的,所以在系统中使用了定时器,这样使程序运行按照精确的控制周期执行,通过调节定时器的定时周期,我们就可以得到需要的控制周期,定时器的初始化主要任务有三个:
1、设定定时器定时周期:
10ms;
2、设定定时器控制寄存器:
产生IRQ、连续模式、启动定时器;
3、注册定时中断服务程序:
TIMER_ISR;
4.2.2平衡控制部分的算法和函数说明
本设计利用角度PID和速度PID双反馈来控制小车姿态,使小车维持平衡。
单纯的角度控制,因为无法获得电机的速度,不能得到小车的准确状态(只知道角度和角速度,不知道小车本身的运行速度),在小车在低速可以时利用此PWM进行控制,但是一旦小车速度较大以后,小车就会失去控制,最后倒下。
在加上速度PID控制环时,就避免了这种情况的发生,小车会根据当前速度和角度以及角速度的信息计算控制电机的PWM,电机速度的调整是以现有速度作为参考的,减小了小车速度带来的误差。
以上平衡控制主要用到的函数主要有以下几个:
1、Angle_Calcu():
角度计算函数
角度计算函数中首先通过I2C总线利用GetData(alt_u8REG_Address)函数读取MPU6050传感器的X轴加速度信息,测量范围为2g时,读取的寄存器值与重力加速度的的换算关系为16384LSB/g,转换完的加速的值设为a。
再根据加速度信息计算角度信息。
加速度和角度的关系为a=g*sinθ,由此我们可以得到角度的正弦值sinθ=a/g。
在倾斜角度比较小时sinθ≈θ,式中θ为弧度,再根据角度和弧度的转换关系:
deg=rad*180/3.14,将弧度转换为角度,设为Angle_ax。
类似的,通过I2C总线利用GetData(alt_u8REG_Address)函数获得Y轴的角速度信息,测量范围为2000deg/s时,读取的寄存器值与角速度的换算关系为16.4LSB/deg/s,转换完就得到了车模的角速度,设为Gyro_y。
最后通过Kalman_Filter(Angle_ax,Gyro_y):
卡尔曼滤波函数进行角度和角速度的滤波处理。
2、GetData(alt_u8REG_Address):
角度、角速度获取函数
角度和角速度的获取函数是通过I2C总线读取MPU6050芯片相应的寄存器值得到,寄存器地址即为形参REG_Address的值。
在MPU6050中,角度和角速度的值都是16位的ADC转换后得到的16bit数据,但是I2C总线每次只能读取8bit数据,所以在本函数中做了8bit数据到16bit数据的整合工作,最后返回整合后的16bit值。
I2C通信是根据I2C通信协议,并参考MPU6050数据手册,使用FPGA的PIO模拟的,I2C通信协议以及MPU6050的操作函数都在头文件MPU6050.H中,该头文件为自己编写,主要内容就是I2C通信协议和MPU6050的操作函数,这里就不过多介绍了。
3、Kalman_Filter(Angle_ax,Gyro_y):
卡尔曼滤波函数
卡尔曼滤波器由一系列递归数学公式描述。
它们提供了一种高效可计算的方法来估计过程的状态,并使估计均方误差最小。
卡尔曼滤波器应用广泛且功能强大:
它可以估计信号的过去和当前状态,甚至能估计将来的状态,即使并不知道模型的确切性质。
卡尔曼滤波器用反馈控制的方法估计过程状态:
滤波器估计过程某一时刻的状态,然后以(含噪声的)测量变量的方式获得反馈。
因此卡尔曼滤波器可分为两个部分:
时间更新方程和测量更新方程。
时间更新方程负责及时向前推算当前状态变量和误差协方差估计的值,以便为下一个时间状态构造先验估计。
测量更新方程负责反馈——也就是说,它将先验估计和新的测量变量结合以构造改进的后验估计。
时间更新方程也可视为预估方程,测量更新方程可视为校正方程。
最后的估计算法成为一种具有数值解的预估-校正算法。
图19卡尔曼滤波循环更新
4、Psn_Calcu():
速度和位移计算函数
位移和速度的计算是在定时中断服务程序中读取速度计数值并清零,速度的累计值(积分)作为位移值,控制程序中将利用计算得到的速度值和位移值作为速度反馈,计算驱动电机的的PWM。
5、PWM_Calcu():
电机PWM计算函数
该函数首先判断小车倾斜角度是否大于40度,当小车倾斜角度大于40度时,小车基本无法再维持平衡,所以先关闭电机,避免损坏车模和主控电路。
当车模倾斜角度小于40度时,PWM计算函数使用了PID控制算法计算驱动电机需要的PWM。
PID算法中:
1首先把角度信息乘以比例因子作为角度反馈的比例项,再把角速度信息乘以微分因子作为角速度反馈的微分项,这两部分求和作为角度和角速度的PD控制;
2然后把速度和位置乘以相应的比例因子并求和作为速度反馈的比例控制;
3最后把角度反馈环和速度反馈环的值求和作为控制电机转动的PWM输出;
6、PWM_motor(alt_32pwm_l,alt_32pwm_r):
PWM驱动控制函数(motor.h)
PWM_motor函数式根据传递过来的两路PWM信号控制电机实现相应的转动。
该函数主要有三个任务:
4根据传递过来的参数的正负判断电机转动方向;
5调用转动方向设置函数;
6设置控制电机驱动的PWM值;
遇到过的问题:
1、顶层文件由.v文件改为了.bpf文件形式:
因为黑金动力提供的这款核心板的资料中找不到用于Nios开发的.v文件为顶层的资料,所以就按照黑金动力提供的Nios学习教程中的方式通过.bpf文件构造自己的硬件结构。
在这个过程中我用到了上个学期学习的Verilog的知识,将学长资料中的工程从.v形式转换成了.bpf形式。
2、添加自定义IP核过程中遇到的问题:
工程中用到了输出电机驱动信号PWM波的自定义IP核,IP核的三个.V文件在学长资料里是有的,但在按照《FPGA与SOPC设计教程—DE2实践》中所给的例子在添加的过程中出现了一些interface和singletype选择类型的错误,原因是自己对avalon总线的理解不明确,不理解他的信号分类,后来在网上查了很多资料,看了很多相关的博客也向老师讨论了这个问题后来才成功添加了IP核。
在这个过程中出现过一些问题,就是前一天晚上调试例程时,使用newcomponent功能还正常,第二天发现这个功能不正常了,总是提示添加的.v文件中找不到module模块。
让我困惑了好久,后来才找到问题,原因是前天晚上在使用newcomponent功能时360提示我在Quarters安装目录下发现木马文件,自动清除了,就这样软件遭到了破坏,后来重新安装了Quarters顺利添加了IP核,也把DE2资料中自带的IP核添加到了SOPCBuilder原件目录下。
3、软核内部时钟问题,在刚开始创建的NiosII软核中采用的是在软核内部例化PLL模块,产生内核和不同外设所需的不同频率时钟再用Avalon-MMClockCrossingBridge连接不同的外设到内核,但是在软件测试时出现了部分外设工作不正常(MPU6050调试成功能够通过串口返回数据,但是定时器中断和外部中断初始化不成功,无法启动)。
后尝试修改软核结构,将PLL在外部构建,在顶层文件中例化,NiosII软核内部所有外设均采用统一的100MHz,后测试通过,各部分均工作正常。
4、软核性能问题:
在实际软件工程中测试发现,NiosII自带的us级延时函数存在很大偏差,后查资料发现,软核级别越低偏差越明显。
后来采取自己编写空操作的延时,才使MPU6050初始化时序正常执行。
5、在这次课程设计中遇到的最大的问题就是硬件问题,在FPGA中构建NiosII软核,虽然能够在外设和CPU内部资源配置上提供很大的便利,但是自己构建的内核在稳定性方面还有很大的缺陷,也体现出自己能力的欠缺