电院科创3第一次报告--基本控制电路的制作与调试

 

1.焊接部分

            按照图纸所示,将相应元件焊接到板子上.

图1 控制电路板原理图(Schematic Prints.pdf)

本次制作需要添加的元器件名称及规格如下所示:

Item

Designator

Description

Comment

1

C3,C5,C7

贴片胆电容,竖线为正端

10uF

2

C4,C6,C8

贴片电容,无极性

0.1uF

3

D1

3.3v电源指示灯,与R6配套使用,按照箭头方向为从正到负

发光二极管

4

J1,J2

接左右电机控制线

XH-2.54底座 4pin

5

J3

5v电源接入

XH-2.54底座 3pin

6

J4

编程器接入,有线通信接口

XH-2.54底座 5pin

7

JP1,JP2

通信选择

3pin单排针

8

R5

电阻

1K

9

R6

电阻

220

10

S1

开关

自锁开关7*7

11

U1

AMS1117-3.3电源

电源芯片

12

U2

单片机,先焊接一个20pin芯片底座

STC11L02单片机

图2 元器件名称及规格(全部元件规格可参见stcmcuCar.xls)

焊接注意事项:

            1)此为双面板,元器件应统一放置在印有白色的元器件名称的一面,切勿放在反面.

            2)此板包含较多的贴片元件,对焊接技术要求较高.对于贴片元件,可先在其中一个贴片上上好锡,然后将元器件的一端先焊接在该贴片上,再将剩下的一端焊上去.贴片元件都较小,可用镊子辅助.

            3)焊接应基本遵循元器件由矮到高的原则,先焊接电阻和电容和U1和D1,然后焊接J1-J4,接着焊接JP1,JP2和S1,最后焊接U2的底座.

4)JP1和JP2的3pin跳针,连接12是开启蓝牙功能,连接23是串口,所以我们还需要把23连上.

5)开关S1焊接的时候将开关上的一个蓝点(用记号笔做了记号的)对准板子上的一个点即可,同理,J1-J4的底座方向也要与板子上画的相同,C3,C5,C7上有一个竖线的一端是正极,D1上有一个绿色的小箭头与板上方向一致即可.U2的一段有一个凹进去的内圆,对准即可.

6)小车原有的几块板子的焊接可能也会有问题.最好可以顺便测试修理下.以绝后患!小车已有的所有板子的原理图及元器件规格等可参见KC1-Course-handout1.pdf

焊完后的板子如下所示:

2.调试部分

完成了板子的焊接后,先可以简单测试下.将小车原有的在顶上的控制板拆下,将3pin的电源插头插入刚做的板子上,D1应该会发出红光(与开关状态无关),证明电源工作基本正常.

然后需要制作USB线以及编程调试,具体可参看http://eelab.sjtu.edu.cn/Course/mod/forum/discuss.php?d=645

由于我们使用的是新的小车,上述地址中的部分信息已失效.以下可用信息摘录:

3、USB线的使用

USB转串口RS232通信电缆,TTL电平,用于单片机的串口和计算机USB口连接,通讯速率高达1M,并带+5V电源。可以用于没有串口的电脑或笔记本进行单片机编程、通信测试。可以直接与单片机的RS232 TTL信号连接,省去了RS232或485芯片;也可以用它实现各通信设备向目前流行的USB接口的转换,+5V电源可直接用于+5V电路供电。

旧款USB转TTL线(带蓝色线的)

新款USB转TTL线(带绿色线的)

四线:RS232 TTL

RXD 兰色
TXD 白色
+5V 红色 (不用,请剪掉)
GND 黑色

四线:RS232 TTL
RXD 白 色
TXD 绿 色
红色 无用,不接
GND 黑色

使用时请注意绝缘,不要短路,尤其是TXD与GND不能碰到一起,+5V和GND更不能碰到一起,由此引起的通信线损坏自行解决。

串口线最新驱动:

http://eelab.sjtu.edu.cn/Course/file.php/10/3/PL2303_Prolific_DriverInstaller_v110.zip

装后,电脑上将多出一个串口(com2或3或其他),(设备管理器可查到)通过程序控制串口的输出。

