摄像头云台设计报告.docx
《摄像头云台设计报告.docx》由会员分享,可在线阅读,更多相关《摄像头云台设计报告.docx(13页珍藏版)》请在冰豆网上搜索。
![摄像头云台设计报告.docx](https://file1.bdocx.com/fileroot1/2023-1/1/b2d61af4-99ad-468f-8888-0f3b4a2c5287/b2d61af4-99ad-468f-8888-0f3b4a2c52871.gif)
摄像头云台设计报告
控制专题训练阶段性报告
摄像头云台设计
学生:
2017年5月24日
摘要
随着社会的发展,视频监控行业在IT行业中逐渐占据一角,同样作为视频监控中摄像机的一部分——云台,也扮演着重要的角色。
云台是一种主要由两个高精度电机组成的用于承载镜头的支架,其中一个电机负责控制云台水平转动,另一个电机用于控制云台的垂直方向转动,从而使摄像机镜头能够在水平围,垂直180°围实现两个自由度的转动。
本文要设计的是立式摄像头云台,机械结构的设计使摄像头云台能够放置在平面上,可以实现水平方向和垂直方向各180°的自由度转动,体积较小便于存放,使用两个舵机分别控制云台的水平转动和垂直转动,在上部的云台上固定用于反馈角度信息的mpu9250九轴陀螺仪和摄像头。
由于使用的是模拟舵机,精度较低,为达到设计精度要求由单片机根据mpu9250反馈得到的角度数据对舵机的角度进行计算,使用PID算法得到修正值进行修正。
最终设计的摄像头云台的角度精度(以mpu9250反馈的当前角度为标准当前角度)可达到0.2°(大部分时间可达到0.1°以),即当云台完成角度修正并稳定后,角度与设定的偏转角度相差总小于0.2°。
云台从开始修正到角度偏差小于0.2°的时间不超过为2秒(最长响应时间)。
操作和数据的显示均在触摸屏上完成,可直接在触摸屏上设置摆动的角度,同时可以看到当前的角度与设置的目标角度,以及看到回传的摄像头拍摄到的图像。
本设计虽然采用了模拟舵机这种本身精度不高的电机,却由PID算法对系统的精度做出了很大程度的弥补,稳定角度误差低于0.2°的精度已经基本满足云台的设计目标并能适应许多特殊情况的要求。
关键词:
mpu9250陀螺仪;stm32f103vet6;ov7670摄像头;模拟舵机;显示屏模块。
一、系统方案
本系统主要由两个模拟舵机模块、mpu9250模块、摄像头模块、电源模块组成,下面分别论证这几个模块的选择。
1、模拟舵机的论证与选择
方案一:
使用模拟舵机和算法修正。
模拟电机有其局限性,首先其最大转速不快,0.17s能转动60°,同时经过实测,舵机在本身转动时,有可能会有一定的过冲,因为部控制系统,会自动往回修正一定距离,但是精度也并不高。
但是模拟舵机成本低,控制简单,控制时只需要调整一定的pwm波占空比就可以轻松控制转动的角度,由于是角度伺服电机,最大只能转动180度,出现部分故障时危险较小。
尽管精度低,但是理论上只要使用PID算法进行合理的设计,将参数测试合理,反馈的角度精确且速度较快,经过调试也可以达到很高精度。
方案二:
使用步进电机。
步进电机本身精度较高,控制时只需要按照预定的角度调整pwm波可以进行指定角度的转动,若配合反馈的角度进行控制应该也很容易达到精度要求。
但是步进电机体积十分庞大,同时由于其本身的驱动不能直接使用单片机而还需要使用步进电机驱动器才能驱动,同时使用两个步进电机不仅涉及云台时需要预留很大空间,还需要合理摆放驱动器。
可能会在机械系统设计时花费更多的时间和精力,消耗大量时间。
方案三:
使用无刷电机。
使用无刷电机转动速度会比上述两种电机都快,不过由于速度快,对于PID算法的要求也相应提高,且无刷电机也需要使用电调才能使用单片机控制。
虽然其速度快,但是对于摄像头云台来说,过快的响应速度意义并不是特别大。
摄像头云台更看重精度,而无刷电机相对上述两种电机来说对于高精度的角度控制略有难度。
综合以上三种方案,方案一的优点在于灵活方便,体积较小,方便机械结构的设计,价格经济,使用角度进行修正也可以达到很高的精度,选择方案一。
2、mpu9250模块的论证与选择
方案一:
mpu6050模块。
Mpu6050是一款六轴陀螺仪,对于角度的检测和加速度的测定都有较高精度,且相对较为便宜,广泛运用于各种需要角度,位移控制的控制系统中,但相对于mpu9250而言,少了三个方向的地磁角。
方案二:
mpu9250模块。
Mpu9250模块与mpu6050在角度和加速度的测定上是一样的,但是mpu9250在测定容上多了三个方向上的地磁偏角,可以使用算法利用地磁偏角对原本测定的角度进行修正,相对于mpu6050来说,可达到的角度精度更高。
综合以上三种方案,方案二的优点在于其测定的角度有地磁修正,相对于方案一而言,角度测定更准确,选择方案二。
二、系统理论分析与计算
1、可达到的最高角度精度的理论分析
(1)使用的模拟电机是角度伺服电机,给一个0.5ms的脉冲时转动到0°点,脉冲最大为2.5ms,转动到180°。
从0.5ms到1.5ms有2ms的中间值。
(2)若使用stm32的定时器,将定时器的预分频设置为72倍,原时钟频率是72MHZ,则分频之后变成72MHZ/72=1MHZ,即每个时钟周期是1us,占2ms的2000分之1倍,也就是说,经过控制之后的最小分度值应该是180/2000=0.09°。
说明以现行参数进行设置,设计可以达到要求的0.5°精度以。
2、PID参数的计算
(1)最终设计时,为了参数计算方便,将0°到180°的中间值分给了1000的pwm值。
即每个值之间相差0.18°(若舵机的分值完全准确)。
PID算法使用了PI算法,使用公式:
pwm_differ=kp*Bias+ki*angle_integral_roll;进行pwm的差值计算。
即角度与目标角度每相差一度,就会有kp的pwm修正。
由于舵机的操作方式是固定pwm占空比转动固定角度,所以采用差值的形式对pwm值进行计算,在每次计算结束后对pwm值进行修正。
pwm=pwm_differ+pwm;
(2)由上述计算量可知,若只有比例参数进行修正则应有:
pwm_differ=kp*Bias;
Pwm_differ*0.18°(每个pwm值代表舵机的0.18°,此值为估计值不准确)=Bias。
解方程组得:
kp=5.56。
(3)由于采用的是PI控制,为了避免过大的过冲,kp取比5.56小一些的值,程序中取5,ki作为补偿,取0.5。
完成粗略的取值估计后,进行实际的测试,根据测试结果这样的取值基本能满足系统设计的要求,响应时间基本上在2秒以,精度能达到0.3°以。
后经过测试和修正,kp和ki分别修正为4和1,现行精度可达到0.2°以,响应时间也基本在2秒以。
三、电路与程序设计
1、电路的设计
(1)系统总体框图
系统总体框图如图1所示,
图1系统总体框图
(2)PID算法控制子系统框图
图2PID算法控制子系统框图
(3)电源
电源由航模电池供电,由变压部分,滤波部分,稳压部分组成。
为整个系统提供5V和3.3V电压,确保电路的正常稳定工作。
航模电池的电压约为11.1V,使用一个dc-dc模块将电压将为5V,再使用一个asm1117-3.3V芯片产生一个稳定的3.3V电压,对两部分电源都进行电容滤波进行稳压,从而完成对单片机系统,舵机等设备的供电。
2、程序的设计
(1)程序功能描述与设计思路
1、程序功能描述
根据题目要求软件部分实现mpu9250数据读取,ov7670的图像显示,舵机的控制,触摸屏的触控,各种控制信息的显示以及PID算法的运行。
1)PID算法的运行:
程序快速的将当前系统的角度值读取回来,计算出差值Bias=angle-target_angle。
其中,angle为欧拉角中的滚动角roll和航向角yaw。
然后将差值的积分也一并计算出:
Bias_integeral=Bias_integeral+Bias;根据PID算法中的PI算法,使用这两个量值就可以计算出修正值。
2)触摸屏部分:
用触摸屏显示当前角度值,目标角度值,输出脉冲大小,显示摄像头模块拍摄到的图像信息,同时设置触控按钮,可以通过触控改变目标角度值的大小。
3)基本驱动部分:
配置时钟,定时器,输出pwm波控制脉冲大小,驱动ov7670摄像头正常工作并传输数据,驱动mpu9250并读取相关的角度值数据。
2、程序设计思路
驱动配置完成之后。
程序通过mpu9250将当前系统的角度值读取回来,根据PID算法中的PI算法,将舵机的角度修正值计算出来,再将改修正值通过pwm波脉冲时间的形式发送给舵机,使舵机的角度值改变,使系统的角度按照预设位置高精度变化,从而完成系统的角度控制。
(2)程序流程图
1、主程序流程图
2、PID计算子程序流程图
四、测试方案与测试结果
1、测试方案与论证
(1)硬件测试:
检查硬件电路图,stm32电路板和相关走线连接没有问题。
打开电源之后,各部分正常运行。
舵机转动时,用数字示波器检查5V电源和3.3V电源,无较大纹波,稳压及滤波电路正常工作。
(2)软件仿真测试:
经过仿真,程序能够正常运行,读取数据,数据的相关计算都正常。
(3)硬件软件联调:
上电之后,程序正常运行,mpu9250,ov7670,lcd显示屏都正常运行并能传回数据,舵机可以按照指定方向转动。
正常输入目标角度,测定系统的稳定性和精度。
每次改变目标角度10°,查看最终的稳定值与目标角度的偏差以此计算精度。
论证:
由于制作的是机械系统,若系统能够稳定运行,运行指标满足题目要求,则系统的测试
2、测试条件与仪器
测试条件:
检查多次,上电之后运行系统检查系统的运行稳定性和系统精度。
测试仪器:
数字示波器,数字万用表,指针式万用表。
3、测试结果及分析
(1)测试结果(数据)
每次改变目标值查看稳定之后的角度值:
(单位/°)
目标值
10°
20°
30°
40°
50°
60°
70°
130°
实际值
10.0126
19.9846
29.9536
40.0954
50.0169
60.0314
69.8994
129.986
(2)测试分析与结论
根据上述测试数据,可以看出最大的精度偏差为0.1006,经过后续的粗测量精度偏差最大基本不会超过0.1°,由此可以得出以下结论:
1、系统的精度可满足角度偏差不超过0.2°的精度。
2、系统的稳定性非常高,基本不会出现不稳定因素,可以有效的使用。
综上所述,本设计达到题目要求的角度偏移小于0.5°的目标。
五、参考文献
[1]谭浩强.C语言程序设计[M].:
清华大学,2012
附录1:
电路原理图
附录2:
源程序
intmain(void)
{
u8t=0;
u16lastpos[5][2];
floatpitch,roll,yaw;
shortaacx,aacy,aacz;
shortgyrox,gyroy,gyroz;
shortmx,my,mz;
u8error;
u16pwm_yaw,pwm_roll;
u8lightmode=1,saturation=2,brightness=2,contrast=2;
u8effect=2;
u16i,j;
u32color=0;
floatt_yaw,t_roll;
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
LCD_Init();
TIM4_PWM_Init(4999,143);
SCCB_Init();
POINT_COLOR=RED;
LCD_ShowString(60,50,200,16,16,"MiniSTM32");
LCD_ShowString(60,70,200,16,16,"TOUCHTEST");
LCD_ShowString(60,90,200,16,16,"ATOMALIENTEK");
LCD_ShowString(60,110,200,16,16,"2014/3/11");
draw_button();
printf("Usartisoknow!
%d\r\n",OV7670_Init());
OV7670_Light_Mode(lightmode);
OV7670_Color_Saturation(saturation);
OV7670_Brightness(brightness);
OV7670_Contrast(contrast);
OV7670_Special_Effects(effect);
TIM6_Int_Init(10000,7199);
//tp_dev.init();
EXTI8_Init();
OV7670_Window_Set(12,176,240,320);
OV7670_CS=0;
printf("tp_init%d\r\n",TP_Init());
t_yaw=0;
t_roll=0;
while(mpu_dmp_init())
{
delay_ms(200);
//LED0=!
LED0;
}
while
(1)
{
camera_refresh();
if(mpu_mpl_get_data(&pitch,&roll,&yaw)==0)
{
error=MPU_Get_Accelerometer(&aacx,&aacy,&aacz);
error=MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);
error=MPU_Get_Magnetometer(&mx,&my,&mz);
}
printf("pitch:
%froll:
%fyaw:
%f\n",pitch,roll,yaw);
tp_dev.scan(0);
if((tp_dev.sta)&
(1))
{
if(tp_dev.x[0]{
if(tp_dev.y[0]>400){
if(tp_dev.y[0]<533){
if(tp_dev.x[0]<240)t_yaw=t_yaw+10;
if(tp_dev.x[0]>240)t_roll=t_roll+10;
}elseif(tp_dev.y[0]<666){
if(tp_dev.x[0]<240)t_yaw=t_yaw-10;
if(tp_dev.x[0]>240)t_roll=t_roll-10;
}
}
}
}
if(t_yaw>180)t_yaw=180;
if(t_yaw<-180)t_yaw=-180;
if(t_roll>180)t_roll=180;
if(t_roll<-180)t_roll=-180;
LCD_Showangle(yaw,roll,pitch,t_yaw,t_roll);
LCD_Showpwm(pwm_yaw,pwm_roll);
pwm_set(yaw,t_yaw,roll,t_roll,&pwm_yaw,&pwm_roll);
}
}
u16pute_pwm_roll(floatangle,floattarget_angle,u16pwm){
staticfloatangle_integral_roll=0;
intpwm_differ;
floatkp,ki;
floatBias;
kp=4;
ki=1;
Bias=angle-target_angle;
angle_integral_roll=angle_integral_roll+Bias;
if(angle_integral_roll>50)angle_integral_roll=50;
if(angle_integral_roll<-50)angle_integral_roll=-50;
pwm_differ=kp*Bias+ki*angle_integral_roll;
if(pwm_differ>500)pwm_differ=500;
if(pwm_differ<-500)pwm_differ=-500;
pwm=pwm_differ+pwm;
if(pwm>1249)pwm=1249;
if(pwm<249)pwm=249;
returnpwm;
}
voidpwm_set(floatyaw,floatt_yaw,floatroll,floatt_roll,u16*pwm_yaw,u16*pwm_roll){
staticu16pwm_last_yaw,pwm_last_roll;
pwm_last_yaw=*pwm_yaw;
pwm_last_roll=*pwm_roll;
*pwm_yaw=pute_pwm_yaw(yaw,t_yaw,pwm_last_yaw);
*pwm_roll=pute_pwm_roll(roll,t_roll,pwm_last_roll);
TIM4->CCR2=*pwm_roll;
TIM4->CCR1=*pwm_yaw;
}