电子工艺标准规范标准实习Word文档格式.docx
《电子工艺标准规范标准实习Word文档格式.docx》由会员分享,可在线阅读,更多相关《电子工艺标准规范标准实习Word文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
小车组装,包装,以及编程控制小车的平衡以及前进。
7.19:
实验验收,下午撰写实验报告。
7.20:
提交实验报告。
学生
实习
总结
(附页,不少于2000字)
请见下面附页
成
绩
评
定
遵照实习大纲并根据以下三方面按五级分制(优秀、良好、中等、及格、不及格)综合评定成绩:
1、思想品德、实习态度、实习纪律等
2、技术业务考核、笔试、口试、实际操作等
3、实习报告、分析问题、解决问题的能力
实习评语:
实习成绩:
指导教师签名:
实习单位公章
年月日
附页:
学生实习总结
一.实习任务要求
1、练习焊接技术,焊接并实现简单的发光二极管交替闪烁电路。
2、练习编程技能,组装并焊接智能平衡小车,使其能平稳行走数米,设计小车外观。
二设计思路
1、发光二极管交替闪烁电路
焊接技术练习完毕后,开始焊接LED灯。
根据之前的经验,先焊接外围的LED二极管,焊接完成之后再焊接内侧的,这样的焊接目的是保证焊接的LED矩阵是平整的而不是凹凸不平。
交替电路的实现:
研究老师给的代码可以知道控制输出字符形状是由每一列8个LED二极管的亮和灭来控制,每一列8个灯的亮灭由两位16进制数来控制,将16进制转化为4位二进制,其中”1”代表二极管的亮,“0”代表二极管的灭。
2、智能平衡小车
智能平衡车用STM32F103RC作为单片机核心板,通过usb连接至电脑然后烧录程序来调控小车的运动状态。
智能平衡小车平衡的实现采用PD算法。
通过对传感器传送回来的数据进行修正,将起伏剧烈的角度变化修正为平滑的变化趋势。
直走、转弯等状态的实现使用PID算法及计时器。
通过控制车轮的角度、角速度以及电机的转速来控制小车的状态,当小车处于平衡时电机缓慢转动;
当小车向前倾斜时,电机加速向前加速转动,且转动的速度岁倾斜程度的加大而加大;
小车向后倾斜时,电机加速向后转动,控制车轮向后转动,转动速度也随倾斜角度增大而增大。
小车外壳设计为简易的卡纸包装,再保证小车外观整洁的同时也避免了因为包装而让小车的质量增加太多从而影响了小车各种状态下的加速度等物理值,减少了调试中的困难。
三、具体实现过程
1.1二极管交替闪烁电路的的焊接与组装
按照先易后难的顺序来焊接,先将电阻焊接在双面板上,然后焊接芯片,最后焊接LED二极管。
1.2交替电路的实现。
先设计出要LED矩阵要显示的内容,画出大致的草稿图,根据LED矩阵的排列规律修改出相应的控制代码。
2、智能平衡小车的设计与实现
2.1、小车的组装
根据教程将小车各部件组装好。
2.2、功能实现
2.2.1动力控制
小车由一节4.2v直流式电源供电工作。
2.2.2小车平衡的控制:
floatKP=5.;
floatKI=0;
floatKD=0.5;
constint16_tMOTO_THRESHOLD=600;
//PWM=18KHz
ctrl=g_mpu9250.Angle_Complement_1st*KP
+angle_diff*KI
+g_mpu9250.gyro_scale_y*KD
Ctrl值的大小控制小车是否达到平衡,当Ctrl值达到0时,说明小车达到平衡,当Ctrl值不为0时分Ctrl>
0和Ctrl<
0;
当Ctrl>
0时此时小车向后倾斜,但是会有一个向后的加速度以此来达到平衡;
当Ctrl<
0时,此时小车向前倾斜,会有一个向前的加速度来达到平衡。
a)运行状态的控制:
小车使用直流电机实现其直立行走及平衡,车轮需进行前后两个方向的行进以此来达到我们想要的状态。
●算法主要思路
通过代码可知当某一电机的PWM值与设定的前进和后退的pwm值不同时,这个电机的转动状态就会发生变化,电机控制的车轮就会发生相应的运动,因此设计恰当的状态以实现小车能平衡向前运动。
计时器:
在主函数中加入计时器控制电机工作的状态;
●具体代码
floatKP=5.55;
staticfloatangle_D=0;
staticfloatangle_D_last=0;
floatctrl;
floatangle_diff=0;
int16_tdir;
int16_tPWM;
angle_diff+=g_mpu9250.Angle_Complement_1st;
ctrl=(g_mpu9250.Angle_Complement_1st-pwm)*KP
+angle_diff*KI
+(g_mpu9250.gyro_scale_y)*KD;
if(ctrl>
0)
{
dir=1;
//backward
}
else
dir=0;
//forward
PWM=abs((int)ctrl)+MOTO_THRESHOLD;
//if(PWM>
700)PWM=700;
-
g_moto_ctrl.right_pwm=PWM;
if(dir==0)
left_forward(PWM);
right_forward(PWM);
left_backward(PWM);
right_backward(PWM);
}
四、本人工作
1、发光二极管的焊接以及显示:
单面板上的点焊练习以及实验验收,焊接二极管矩阵以及芯片。
参与修改字符显示代码的修改。
2、智能平衡小车:
参与小车的组装,搭建小车外壳,小车平稳直立代码的调试,小车直行代码的调试。
五、实现功能及测试数据
1、实现功能
(1)发光二极管阵列
发光二极管会显示“ILOVEU”这些字母依次从右向左流动显示。
(2)智能小车
开始小车实现平衡的功能,经过调试后实现向前走的功能。
2、调试
此项任务主要是对前几天点焊练习的一种考察,焊接过程由于二极管与二极管之间的间距很紧密因此焊接难度有点大,因此焊接过程从外向内焊接,焊接完成后烧录程序,观察时候每一个LED二极管都亮,之后可以看到“BUPT”字样的显示,之后自行修改代码,使其显示自己预期的字符。
但是注意每次烧录完成显示一段时间后记得对核心板断电否则板子很容易烧坏。
在进行智能小车的测试时,我们分为两步:
第一步:
实现小车的平衡。
将程序烧录到开发板后,给小车接通电源,小车能保持平衡状态,而且在没外力干扰以及地面平整度不是特别陡峭的情况下,这个状态可以维持较长时间。
第二步:
直行的实现
在测试小车的直走功能时,刚开始测试时,小车直行不到20cm就倒下去了,经调试发现有可能是小车的重心偏向于小车前方所导致的,因此我们在小车的后方加了一个用卡纸制作的后盖,重新测试,发现小车可稳定的直行,当小车出现向一边倒的趋势时,它会向这个方向加速一小段距离后自动维持平衡后再行走。
最后我们设定小车状态的维持时间,初始时,小车保持平衡10s,之后平衡7s左右时小车会向前行走一小段距离。
六、遇到的问题及解决办法
1.焊接过程中,有几个二极管周围的焊接口被滴落下的融化的锡丝堵住。
解决办法:
利用吸锡器将堵住的焊接口疏通,并且更换电烙铁的烙铁头,更换尖嘴头,虽然尖嘴头导热效果不太好,但是可以有效避免融化的锡丝滴落到未焊接的接口上。
2.焊接完成后,烧录程序后有两个二极管不亮。
首先检查二极管正负极是否焊接有误,发现焊接没有错误;
进一步观察是否焊接的二极管有误漏焊的现象,如果有重新焊接。
3.小车尖顶外壳重心难以控制,直立行走距离较短,且不平稳。
在小车上加个后盖,再次调整参数,得以平稳行进。
4.小车不平衡
解决方法:
修改PWM值,每次以小幅度增加或减少的改变,直至小车平衡。
5.小车可以平衡,但是前进过程无法平衡。
在common.h文件中加一个刹车程序,从而小车在前倾的时候有个类似的刹车控制程序来重新调控其再次保持平衡。
七、实验心得
本次实验开始阶段连续几天的焊接着实让大家对这次实习失去了太多期待,但其实每天的焊接过程中都是在不断进步的过程。
第一天焊接出的成品真的是连自己都不好意思去看,第三天焊接二极管的过程其实很考验人的耐心和细心,一不小心就容易把其他焊接口堵住,或者焊接二极管的高度没能达到预期目标,因此这个阶段需要充分的耐心与细心。
组装下车过程是一个团队合作工作,需要两个人协同配合才能保证小车组装的速度和准确性。
小车调试的过程是最困难的过程,不仅需要每天去看程序,改代码,调参数,还要多和其他人交流,每个人在实验过程中遇到的问题各种各样,有时候会出现各种莫名其妙的bug,这个时候单靠小组内两个人来解决可能不够,和其他人交流可能起到事半功倍的效果,就比如在调试小车前进的过程中一开始调试了两天每次都因为某一个方向的加速度偏大或偏小导致小车一前进就磕头,陷入无限磕头的模式。
经过和其他人讨论,加了一个刹车程序,从而实现了前进过程中还保持平衡的目的。
总体来说,这次实验虽然对代码的要求不高,但是也很考察c语言的功底,有些代码的修改很需要一定的c基础,这次实习是对各种能力的一个小考察,一个小项目就给我们带来那么多困难,很难想象以后的研究生生涯会是遇到怎么样的挑战。
这次实习也告诉我,实验考察的事多方面素质,各方面有欠缺都不行,以后的学习中需要更加努力学习编程,看懂代码,理解实验要义,才能做出好的项目成果。
八、部分代码源程序
8.1、发光二极管交替闪烁电路
#include
"
spi.h"
dot_matrix.h"
uint8_t
g_sys_mode
=
0
;
g_dot_start
uint16_t
g_dot_cnt
g_ShowData[
51
]
{
0x81,0xFF,0xFF,0x81,0x00,0x00,0x81,0xFF,0xFF,0x81,0x80,0x80,0x80,0x40,0x00,0x7E,
0x81,0x81,0x81,0x7E,0x00,0x01,0x3F,0x40,0x80,0x40,0x3F,0x01,0x00,0x81,0xFF,0x99,
0x99,0x99,0x42,0x00,0x00,0x01,0x7F,0x80,0x80,0x80,0x7F,0x01,0x00,0xBF,0x00,0xBF,0,0,0};
8.2、智能平衡小车
8.2.1加了刹车程序后的common.c代码:
#include<
string.h>
#include"
stm32f1xx_hal.h"
tim.h"
main.h"
moto_ctrl.h"
uart_osc.h"
common.h"
esp8266.h"
mpu9250.h"
externmpu9250_tg_mpu9250;
externmoto_ctrl_tg_moto_ctrl;
uint32_tg_SysMode=2;
uint32_tReadUserButton0(void)
staticuint8_tbtn0_down=0;
staticuint8_tbtn0_up=1;
if(HAL_GPIO_ReadPin(USER_PB0_GPIO_Port,USER_PB0_Pin)==GPIO_PIN_RESET)
if(btn0_down==1&
&
btn0_up==1)
{
btn0_up=0;
return1;
}
else
btn0_down=1;
HAL_Delay(50);
btn0_down=0;
btn0_up=1;
return0;
}
uint32_tReadUserButton1(void)
staticuint8_tbtn1_down=0;
staticuint8_tbtn1_up=1;
if(HAL_GPIO_ReadPin(USER_PB1_GPIO_Port,USER_PB1_Pin)==GPIO_PIN_RESET)
if(btn1_down==1&
btn1_up==1)
btn1_up=0;
btn1_down=1;
btn1_down=0;
btn1_up=1;
//index0:
all,1~4:
LED1~4
//mode0:
off,1:
on,2:
toggle
voidLEDCtrl(uint32_tindex,uint32_tmode)
switch(index)
case0:
if(mode==0)
{
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_SET);
}
elseif(mode==1)
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_RESET);
break;
case1:
elseif(mode==2)
HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
case2:
HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);
default:
voidSleepSystem(void)
//MX_GPIO_DeInit();
HAL_PWR_EnterSLEEPMode(PWR_LOWPOWERREGULATOR_ON,PWR_SLEEPENTRY_WFE);
voidStopSystem(void)
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_STOPENTRY_WFI);
voidGet_IR_Sensor(void)//?
-?
£
uint8_tdata0,data1;
data0=GPIOC->
IDR&
0x0E;
//pin3,2,1->
IR4,3,5
data1=GPIOB->
0x28;
//pin5,3->
IR2,1
g_moto_ctrl.ir_sensor=(data1<
<
2)|data0;
voidIR_Sensor_Init(void)
GPIO_InitTypeDefGPIO_InitStruct;
HAL_SPI_MspDeInit(&
hspi3);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3|GPIO_PIN_5,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC,IR_3_Pin|IR_4_Pin|IR_5_Pin,GPIO_PIN_RESET);
HAL_GPIO_DeInit(GPIOC,IR_3_Pin|IR_4_Pin|IR_5_Pin);
/*ConfigureGPIOpins:
PBPinPBPin*/
GPIO_InitStruct.Pin=IR_1_Pin|IR_2_Pin;
GPIO_InitStruct.Mode=GPIO_MODE_INPUT;
GPIO_InitStruct.Pull=GPIO_NOPULL;
HAL_GPIO_Init(GPIOB,&
GPIO_InitStruct);
GPIO_InitStruct.Pin=IR_3_Pin|IR_4_Pin|IR_5_Pin;
HAL_GPIO_Init(GPIOC,&
voidSetWorkMode(uint32_tmode)
switch(mode)
case0:
//balancecontrol
LEDCtrl(1,0);
LEDCtrl(2,1);
HAL_TIM_PWM_MspInit(&
htim8);
HAL_TIM_Base_Start_IT(&
htim6);
IR_Sensor_Init();
break;
case1:
//dotmatrix
LEDCtrl(1,1);
LEDCtrl(2,0);
HAL_TIM_Base_Stop_IT(&
Motor_Stop();
HAL_TIM_PWM_MspDeInit(&
dot_matrix_init();
break;
case2:
//showoscwave
voidUserTask(void)
if(ReadUserButton0()==1)
{
LEDCtrl(0,0);
HAL_TIM_Base_Stop_IT(&
HAL_TIM_PWM_MspDeInit(&
HAL_PWR_EnterSTANDBYMode();
if(ReadUserButton1()==1)
g_SysMode++;
if(g_SysMode>
2)g_SysMode=0;
SetWorkMode(g_SysMode);
switch(g_SysMode)
show_dot_matrix();
Uart_OSC_ShowWave(g_mpu9250.angle_x,g_mpu9250.gyro_scale_y,g_mpu9250.Angle_Complement_1st,g_moto_ctrl.ir_sensor);
//Uart_OSC_ShowWave(g_moto_ctrl.right_pwm,g_moto_ctrl.left_pwm,g_mpu9250.Angle_Complement_1st);
//Uart_OSC_ShowWave(g_mpu9250.angle_x,g_mpu9250.gyro_scale_y,g_mpu9250.Angle_Kalman,g_mpu9250.Angle_Complement_1st);
voidSystemTimer