标题:
智能小车循迹加避障电路图 源程序
[打印本页]
作者:
780102636
时间:
2016-12-10 17:56
标题:
智能小车循迹加避障电路图 源程序
这个简单的避障小车使用超声波进行距离测量,根据测量距离决定小车行驶方向。对于避障做了简化处理,只要有障碍物就右转。为了节省成本,只用了一个超声波模块,因此只能对正前方物体进行避障。小车采用三轮结构,速度差进行方向控制。
超声波模块使用的成品模块,单片机使用一个最小系统板,底板上有L293D电机驱动模块。总体组装如下图:
0.png
(369.1 KB, 下载次数: 112)
下载附件
2017-1-7 16:54 上传
避障小车原理图.rar
(35.42 KB, 下载次数: 95)
2017-1-7 16:53 上传
点击文件名下载附件
下载积分: 黑币 -5
避障小车源代码.rar
(4.46 KB, 下载次数: 44)
2017-1-7 16:53 上传
点击文件名下载附件
下载积分: 黑币 -5
部分源码预览:
/*
* motor.c
*
* Created on: 2011-3-3
* Author: Jason Jiang
* Home Page: www.ruixuedz.com.cn
* Email: ruixuedz@gmail.com
*/
#include "motor.h"
#include "uart.h"
MOTOR_STATE g_motor_state = MOTOR_STOP;
uchar g_count = 0;
uchar g_left_pwm = 0;
uchar g_right_pwm = 0;
void motor_init()
{
cli();
INPUT_DDR |= _BV(LEFT_INPUT1) | _BV(LEFT_INPUT2) | _BV(RIGHT_INPUT1) | _BV(
RIGHT_INPUT2);
ENABLE_DDR |= _BV(LEFT_ENABLE) | _BV(RIGHT_ENABLE);
INPUT_PORT &= ~(_BV(LEFT_INPUT1) | _BV(LEFT_INPUT2) | _BV(RIGHT_INPUT1)
| _BV(RIGHT_INPUT2));
ENABLE_PORT &= ~(_BV(LEFT_ENABLE) | _BV(RIGHT_ENABLE));
setSpeed(200, 200);
TCCR0 = 0x00; //停止定时器
TCNT0 = 0x38; //设置初始值
TIMSK |= 0x01;
TCCR0 = 0x02; //开动定时器
sei();
}
void motor_rotate()
{
if (MOTOR_ROTATE == g_motor_state)
{
return;
}
steerMotor(ROTATE_RIGHT);
g_motor_state = MOTOR_ROTATE;
}
void motor_forward()
{
if (MOTOR_FORWARD == g_motor_state)
{
return;
}
steerMotor(MOVE_FORWARD);
g_motor_state = MOTOR_FORWARD;
}
void steerMotor(MOTOR_STEER_ENUM steer)
{
switch (steer)
{
case MOVE_FORWARD:
INPUT_PORT &= ~(1 << LEFT_INPUT1);
INPUT_PORT |= (1 << LEFT_INPUT2); //Left Motor On Forward
INPUT_PORT &= ~(1 << RIGHT_INPUT1);
INPUT_PORT |= (1 << RIGHT_INPUT2); //Right Motor On Forward
break;
case TURN_LEFT:
INPUT_PORT &= ~(1 << LEFT_INPUT1);
INPUT_PORT &= ~(1 << LEFT_INPUT2); //Left Motor off
INPUT_PORT &= ~(1 << RIGHT_INPUT1);
INPUT_PORT |= (1 << RIGHT_INPUT2); //Right Motor On Forward
break;
case TURN_RIGHT:
INPUT_PORT &= ~(1 << LEFT_INPUT1);
INPUT_PORT |= (1 << LEFT_INPUT2); //Left Motor On Forward
INPUT_PORT &= ~(1 << RIGHT_INPUT1);
INPUT_PORT &= ~(1 << RIGHT_INPUT2); //Right Motor off
break;
case ROTATE_LEFT:
INPUT_PORT |= (1 << LEFT_INPUT1);
INPUT_PORT &= ~(1 << LEFT_INPUT2); //Left Motor On Reverse
INPUT_PORT &= ~(1 << RIGHT_INPUT1);
INPUT_PORT |= (1 << RIGHT_INPUT2); //Right Motor On Forward
break;
case ROTATE_RIGHT:
INPUT_PORT &= ~(1 << LEFT_INPUT1);
INPUT_PORT |= (1 << LEFT_INPUT2); //Left Motor On Forward
INPUT_PORT |= (1 << RIGHT_INPUT1);
INPUT_PORT &= ~(1 << RIGHT_INPUT2); //Right Motor On Reverse
break;
case MOVE_BACKWARD:
INPUT_PORT |= (1 << LEFT_INPUT1);
INPUT_PORT &= ~(1 << LEFT_INPUT2); //Left Motor On Reverse
INPUT_PORT |= (1 << RIGHT_INPUT1);
INPUT_PORT &= ~(1 << RIGHT_INPUT2); //Right Motor On Reverse
break;
case FULL_STOP:
INPUT_PORT &= ~(1 << LEFT_INPUT1);
INPUT_PORT &= ~(1 << LEFT_INPUT2); //Left Motor off
INPUT_PORT &= ~(1 << RIGHT_INPUT1);
INPUT_PORT &= ~(1 << RIGHT_INPUT2); //Right Motor off
break;
default:
break;
}
}
void setSpeed(uchar left_pwm, uchar right_pwm)
{
g_left_pwm = left_pwm;
g_right_pwm = right_pwm;
}
ISR(TIMER0_OVF_vect) //定时器溢出中断程序
{
TCNT0 = 0x38; //从新调入初始值
g_count++; //每中断一次加1
//printStr("int\n");
if (g_count < g_left_pwm) //判断pwm1是不是改输出高电平
{
ENABLE_PORT |= (1 << LEFT_ENABLE);
//printStr("l1\n");
}
else
{ //不是则输出0
ENABLE_PORT &= ~(1 << LEFT_ENABLE);
//printStr("l0\n");
}
if (g_count < g_right_pwm)
{
ENABLE_PORT |= (1 << RIGHT_ENABLE);
//printStr("r1\n");
}
else
{
ENABLE_PORT &= ~(1 << RIGHT_ENABLE);
//printStr("r0\n");
}
}
复制代码
作者:
疯和尚
时间:
2018-4-9 18:31
很好,对我很有帮助
作者:
WKG_123456
时间:
2018-7-24 14:08
群主你好!在51黑内在示教控制器方面资料吗?谢谢!若有那个髙手知道,加我QQ:550220127聊!谢谢!!
作者:
飞飞....
时间:
2018-8-2 17:23
这用的是51单片机吗
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1