使用时,将该线的白色(TXD)和黑色(GND)接入小车单片机的RXD脚和GND脚(在单片机小板上有字标明) 即可建立小车和计算机的串行通信。

其余两根线不用,请做好绝缘。

测试方法:

使用串口调试软件,设定好串口号,通信速率,将线的TXD与线RXD(白色和蓝色,千万不能将黑色与任意一根接在一起,会短路!)接在一起,发送数据后可同时收回,可确认线是好的。

一款串口调试软件:http://eelab.sjtu.edu.cn/Course/file.php/9/Car/AccessPort.rar

制作好的usb线如下所示:

电脑上需要的操作:

1) 安装单片机的集成开发环境KeilforC51: http://eelab.sjtu.edu.cn/Course/file.php/9/Car/KeilC51v750a_Full.rar

2) 安装STC-ISP下载编程烧录软件: http://www.stcmcu.com/datasheet/stc/stc-isp-v4.80/stc-isp-v4.80-not-setup.EXE

3) 安装串口线驱动: http://eelab.sjtu.edu.cn/Course/file.php/10/3/PL2303_Prolific_DriverInstaller_v110.zip

4) 设置keil,增加对STC型号芯片的支持,需下载:http://www.stcmcu.com/datasheet/stc/STC-CDB/UV2.CDB

先将keil/uv2/下的uv2.cdb文件进行备份,然后用下载的新的文件进行替换即可.

调试部分注意事项1:

1) 确保原有的小车部件的工作正常.

2) 确保制作的USB线的几根线之间相互绝缘.

然后就可以开始写程序调试了.已经写好了一个简单的测试程序,可以测试小车前进,后退,左转和右转的基本功能.

小车完成后的样子:

写程序的基本步骤:

1) 打开keil uVision2,选择Project->New Porject

然后选择保存位置及工程的名字.然后选择CPU的类型为STC11L02.如果没有该选项,说明补丁没有打好,可参照上面 电脑上需要的操作(4) 打好补丁文件.

2) 在左边的视窗中选中Target1然后选择Project->Options for Target 'Target 1'

在打开的窗口中选择Output选项栏,将Create HEX File打上钩,并将后面选择为HEX-80.

3) 下面就可以创建代码文件并编程了.具体可参看样例程序carTestMotor.

先编译,编译成功后生成可执行文件,同时会创建一个以工程名命名的 target1.hex文件,我们要的就是这个文件

4) 打开stc-isp-v480.exe

a) 在MCU Type 的地方选择STC11L02

b) 选择刚才生成的 target1.hex 文件

c) 查看你系统的设备管理器,选择相应的USB转的com端口,如果找不到可能是驱动没装好,可以参看上面的 电脑上需要的操作(3) 安装驱动

d) 不需要做更改

e) 选择Downloads/下载,单片机的电源必须要打开,然后按开关复位单片机的状态,在提示框中就能够看到程序连接下载成功等信息了..如果提示你需要给MCU上电,说明没有成功,可以检测单片机是否供电正常,串口是否有连接正常,JP1,JP2的跳针是否正确,以及开关在断开复位后必须处于合上的状态.

5) 注意事项:

每次重新生成.hex文件想要下载到单片机上时,必须在STC-ISP中重新选择该文件,不然还是上次的版本.

步骤3中的波特率一般不用调整,会自动适应,有的电脑可能驱动问题,可以强制设定,一般9600-38400都可以.

样例程序中有较详细的注释,应该能看懂,主要的几个问题摘如下:

1) 电机的状态控制,enable端都是低电平有效,即enable端为0时,电机运转,为1时停止.

2) dir端,为0时是向前,为1时为向后,当然这与你具体的安装方法有关.这里以J1连接右轮,J2连接左轮为例,可根据自己情况调整.

3) 中断控制.没啥好说的,中断频率据实测大约为25KHz.

以上..

(ps:还缺少那根USB线的详细制作过程..一方面那个接头用的那些元件我也说不清楚..另一方面..我的都全部用胶带封起来了..不想再拆掉拍照一步步来了..)

 

附程序代码:

motor.c:

