《风力摆控制系统-设计报告(共27页).doc》由会员分享,可在线阅读,更多相关《风力摆控制系统-设计报告(共27页).doc(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上摘要:本系统主要是以STM32单片机为控制芯片控制4只直流轴流风机,从而调节风机转速来控制使风力摆呈现不同状态的控制系统。该系统主要由主控板,无线遥控器,直流轴流风机,摆架框架等四大部分组成风力摆控制系统。 关键字:风力摆 无线 STM32单片机 直流轴流风机专心-专注-专业一系统方案1.系统方案论证 本系统主要由遥控模块、控制模块、陀螺仪模块、直流轴流风机组成,添加一些辅助电路作为扩展功能。系统工作有六种工作模式,使用无线遥控切换模式并显示。下面分别论证这几个模块的选择。1.1直流风机的论证与选择方案一:使用直流鼓风机。直流鼓风机的机械摩擦非常小,具有较大的精度,并
2、能提供足够的风力进行运动。但在实验过程中,风机启动速度较慢,且由于其自身重量过大,风摆在运动过程中受惯性影响极大,不能有效的完成任务要求。方案二:采用直流轴流风机。直流轴流风机是在固定位置使空气流动,自身重量和体积都比较小,且出风口大,能够很好的提供动力与控制。在实验过程中能够较快的启动,并能较好的实现任务要求,符合实验需要。综合以上两种方案,风力摆在运动过程中需要进行实时控制摆杆的姿态,且需要风机启停反应快,故选择方案二。1.2控制器模块的论证与选择根据设计要求,控制器主要用于计算摆杆姿态、控制直流轴流风机PWM、使摆杆能完成相应等功能。方案一:采用STC89C51作为系统控制器。它的技术成
3、熟,成本低。STC89C51是8位的单片机,数据传输速度慢,在用于精密的操作时,不能满足实时控制的要求,且复杂的控制算法难以实现,不利于控制。方案二:采用意法半导体公司的STM32F103单片机作为控制器。STM32系列单片机是32位、RISC、低功耗的处理器。在进行高精密的操作时,处理能力非常强,运算速度快,具有很好的控制能力,且成本低,更符合实验要求。综合考虑以上两种方案,采用方案二。2.系统结构根据上述方案的论证,我们确定以STC32F103作为控制核心,采用型号为PFB0812XHE的直流轴风机控制摆杆运动,用陀螺仪MPU6050检测状态数据,并将采集到的数据传输给控制板,然后通过单片
4、机计算处理得出摆杆的姿态并调整直流轴风机的转速,从而使摆杆快速获得需要的状态,通过对应的无线遥控,设置相应的功能并发送给控制板,使其实现对应的功能,完成任务要求。系统设计框图如图1所示直流轴风机STM32F103最小系统模块无线接收显示按键STM32F103最小系统模块陀螺仪模块无线发送图1 设计系统框图二 系统理论分析与计算1.直流轴风机选型本系统采用型号为PFB0812XHE的直流轴风机控制摆杆运动,电压为12V,电流4.65A。此型号直流轴风机大小适中,重量较轻,产生的风力较大且能较快的启动,符合本系统要求。2.摆杆状态检测本系统采用陀螺仪MPU6050采集摆杆的当前姿态数据,将采集到的
5、数据实时传递给单片机,通过单片机PID计算处理后控制PWM的输出,使直流轴流风机转速改变,进而使摆杆达到相应的任务要求。3.运动控制风力摆的运动是连续运动,摆杆的变化也是连续的变化过程,因此我们采用PID控制算法。对直流电机或多圈电位器为执行器件的系统中,基本采用增量式PID算法进行控制。由于单个直流轴风机,只能产生一个方向的力,为了便于控制,我们将4个直流轴风机直立围绕成一个正方形(出风口向外),使四周都能产生相同的风力。然后单片机将陀螺仪MPU6050采集到的数据,确定其当前摆杆的姿态,在进行PID算法以后,将得到的结果对应去控制直流轴风机的转速,以达到控制摆杆完成相应动作的效果三电路与程
6、序设计1电路设计(1)陀螺仪模块陀螺仪MPU6050模块的实物硬件图如图3所示。它与单片机的连接图如图附录总图所示。在这里主要使用的是它的3轴定位功能和加速度功能。图2 MPU6050硬件模块图(2)最小系统模块STM32单片机是意法半导体公司生产的32位低功耗、具有精简指令集的混合信号处理器。其主要特点是处理能力强、运算速度快、低功耗等。在这里主要使用开发板原理图如图4所示。图3 最小系统板原理图2程序设计程序功能描述本系统的软件部分主要由数据采集模块、无线接收和发送、直流轴流风机PWM、PID控制模块函数组成。当单片机上电后,根据不同的按键,遥控模块无线发送对应的工作模式,风力摆的控制板按
7、照接收到的不同工作模式,对应的完成不同的的要求工作。软件部分可实现对读取陀螺仪输出的数据信号,对直流轴流风机进行控制,实现摆杆的运动。程序流程图如图5所示。部分程序如附录一所示。模式一开始模式二模块初始化模式三工作模式按键无线发送无线接收模式四数据采集模式五 PID处理模式六直流轴风机PWM控制图4 系统软件流程图模式一:从静止开始,15s内控制风力摆做自由摆运动,使激光笔稳定地在地面画出一条长度不短于50cm的直线段,其线性度偏差不大于正负2.5cm,并且具有较好的重复性;模式二:从静止开始,15s内完成幅度可控的摆动,画出长度在3060cm间可设置,长度偏差不大于正负2.5cm的直线段,并
8、且具有较好的重复性;模式三:可设定摆动方向,风力摆从静止开始,15s内按照设置的方向(角度)摆动,画出不短于20cm的直线段;模式四:将风力摆拉起一定角度(3045度)放开,5s内是风力摆制动达到静止状态;模式五:以风力摆静止时激光笔的光点为圆心,驱动风力摆用激光笔在地面花园,30s内需重复3次;圆半径可在1535cm范围内设置,激光笔画出的轨迹应落在制定半径2.5cm的圆环内;模式六:在发挥部分(1)后继续作圆周运动,在距离风力摆12m距离内用一台5060w台扇在水平方向吹风力摆,台扇吹5s后停止,风力摆能够在5s内恢复发挥部分(1)规定的圆周运动,激光笔画出符合要求的轨迹。四测试方案与测试
9、结果1测试方案按照调试的顺序,按照以下步骤进行调试。1)调试直流轴流风机的(PWM)速度2)调试单片机与陀螺仪之间的数据传输3)调试系统PID控制的三个参数值:balance.kp、balance.ki、balance.kd4)调试各模式相应直流轴流风机的转速5)调试两个无线模块的数据传输2测试仪器:数字示波器,秒表,米尺,量角尺,风速仪,12V5A直流电源。3测试结果硬件实物图如附录三所示。(1)直流轴流风机的PWM能够正常控制其运转速度(2)陀螺仪能正常的将数据发送给控制板,其中陀螺仪MPU6050模块的通信模式为IIC(3)PID控制的调试:确定balance.kp、balance.kd
10、、balance.kd三个参数的值(4)各模式直流轴流风机的转速,需要反复测试,目前已达到比较理想的转速,其测试结果如下表一表一 测试数据表1次2次3次4次模式125s/30cm20s/40cm16s/57cm14s/53cm模式217s/68(50)cm14s/52(50)cm13s/41(40)cm11s/33(30)cm模式320度/13cm20度23cm30度/25cm270度/21cm模式414s14s6s4s模式515cm/23cm15cm/17cm25cm/22cm35cm/36cm模式68s6s3s4s(5)两个无线NRF模块,能够较精确相互收发数据,完成两块单片机之间的数据传
11、递4.总结本次设计的风力摆控制系统完全可以实现设计基本要求和发挥部分的要求,系统稳定性较好,成功的完成了本次比赛的任务和要求。参考文献【1】全国大学生电子设计竞赛组委会 编全国大学生电子设计竞赛获奖作品汇编M.北京理工大学出版社.2006年【2】黄正瑾.电子设计竞赛赛体解析M.东南大学出版社. 2003年.第五章【3】周航慈.单片机应用程序设计M. 北京航空航天大学出版社.2006年 【4】李朝青.单片机原理及接口技术M. 北京航空航天大学出版社. 2005年.第四章附录一:include sys.h#include usart.h#include delay.h#include led.h#
12、include key.h#include beep.h#include 24l01.h#include spi.h#include imu.h#include motor.h#include mpu6050.hu8 Rx_bufRX_PLOAD_WIDTH;int main(void)u8 key_board;u8 i=0; Stm32_Clock_Init(9);/系统时钟设置delay_init(72); LED_Init(); uart_init(72,);KEY_Init();TIM4_PWM_Init(999,0);mpu6050_init();delay_ms(200);mpu6
13、050_update();Timer3_Init(199,719);NRF24L01_Init();while(NRF24L01_Check()LED1 = LED1;delay_ms(30);printf(NRF24L01 OK!);NRF24l01_poweroff();delay_ms(3);NRF24L01_RX_Mode();delay_ms(3);while(1)key_board = KEY_Scan(0);if(key_board=1)/基本功能1while(1)test_1(40);if(key_board=4)while(1)test_2(45);if(key_board=
14、5)while(1)for(i=0;i4;i+) for(i=0;i3;i+) test_5(20);delay_ms(1000); for(i=0;iCCR1=1000; delay_ms(1000); TIM4-CCR1=400; while(1)if(angle_rao_x0)&(angle_rao_yCCR1=400;TIM4-CCR4=400;TIM4-CCR2=800;TIM4-CCR3=400;delay_ms(1000);if(angle_rao_x0)TIM4-CCR1=800;TIM4-CCR2=800;TIM4-CCR3=400;TIM4-CCR4=400;delay_m
15、s(1000);if(angle_rao_x0)&(angle_rao_y0) TIM4-CCR1=800; TIM4-CCR4=400;TIM4-CCR2=400;TIM4-CCR3=400;delay_ms(1000);if(angle_rao_x0)&(angle_rao_yCCR3=600;TIM4-CCR4=700;TIM4-CCR1=400;TIM4-CCR2=400;delay_ms(1000);#include 24l01.h#include delay.h#include spi.hconst u8 TX_ADDRESSTX_ADR_WIDTH=0x01,0x02,0x03,
16、0x04,0x05; /发送地址const u8 RX_ADDRESSRX_ADR_WIDTH=0x01,0x02,0x03,0x04,0x05; /发送地址void NRF24l01_poweroff(void)NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x00); void NRF24L01_Init(void) RCC-APB2ENR|=1APB2ENR|=1CRL&=0XFFF0FFFF; GPIOA-CRL|=0X;/PG6 7 推挽 GPIOA-CRH&=0XFFFFFFF0; GPIOA-CRH|=0X;/PG6 7 推挽 GPIOB-CRL&=0X
17、FFFFFFF0; GPIOB-CRL|=0X;/PG8 输入 SPI1_Init(); /初始化SPI SPI1-CR1&=(1CR1&=(1CR1&=(1CR1|=16; /SPI设备使能NRF24L01_CE=0; /使能24L01NRF24L01_CSN=1;/SPI片选取消 u8 NRF24L01_Check(void)u8 buf5=0XA5,0XA5,0XA5,0XA5,0XA5;u8 i;SPI1_SetSpeed(SPI_SPEED_16); /spi速度为9Mhz(24L01的最大SPI时钟为10Mhz) NRF24L01_Write_Buf(WRITE_REG+TX_AD
18、DR,buf,5);/写入5个字节的地址.NRF24L01_Read_Buf(TX_ADDR,buf,5); /读出写入的地址 for(i=0;i5;i+)if(bufi!=0XA5)break; if(i!=5)return 1;/检测24L01错误return 0; /检测到24L01 u8 NRF24L01_Write_Reg(u8 reg,u8 value)u8 status; NRF24L01_CSN=0; /使能SPI传输 status =SPI1_ReadWriteByte(reg);/发送寄存器号 SPI1_ReadWriteByte(value); /写入寄存器的值 NRF2
19、4L01_CSN=1; /禁止SPI传输 return(status); /返回状态值u8 NRF24L01_Read_Reg(u8 reg)u8 reg_val; NRF24L01_CSN = 0; /使能SPI传输 SPI1_ReadWriteByte(reg); /发送寄存器号 reg_val=SPI1_ReadWriteByte(0XFF);/读取寄存器内容 NRF24L01_CSN = 1; /禁止SPI传输 return(reg_val); /返回状态值u8 NRF24L01_Read_Buf(u8 reg,u8 *pBuf,u8 len)u8 status,u8_ctr; NRF
20、24L01_CSN = 0; /使能SPI传输 status=SPI1_ReadWriteByte(reg);/发送寄存器值(位置),并读取状态值 for(u8_ctr=0;u8_ctrlen;u8_ctr+)pBufu8_ctr=SPI1_ReadWriteByte(0XFF);/读出数据 NRF24L01_CSN=1; /关闭SPI传输 return status; /返回读到的状态值u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 len)u8 status,u8_ctr; NRF24L01_CSN = 0; /使能SPI传输 status = SPI
21、1_ReadWriteByte(reg);/发送寄存器值(位置),并读取状态值 for(u8_ctr=0; u8_ctrAPB2ENR|=1CRL&=0XFFFFF0FF; GPIOD-CRL|=0X;/PD2 推挽输出 BEEP=0;/关闭蜂鸣器输出#include #include #include #include delay.h#include sys.h#include mpu6050.h#include imu.h#include shuxue.h#include sys.h#define PI 3.#define FILTER_SIZE 30float P=1;static s1
22、6 acc_x_cail=-145,acc_y_cail=-35,acc_z_cail=-555; /起始条件下,偏差,正常是4096,x和y轴都差不多,而z轴接近4900,因此减掉800/static s32 x_sum=0,y_sum=0,z_sum=0;static s16 x_hist_tabFILTER_SIZE ,y_hist_tabFILTER_SIZE ,z_hist_tabFILTER_SIZE ;s16 ave_acc_x ,ave_acc_y,ave_acc_z;s16 pmx,pmy,pmz;float v_angle_rao_x=0,v_angle_rao_y=0,p
23、iancha_x=0,piancha_y=0,wen_piao_x=0,wen_piao_y=0,angle_rao_x=0,angle_rao_y=0;euler_angle real;double gyro_temp_drift_x,gyro_temp_drift_y,gyro_temp_drift_z;PPID axis13,axis24,axis_z;u16 run_time;double att33=1 , 0 , 0 ,0 , 1 , 0 ,0 , 0 , 1 ,;double datt33;void init_pid_para(void) axis24.rk=0; axis24.
24、kp=100;/180; /210 axis24.kd=20000; /26000 axis24.ki=0.1; /0 axis24.sek=0; axis24.ek1=0; axis13.rk=0; axis13.kp=100;/180; /210 axis13.kd=20000; /26000 axis13.ki=0.1; /0 axis13.sek=0; axis13.ek1=0; axis_z.rk=0; axis_z.kp=150; /200 axis_z.kd=7000; /8000 axis_z.ki=0.1; /0 axis_z.sek=0; axis_z.ek1=0;void
25、 acc_prepare_data_int(void)u8 i;for(i=0;iSR&0X0001)/溢出中断mpu6050_update();acc_prepare_data();piancha_x=(atan2(ave_acc_y,ave_acc_z)*180/PI)-angle_rao_x;/this piancha is -,and its unit is du /wen_piao_x+=KI_T*piancha_x;/this wen_piao_x is - /v_angle_rao_x=(gx/16.4+wen_piao_x)+KP_T*piancha_x;angle_rao_x
26、+=v_angle_rao_x*0.002;/angle=v_angle*time/piancha_y=(-atan2(ave_acc_x,ave_acc_z)*180/PI)-(angle_rao_y);/this piancha is -,and its unit is du /wen_piao_y+=KI_T*piancha_y;/this wen_piao_x is - /v_angle_rao_y=(gy/16.4+wen_piao_y)+KP_T*piancha_y;angle_rao_y+=v_angle_rao_y*0.002;/angle=v_angle*time/axis2
27、4.uk=axis24.kp*axis24.ek+axis24.kd*(axis24.ek-axis24.ek1)+axis24.ki*axis24.sek;axis13.uk=axis13.kp*axis13.ek+axis13.kd*(axis13.ek-axis13.ek1)+axis13.ki*axis13.sek;axis_z.uk=axis_z.kp*axis_z.ek+axis_z.kd*(axis_z.ek-axis_z.ek1)+axis_z.ki*axis_z.sek;run_time= TIM3-CNT;TIM3-SR&=(1APB1ENR|=1ARR=arr; /设定计
28、数器自动重装值 TIM3-PSC=psc; /预分频器7200,得到10Khz的计数时钟TIM3-DIER|=1DIER|=1CR1|=0x01; /使能定时器2 MY_NVIC_Init(0,1,TIM3_IRQChannel,2);/抢占3,子优先级3,组2(组2中优先级最低的) void ium_init(void) mpu6050_update();acc_prepare_data_int();init_pid_para(); Timer3_Init(199,719);void test_1(u16 angle)u16 i;for(;)while(absolute(v_angle_ra
29、o_y)30)if(absolute(angle_rao_y)0)TIM4-CCR4=1000; TIM4-CCR2=200;elseTIM4-CCR4=200; TIM4-CCR2=1000; printf(%frn,angle_rao_y);for(i=0;i(u16)(P*absolute(angle_rao_y);i+)delay_ms(5);if(absolute(angle_rao_y)CCR4=200; TIM4-CCR2=200;MS:TIM4-CCR4=200; TIM4-CCR2=200;void test_2(u16 angle)u16 i;for(;)while(absolute(v_angle_rao_y)32)if(absolute(angle_rao_y)0)TIM4-CCR2=1000; TIM4-CCR4=480;elseTIM4-CCR2=480; TIM4-CCR4=1000; for(i=0;i(u16)(P*absolute(angle_rao_y);i+)delay_ms(5);if(absolute(angle_rao_y)CCR4=480; TIM4-CCR2=480;MS: