1、2017年全国大学生电子设计竞赛 设计报告 滚球控制系统(B题) 【本科组】 摘要:本系统采用STM32F103ZET6最小系统板为控制中心,利用OV7670摄像头、显示器、按键、S010舵机、小球、万向节、平板支架构成滚球控制系统.单片机利用摄像头采集到的数据,确定小球的位置坐标,通过PID闭环控制舵机PWM输出打角拉动支撑杆,控制平板倾斜度达到小球滚到指定区域停留等状态。控制系统采用PID算法组成闭环控制系统具有很好的稳定性,此外通过TFT显示屏显示小球位置,各个功能的实现可以通过按键输入. I 一、系统方案 本系统主要由单片机控制模块、摄像头模块、LCD显示屏模块、电源
2、模块、舵机及平板机械支架构成组成。STM32作为滚球系统的控制核心,利用摄像头采集过来的数据通过黑白二值化,以此判别平板和黑色球并显示在LCD上。摄像头对滚球准确定位,确定其坐标位置,同时记录平板规定的9个区域坐标,单片机通过返回的坐标位置结合PID算法,给定舵机PWM输出形成闭环控制系统,从而控制小球去到指定区域保持平衡。同时,可通过矩阵按键选择功能模式,与设计任务一一对应的,系统的总体方案框图见图1。 图1 系统总体方案框图 1、主控制器件的论证与选择 方案一:采用STC89C52单片机作为控制模块的核心.STC89C52使用经典的MCS—51内核,但做了很多的改进使得芯片具有传统5
3、1单片机不具备的功能。但其能使用的I/O口很少,ROM空间不足,不适合采用STC89C52为主控芯片。 方案二:采用STM32103FZET6单片机为主控器。STM32运行速度快,片上资源丰富,具有很多外围接口,可拓展性强,灵活性高.完全可以实现本系统的各个设计任务,具有良好的响应速度。 通过比较,我们选择方案二。 2、滚球控制系统方案选择 方案一:采用MPU6050三轴陀螺仪。利用三轴陀螺仪可以算出平板的当前位置姿态,具有测量精确、结构简单等优点,但考虑到小球需要到平板指定的9个区域,MPU6050传感器很难确定其准确位置,可靠性差。 方案二:选用摄像头对小球准确定位,根据
4、题目给出的具体要求,采集摄像头检测到的数据传给单片机二值化处理,以此确定小球的位置坐标以及与目的坐标的偏差,反馈给单片机,实现更加精确的控制,而且通过LCD显示,更加直接有利于调试。 综合以上两个方案,本系统选择方案二。 3、滚球运动控制的论证与选择 方案一:采用推杆直线电机。电推杆是通过将电动机的旋转运动转变为推杆往复直线运动的电力驱动装置。利用多个电推杆可推动平板进行上下运动,但电推杆响应速度慢,而且需要很大的驱动电流,消耗功率大,还要加装继电器保护,比较繁琐。 方案二:采用S010舵机。该舵机为伺服电机,通过舵柄转换成旋转运动来打到不同的角度,再加上装支撑杆就可以控制平板的上下
5、运动。舵机三条控制线,分别为:电源、地及信号线,不需要驱动模块,只要单片机输出信号PWM就可以控制舵机打角。 综合考虑采用方案二。 4、显示器的论证与选择 方案一:采用OLED显示器。该显示屏可显示汉字,不需用到背光板,具有轻薄短小、低耗电量,但为单色显示,界面效果受限。 方案二:选用TFTLCD显示器。TFTLCD显示屏分辨率高,真彩显示,可显示的界面丰富。方便绘图和编程控制,更有利于人机界面的操作控制,适用于较为功能性强的的控制系统。 综合以上两种方案,选择方案二。 二、系统理论分析与计算 1、小球的精准定位分析 通过OV7670摄像头采集图像进行二值化处理,用两个嵌
6、套for循环可以计算得出小球在x轴和y轴上被扫描到最边上的两个值x—min、x—max和y-min、y-max,然后分别将x轴和y轴的最大最小值求和,再除以2,就可以得出小球的坐标x和y值。 2、执行机构装置的分析 方案一:采用4个舵机作为执行机构,对称分布在平板四周,通过4个舵机不同的PWM输出来控制平板的运动从而控制小球的滚动,但4个舵机控制存在很大的不确定性,算法较为复杂。 方案二:采用2个舵机和一根带万向节的支撑杆等边三角形分布,构成执行机构。采用二维平面X,Y方向来控制平板的运动,另外一根带万向节的支撑杆起到很好的连动作用,机械上更加简单,易于PID算法控制。 综上以上方案
7、选择方案二。 3、控制PID的计算 在系统控制中,按偏差的比例(P)、积分(I)和微分(D)进行控制的PID控制。 以下是PID的公式: u(t)= 控制点目前包含三种比较简单的PID控制算法,分别是:增量式算法,位置式算法,微分先行。鉴于本系统通过小球坐标与目标位置坐标的偏差,只调节比例P、微分D的PD的增量式算法,即利用目的坐标与偏差的PD调节,控制滚球闭环控制系统,达到稳态无静差。 三、电路与程序设计 1、电路的设计 采用STM32ZET6最小系统板,外接摄像头模块、显示模块、按键模块、电源模块及舵机执行机构.外设接口模块电路见图2。 图2 外设接口电路 (2
8、)电源模块 单片机采用3.3V供电,显示器5V供电以及舵机6V供电.电源电路见附录1。 2、程序的设计 (1)程序功能描述与设计思路 1、程序功能描述 根据题目要求软件部分主要实现键盘的设置和显示。 1)键盘实现功能:采用3乘3的矩阵键盘,从左到右,从上到下依次排序,按键1至7依次控制开启和关闭任务1—7的要求,按键9为PID调节模式控制按钮。PID调节模式中按键4和7为调节平板内部区域的KP1值大小,按键5和8为调节平板内部区域的KD1值大小,按键5和8为调节平板边缘区域的KP2值大小; 2)显示部分:显示小球的在平板上坐标,任务需要到达的坐标,实时坐标值与目标坐标值的差值,平
9、板上的9个区域,小球的模拟图像,两个舵机的输出值,任务序号,任务计时时间,小球在区域停留的时间。 2、程序设计思路 进入系统,先选择进入校准模式,按键调节舵机的输出值,以达到平板的平衡,并保存为平衡值;通过OV7670摄像头采集平板的图像二值化,并把二值化图像显示在LCD屏上以找到区域1、5、9并保存重新定义区域位置来减少调节平板和摄像头因碰撞或搬运的而产生的误差。通过二值化寻到小球坐标,与目标坐标的差值,通过PD算法,调节舵机的输出值来调节平板的上下运动,让小球达到任务所需要的目标坐标。 (2)程序流程图 1、主程序流程图 四、测试方案与测试结果 1、测试方案 (1)硬件测试
10、 检测焊接的单片机外接设备能否正常工作,摄像头采集显示到显示屏是否稳定并判别平板和小球;检测电源提供的电压、电流供模块使用是否达到稳压值;平板及舵机装置静置是否平衡;检测按键能否实现不同任务. (3)硬件软件联调 通过按键和TFTLCD显示器达到人机交互,测试滚球运动与实际偏差可以按按键选择调节KP1、KD1系数,控制舵机PWM输出,调试滚球控制系统. 2、测试条件与仪器 测试条件:检查多次,仿真电路和硬件电路必须与系统原理图完全相同,并且检查无误,硬件电路保证无虚焊。 测试仪器:万用表、水平仪、秒表。 3、测试结果及分析 (1)测试结果(数据) 滚球控制系统工作,将小球置于平
11、板区域1上,记录平板开始运动使小球达到中心区域平衡的时间,测定其最佳的PD参数。 KP KD 6 7 8 9 1.3 6s 7s 6s 10s 1。6 4s 5s 6s 6s 1.9 7s 7s 8s 9s 任务1:稳定小球在区域2,停留不少于5s。 任务2:控制小球由区域1进入区域5,在区域5停留不少于2s。 测试次数 第一次测试 第二次测试 第三次测试 第四次测试 时间(s) 4 5 5 4 任务3:控制小球由区域1进入区域4,在区域4停留不少于2s,再进入区域5停留不
12、少于2s. 测试次数 第一次测试 第二次测试 第三次测试 第四次测试 达到区域4时间 4 5 5 5 停于区域5时间 10 9 12 10 任务4:控制小球由区域1进入区域9,在区域9停留不少于2s. 测试次数 第一次测试 第二次测试 第三次测试 第四次测试 时间(s) 20 19 15 14 (2)测试分析与结论 根据上述测试数据,通过调节PD参数,控制平板的倾斜程度,使小球进入区域和冲过区域的不同状态具有良好的跟随性、准确性、快速性,由此可以得出以下结论: 1、单独增大KP,KD不变,平板倾斜度更大,小球滚动趋势大,当小球距离目的坐
13、标近时,平板也会有大的倾角。 2、微分KD起到微调和超调的作用,当小球靠近区域圆时,有刹车防止小球冲过区域的作用。结合适当的比例KP参数,微调微分KD,系统可以有较好的跟随性和稳定性。 3、通过实验证明,当小球在规定的9个圆形区域时,设置比例参数KP为1.6,微分参数KD为6,小球达到目标区域时间短;当小球在圆形区域外时,KP取值为5,使平板有大的倾角,足够将小球拉回来。 4、采用动态P,设计小球从1到9区域的路线使其有较好的缓冲,克服因P值太大给小球的惯性冲出平板。 综上所述,本设计达到设计要求。 五、参考文献 [1] 谭浩强。C语言程序设计[M].北京:清华大学出版社,2012
14、 [2] 张兴。电力电子技术[M].科学出版社,2010. [3] 孙林军。基于STM32控制液晶的接口实现[J]。电视技术,2013. [4] 韩国栋.Altium Designer Winter 09电路设计入门与提高[M].化学工业出版社,2010。 附录1:电路原理图 附录1 系统电路原理图 附录2:源程序 #include ”stm32f10x_it.h" #include "led。h" #include "delay.h" #include "key。h" #include "sys。h” #include ”lcd。h” #include ”
15、usart.h”
#include "timer。h"
#include ”dj_pwm。h”
#include ”ov7670。h”
#include ”exti.h”
#include 16、in=125,PWM_Y_Min=115; //PWM输出限幅外区域
u16 PWM_X_Max=195,PWM_Y_Max=185;
u16 PWM_X_Min2=135,PWM_Y_Min2=125; //PWM输出限幅内区域
u16 PWM_X_Max2=185,PWM_Y_Max2=175;
u8 PWM_Value=1; //按键可改变PWM数值
u8 Task_flag=0; //任务标志
u8 Task_flag2=0; //任务标志 2
u16 Task_time=0; //任务时间
u16 Stop_time=0; //区域停留时间 17、
u8 time_Task_flag=0;
u8 time_Stop_flag=0;
float Kp1=1。6,Kd1=6; //1 P和D 在圆内
float Kp2=3; //2 在圆外
u16 GOAL_X=120,GOAL_Y=80; //目标坐标
float Err_X,Err_Y=0; //坐标差值
float Err_X_LAST,Err_Y_LAST=0;
u8 ball_r=5,QY_r=6,WC_value=1; //小球半径,允许误差 *0.25cm
u16 X,Y=0; //小球的质心位置
u16 X_MAX=0, X_M 18、IN=240; //小球的坐标
u16 Y_MAX=40, Y_MIN=280;
u16 X_MAX_LSAT, X_MIN_LSAT,
Y_MAX_LSAT, Y_MIN_LSAT=0; //上一次小球的坐标位置
u16 X_MIN_RANGE=0,X_MAX_RANGE=240; //扫描判断区域
u16 Y_MIN_RANGE=40,Y_MAX_RANGE=280;
u8 QY_number=0; //所在的区域
u16 QY_X1=40,QY_X2=120,QY_X3=200; //区域坐标 行X 40 120 200
u16 QY_Y1=80 19、QY_Y2=160,QY_Y3=240; //区域坐标 列Y 80 160 240
void KEY_RUN(void);
void camera_refresh(void); //更新摄像头
void PWM_Control(void); //更新PWM输出
void LCD_Control(void); //更新LCD显示
void location(void); //更新位置判别
void Test(void); //校准测试
void Test_Blance(void); ///校准测试1平衡
void Test_OV1(void); //校准测 20、试2摄像头1
void Test_OV5(void); //校准测试3摄像头5
void Test_OV9(void); //校准测试4摄像头9
void Task(void); //任务函数
void Done_Task(void); //更新任务进度
void Fand_Goal(void); //寻小球坐标函数
int main(void)
{
delay_init(); //延时函数
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
21、LED_Init();
KEY_Init();
LCD_Init();
LCD_Clear(WHITE);
POINT_COLOR=BLACK; //设置字体黑色
PWM_X=PWM_X_init; //赋值PWM输出
PWM_Y=PWM_Y_init;
DJ1_PWM_INIT(499,719,PWM_X,PWM_Y);//舵机频率200HZ 50—250 60—240 中值160 160 TIM2P2—>A1 TIM2P3—〉A2
LCD_ShowString(50,150,150,24,24,(unsigned char*)” 22、Waiting 。。.");
while(OV7670_Init()); //初始化¯OV7670
TIM6_Int_Init(5000,7199); //10Khz计数频率,1秒中断
EXTI8_Init(); //使能定时器捕获
OV7670_Window_Set(10,170,240,320); //设置窗口
OV7670_CS=0;
LCD_Clear(BLACK);
Test(); //校准测试
test=2; //测试关闭,关闭摄像头显示更新
while(1)
{
KEY_RUN(); //按键扫描
Fand_Goal(); //寻小球坐标函数
Task(); //任务函数(选定目标,PID调节)
location(); //更新位置判断
Done_Task(); //更新任务进度
LCD_Control(); //更新LCD显示
}
}
9