/* FILENAME: motor.c (ControlMotor) AUTHOR: Zhengji Tao ([email protected]) LastModfied: Apr 25, 2010 DESCRIPTION: The control program for the motor Func Added : 1) set motor status */ #include "motor.h" #include #include sbit drv_motor_enb0 = P3^3; //left -- J2 sbit drv_motor_enb1 = P3^5; //right -- J1 sbit drv_motor_dir0 = P3^2; sbit drv_motor_dir1 = P3^4; /* useage: to set the motor status index = 0 -- left wheel 1 -- right wheel status = 0 -- disable < 0 -- enable and backward > 0 -- enable and forward */ void drv_motor_set_status(unsigned char index, short status) { if(index == 0) { if(status == 0) { drv_motor_enb0 = 1; //high voltage to disable the motor } else { drv_motor_enb0 = 0; //low voltage to enable the motor if(status > 0) { drv_motor_dir0 = 0; //low voltage to forward } else { drv_motor_dir0 = 1; //high voltage to backward } } } else { if(status == 0) { drv_motor_enb1 = 1; } else { drv_motor_enb1 = 0; if(status > 0) { drv_motor_dir1 = 0; } else { drv_motor_dir1 = 1; } } } } 

 

timer.c:

/* FILENAME: drivers/timer.c VERSION: 1.1.0.0 AUTHOR: Tony Huang ([email protected]) RELEASE DATE: July 27, 2007 DESCRIPTION: The implement of the driver of internal timer MODIFICATION: Aug 1, 2007 ADD FUNCTION: drv_timer_istimeout() ADD FUNCTION: drv_timer_wait_jeff() */ #include #include "config.h" #include "timer.h" #ifdef DRIVER_TIMER void drv_timer_init( BOOL t1_gate, BOOL t1_is_counter, unsigned char t1_mode, BOOL t0_gate, BOOL t0_is_counter, unsigned char t0_mode ) { unsigned char command = (t1_gate << 7) |(t1_is_counter << 6) |(t1_mode << 4) |(t0_gate << 3) |(t0_is_counter << 2) |(t0_mode); TMOD = command; } void drv_timer_enable(unsigned char n) { if(n) { TR1 = 1; } else { TR0 = 1; } } void drv_timer_disable(unsigned char n) { if(n) { TR1 = 0; } else { TR0 = 0; } } #endif 

 

main.c:

/* FILENAME: main.c (selftest) AUTHOR: Zhengji Tao ([email protected]) LastModfied: Apr 25, 2010 DESCRIPTION: The selftest program for the car Func Added : 1) motor contrl 2) timer0 interrupt */ #include #include #include "timer.h" #include "motor.h" #define SECOND_TIMES 5000 int cnt = SECOND_TIMES; unsigned char seconds = 0; //to initialize the system void system_init(void); //to delay sec (seconds) void wait(unsigned char sec); //the test the motor void motor_test(void); void main(void) { system_init(); // disable drv_motor_set_status(0, 0); drv_motor_set_status(1, 0); motor_test(); while(1) ; } void motor_test(void) { // move forward drv_motor_set_status(0, 1); drv_motor_set_status(1, 1); wait(2); // move backward drv_motor_set_status(0, -1); drv_motor_set_status(1, -1); wait(2); // turn left drv_motor_set_status(0, -1); drv_motor_set_status(1, 1); wait(8); // turn right drv_motor_set_status(0, 1); drv_motor_set_status(1, -1); wait(8); //disable drv_motor_set_status(0, 0); drv_motor_set_status(1, 0); } void system_init(void) { drv_timer_init(0,0,2,0,0,2); TH0 = 0xec; TL0 = 0xec; TH1 = 0xe8; TL1 = 0xe8; drv_timer_enable(0); drv_timer_enable(1); ET0 = 1; EA = 1; } void timer0_int(void) interrupt 1 using 1 { //close interrupt EA = 0; //count if(cnt > 0) { cnt --; } else { seconds++; cnt = SECOND_TIMES; } //start interrupt EA = 1; } void wait(unsigned char sec) { unsigned int expire = seconds + sec * 5; while(expire > seconds) ; } 

 

[email protected]

你可能感兴趣的:(IT科技,实验报告)