智能车舵机PD运算

智能车舵机PD运算
智能车舵机PD运算

/**********************舵机增量式PID算法*********************** double ref = 0;//设置参数设定值

double feb = 0;//采样反馈过程值

int pwm_var = 0; //PID调整量

int PWM_out = 0; //PWM输出量

double Uo = 0;

double Ek = 0;

double Ei = 0;

double Ed = 0;

#define Kp 8 //PID调节的比例常数

#define Ti 0.05 //PID调节的积分常数

#define Td 0.02 //PID调节的微分时间常数

#define T 0.02 //采样周期

#define Kpp Kp * ( 1 + (T / Ti) + (Td / T) ) #define Ki (-Kp) * ( 1 + (2 * Td / T ) )

#define Kd Kp * Td / T

//#define Kpp 4

//#define Ki 0.8

//#define Kd 20

//误差的阀值,小于这个数值的时候,不做PID调整,避免误差较小时频繁调节引起震荡

#define Emin 3

//调整值限幅,防止积分饱和

#define Umax 100

#define Umin -100

//输出值限幅

#define Pmax 15500

#define Pmin 200

///////////////////////////////////////////////////////////////////

////// PID运算 ///////

void pid_ctrl(void)

{

Ek = ref - feb; //差值运算

if( fabs(Ek) < Emin ) //误差的阀值(死区控制??)

{

pwm_var = 0;

}

else

{

Uo = Kpp*Ek + Ki*Ei + Kd*Ed;//PID计算

Ed = Ei;

Ei = Ek;

pwm_var = (int)Uo; //制转化调整量,PWM为整数

if(pwm_var >= Umax)pwm_var = Umax; //调整值限幅,防止积分饱和 if(pwm_var <= Umin)pwm_var = Umin; //调整值限幅,防止积分饱和 }

PWM_out += pwm_var; //调整PWM输出

if(PWM_out > Pmax)PWM_out = Pmax; //输出值限幅

if(PWM_out < Pmin)PWM_out = Pmin; //输出值限幅

TBCCR1 = PWM_out;//输出给寄存器,改变PWM占空比

}

#define G_Kp 8 //P 8

#define G_Ki 15 //I

#define G_Kd 0 //D

int error;

int pre_error;

int last_error;

int U_error;

uint U_Pre1=9000; //摆头舵机中心位置

uint U_Pre2=8600; //方向舵机中心位置

uchar sum;

uchar temp,tt,ss;

/**************************************************

函数:delay_ms()

描述:

延迟x*10微秒

**************************************************/

void delay(uint time)

{

while(time--)

{

_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);

}

}

void display()

{

sum = 0;

error = 0;

/*********************************/

PORTA = 0x00;

delay(100);

if(PORTA_PA0 == 1)

{

sum++;

error -= 12;

}

/*********************************/ PORTA = 0x02;

delay(100);

if(PORTA_PA0 == 1)

{

sum++;

error -= 10;

}

/*********************************/ PORTA = 0x04;

delay(100);

if(PORTA_PA0 == 1)

{

sum++;

error -= 8;

}

/*********************************/ PORTA = 0x08;

delay(100);

if(PORTA_PA0 == 1)

{

sum++;

error -= 6;

}

/*********************************/ PORTA = 0x0a;

delay(100);

if(PORTA_PA0 == 1)

{

sum++;

error -= 4;

}

/*********************************/ PORTA = 0x0c;

delay(100);

if(PORTA_PA0 == 1)

{

sum++;

error -= 2;

}

/*********************************/ PORTA = 0x10;

delay(100);

if(PORTA_PA0 == 1)

{

sum++;

error += 2;

}

/*********************************/ PORTA = 0x12;

delay(100);

if(PORTA_PA0 == 1)

{

sum++;

error += 4;

}

/*********************************/ PORTA = 0x14;

delay(100);

if(PORTA_PA0 == 1)

{

sum++;

error += 6;

}

/*********************************/ PORTA = 0x18;

delay(100);

if(PORTA_PA0 == 1)

{

sum++;

error += 8;

}

/*********************************/ PORTA = 0x1a;

delay(100);

if(PORTA_PA0 == 1)

{

sum++;

error += 10;

}

/*********************************/ PORTA = 0x1c;

delay(100);

if(PORTA_PA0 == 1)

{

sum++;

error += 12;

}

PORTA = 0x17; //激光消影

/*********************************/

if((sum>0)&&(sum<5))

{

error = (int)(error/(sum));

if(error>4)

U_error = 220;

else if(error<-4)

U_error = -220;

else if(error>6)

U_error = 320;

else if(error<-6)

U_error = -320;

else if(error>8)

U_error = 420;

else if(error<-8)

U_error = -420;

else

U_error = ((G_Kp*(error-pre_error)+G_Ki*error+G_Kd*(error-2*pre_err or+last_error)));

if(U_error >420)

U_error = 420;

else if(U_error <-420)

U_error = -420;

U_Pre1 += U_error;

if(U_Pre1>12000)

U_Pre1 = 12000;

else if(U_Pre1<6000)

U_Pre1 = 6000;

PWMDTY01 = U_Pre1;

if(U_Pre1 > 9000) U_Pre2 = (8600+(((U_Pre1-9000)*9)/10));

else U_Pre2 = (8600-(((9000-U_Pre1)*7)/10));

if(U_Pre2 > 9800) U_Pre2 = 9800;

else if(U_Pre2 < 7400) U_Pre2 = 7400;

PWMDTY45 = U_Pre2;

}

last_error=pre_error;

pre_error=error;

/**********************/

//速度调节

if((U_Pre2>9600)||(U_Pre2<7600))

{

if(temp == 6)

{

PTP_PTP7 = 1; //电机正转

delay(100);

PTP_PTP7 = 0;

}

if(temp == 1){tt++;if(tt == 1)PWMDTY3 = 50;} else{tt = 0;temp = 1;}

}

else if((U_Pre2>9400)||(U_Pre2<7800))

{

if(temp == 2){tt++;if(tt == 2)PWMDTY3 = 70;} else{tt = 0;temp = 2;}

}

else if((U_Pre2>9200)||(U_Pre2<8000))

{

if(temp == 3){tt++;if(tt == 2)PWMDTY3 = 75;} else{tt = 0;temp = 3;}

}

else if((U_Pre2>9000)||(U_Pre2<8200))

{

if(temp == 4){tt++;if(tt == 2)PWMDTY3 = 80;} else{tt = 0;temp = 4;}

}

else if((U_Pre2>8700)||(U_Pre2<8500))

{

if(temp == 5){tt++;if(tt == 2)PWMDTY3 = 83;}

else{tt = 0;temp = 5; }

}

else if((U_Pre2<8700)||(U_Pre2>8500)) //直道

{

if(temp == 6){tt++;if(tt == 2)PWMDTY3 = 85;}

else{tt = 0;temp = 6; }

}

/************************************************************/ }

智能车高速稳定行驶局部路径规划算法

引言 智能车高速入弯时,若地面附着力不足以提供转向向心力,将导致侧滑等危险发生。智能车能否以较高平均车速安全驶过弯道,取决于路径规划基础上的转向半径与车速的合理匹配。本文采用局部优化对智能车CCD摄像头视野内的道路进行路径规划。局部优化算法包括人工势场[1]、模糊[2]、遗传[3]、蚁群[4]及粒子群算法[5]等,它们对硬件实时性要求较高。本文考虑智能车和道路几何尺寸,智能车及CCD的位置与姿态,以及弯道类型等因素,建立了简单可行且满足实时性要求的局部路径规划算法,进而确定了智能车高速稳定行驶的转向角和车速。 局部路径规划算法流程 控制程序流程如图1所示。首先,采集图像信号并去噪、提取道路中心线;然后,计算并返回图像失真校正后的世界坐标;第三,计算并返回偏航计算后的当前时刻世界坐标;第四,计算并返回路径规划算法得到的目标转向半径;最后,查询预储存在ROM 内的舵机转角和行驶速度,并调用执行程序,完成对智能车的控制。

智能车高速行驶局部路径规划算法 CCD传感器图像信息采集 CCD输出标准PAL制信号,LM1881视频同步分离芯片提取行同步和场同步信号,进而触发单片机图像采集中断,通过A/D模块将视频信号转换为数字信号。CCD输出图像分辨率为320×600,考虑单片机内存和运算速度限制,取分辨率为37×150。CCD传感器标定 假设道路为水平面,故在二维平面内标定CCD传感器,从而建立CCD图像坐标系与世界坐标系的对应关系。如图2所示,图像坐标系原点位于图像左下角,坐标轴u、v分别为CCD图像平面的横向和纵向;世界坐标系原点O'位于智能车几何中心,x'和y'轴分别为智能车横向与纵向对称面在水平面的投影线;中间坐标系原点O1'位于视场最近端中点,x1和y1轴分别为中间坐标系所在平面的横向和纵向。图2中各参数的物理意义与几何尺寸数值见表1。

智能小车舵机控制精编版

智能小车舵机控制精编 版 MQS system office room 【MQS16H-TTMS2A-MQSS8Q8-MQSH16898】

1 //只利用一个定时器 T0,定时时间为,定义一个角度标识,数值为 1、2、3、4、5, //实现、1ms、、2ms、高电平的输出,再定义一个变量,数值最大为 40,实现周期为 20ms。 //每次进入定时中断,判断此时的角度标识,进行 //相应的操作。比如此时为 5,则进入的前 5 次中断期间,信号输出为高电平,即为的 //高电平。剩下的 35 次中断期间,信号输出为低电平,即为的低电平。这样总的时间 //是 20ms,为一个周期。 //用51板上s1和s2按键 //用P1^7输出 PWM信号控制舵机 #include "" unsigned char count; //次数标识 sbit pwm =P1^7 ; //PWM信号输出 sbit jia =P3^0; //角度增加按键检测IO口 sbit jan =P3^1; //角度减少按键检测IO口 sbit jianwei=P3^4; //按键位 unsigned char jd; //角度标识 sbit dula=P2^6; sbit wela=P2^7; unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e void delay(unsigned char i)//延时 { unsigned char j,k; for(j=i;j>0;j--) for(k=125;k>0;k--); } void Time0_Init() //定时器初始化 { TMOD = 0x01; //定时器0工作在方式1 IE= 0x82; TH0= 0xfe; TL0= 0x33; //晶振, TR0=1; //定时器开始 } void Time0_Int() interrupt 1 //中断程序 { TH0 = 0xfe; //重新赋值 TL0 = 0x33; if(count

51单片机超高精度6路舵机控制程序

51单片机超高精度6路舵机控制程序 #include //包含单片机寄存器的头文件 #define uchar unsigned char #define uint unsigned int P0M1=0X00; P0M0=0XFF;//设置P0 为强推挽输出 sbit servo0=P0^0; sbit servo1=P0^1; sbit servo2=P0^2; sbit servo3=P0^3; sbit servo4=P0^4; sbit servo5=P0^5; sbit servo6=P0^6; sbit servo7=P0^7; uchar serVal[2]; uint pwm[]={1382,1382,1382,1382,1382,1382,1382,1382}; //初始90度,(实际是1382.4,取整得1382) uchar pwm_flag=0; uint code ms0_5Con=461; //0.5ms计数(实际是460.8,取整得461) uint code ms2_5Con=2304; //2.5ms计数 /******************************************************************** * 功能: 串口初始化,晶振11.0592,波特率9600,使能了串口中断 ***********************************************************************/ void Com_Init() { TMOD |= 0x20; //用定时器设置串口波特率 TH1=0xFD; //256-11059200/(32*12*9600)=253 (FD) TL1=0xFD;//同上 TR1=1;//定时器1开关打开 REN=1; //开启允许串行接收位 SM0=0;//串口方式,8位数据 SM1=1;//同上 EA=1; //开启总中断 ES=1; //串行口中断允许位 } /******************************************************************** * 功能: 舵机PWM中断初始化 ***********************************************************************/ void Timer0Init()

智能车舵机PD运算

/**********************舵机增量式PID算法*********************** double ref = 0;//设置参数设定值 double feb = 0;//采样反馈过程值 int pwm_var = 0; //PID调整量 int PWM_out = 0; //PWM输出量 double Uo = 0; double Ek = 0; double Ei = 0; double Ed = 0; #define Kp 8 //PID调节的比例常数 #define Ti 0.05 //PID调节的积分常数 #define Td 0.02 //PID调节的微分时间常数 #define T 0.02 //采样周期 #define Kpp Kp * ( 1 + (T / Ti) + (Td / T) ) #define Ki (-Kp) * ( 1 + (2 * Td / T ) ) #define Kd Kp * Td / T //#define Kpp 4 //#define Ki 0.8 //#define Kd 20 //误差的阀值,小于这个数值的时候,不做PID调整,避免误差较小时频繁调节引起震荡 #define Emin 3 //调整值限幅,防止积分饱和 #define Umax 100 #define Umin -100 //输出值限幅 #define Pmax 15500 #define Pmin 200 /////////////////////////////////////////////////////////////////// ////// PID运算 ///////

51红外循迹小车报告(舵机版)最终版

简易教程

前言 往届全国大学生电子设计竞赛曾多次出现了集光、机、电于一体的简易智能小车题目,此次,笔者在通过多次论证、比较与实验之后,制作出了简易小车的寻迹电路系统。 整个系统基于普通玩具小车的机械结构,利用小车的底盘、前后轮电机及其自动复原装置,能够平稳跟踪路面黑色轨迹运行。系统分为检测、控制、驱动三个模块。首先利用光电对接收管和路面信号进行检测,然后经过比较器处理,对软件控制模块进行实时控制,输出相应的信号给驱动芯片驱动电机转动,从而控制整个小车的运动。 智能小车能在画有黑线的白纸“路面”上行驶,这是由于黑线和白纸对光线的反射系数不同,小车可根据接收到的反射光的强弱来判断“道路”---黑线,最终实现简单的循迹运动。 个人水平有限,有错误不足之处,还望各位前辈同学多多包含,指出修正,完善。谢谢! 李学云王维 2016年7月27号

目录 前言 (1) 第一部分硬件设计 (1) 1.1 车模选择 (1) 1.2传感器选择 (1) 1.3 控制模块选择 (2) 第二部分软件设计及调试 (3) 2.1 开发环境 (3) 2.2总体框架 (3) 2.3 舵机程序设计与调试 (3) 2.3.1 程序设计 (3) 2.3.2 调试 (3) 2.3.3 程序代码 (4) 2.4 传感器调试 (5) 2.4.1 传感器好坏的检测 (5) 2.4.2 单片机能否识别信号并输出信号 (5) 2.5 综合调试 (7) 附录1 (9) 第一篇舵机(舵机及转向控制原理) (9) 1.1概述 (9) 1.2舵机的组成 (10) 1.3舵机工作原理 (11) 1.4舵机使用中应注意的事项 (12) 1.5如何利用程序实现转向 (12) 1.6舵机测试程序 (13) 附录2 (14) 第二篇光电红外传感器 (14) 2.1传感器的原理 (14) 2.2红外光电传感器ST188 结构图 (15) 2.3传感器的选择 (15) 2.4传感器的安装 (16) 2.5使用方法 (16) 2.7红外传感器输入输出调试程序 (17)

智能车中的舵机入门

单片机控制舵机 修改浏览权限 | 删除.什么是舵机: 舵机如下所示: 有三根线,一般依次是地,电源(5V左右),信号(信号的幅值>=3.3V),不清楚各个脚打开舵机一测量就知道了。 2.其工作原理是: 控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏 置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。当然我们可以不用去了解它的具体工作原理,知道它的控制原理就够了。就象我们使用晶体管一样,知道可以拿它来做开关管或放大管就行了,至于管内的电子具体怎么流动是可以完全不用去考虑的。 3.舵机的控制: 舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为 0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度伺服为例,那么对应的控制关 系是这样的: 0.5ms--------------0度;

1.0ms------------45度; 1.5ms------------90度; 2.0ms-----------135度; 2.5ms-----------180度; 重要说明: 1:上面部分还是成线形关系的,Y=90X-45(X单位是ms,Y单位是度数:) 2:上面所说的0度45度等是指度45度位置(什么意思呢:我说明一下就知道了,就拿45度位置来说,若舵机停在0度位置,下载45度位置程序后则舵机停在45度,即顺时针走了45度,若当时舵机在135度位置,则反转90度到45度位置。所以舵机不存在正转反转问题。这点非常重要。 3:若想转动到45度位置,要一直产生1.0ms的高电平(即PA0=1; Delay(1ms);PA0=0;Delay(20ms);要不停的产生这个高低电平,产生PWM脉冲 请看下形象描述吧: 下面是我在ATMEGA32上的测试程序,开发软件:ICC AVR #include typedef struct BYTE_BIT { unsigned BIT0:1; unsigned BIT1:1; unsigned BIT2:1;

51单片机程序:按键控制舵机角度

#include "reg52.h" unsigned char count; //0.5ms次数标识 sbit pwm =P2^7 ; //PWM信号输出 sbit jia =P2^4; //角度增加按键检测IO口 sbit jan =P2^5; //角度减少按键检测IO口 unsigned char jd=5; //角度标识 void delay(unsigned char i)//延时 { unsigned char j,k; for(j=i;j>0;j--) for(k=125;k>0;k--); } void Time0_Init() //定时器初始化 { TMOD = 0x01; //定时器0工作在方式1 IE = 0x82; TH0 = 0xfe; TL0 = 0x33; //11.0592MZ晶振,0.5ms TR0=1; //定时器开始 } void Time0_Int() interrupt 1 //中断程序 { TH0 = 0xfe; //重新赋值 TL0 = 0x33; if(count< jd) //判断0.5ms次数是否小于角度标识 pwm=1; //确实小于,PWM输出高电平 else pwm=0; //大于则输出低电平 count=(count+1); //0.5ms次数加1 count=count%40; //次数始终保持为40 即保持周期为20ms } void keyscan() //按键扫描 { if(jia==0) //角度增加按键是否按下 { delay(10); //按下延时,消抖 if(jia==0) //确实按下 { jd++; //角度标识加1 count=0; //按键按下则20ms周期从新开始 if(jd==6) jd=5; //已经是180度,则保持 while(jia==0); //等待按键放开

飞思卡尔--智能车舵机讲解

飞思卡尔--智能车舵机讲解

2.2 舵机的安装 完成了玩具车的拆卸之后要做的第二步就是安装舵机,现在市场上卖的玩具车虽然也具有转向 功能,但是前轮的转向多是依靠直流电机来驱动,无论向哪个方向转都是一下打到底,无法控制转 过固定的角度,因此根据我们的设计需求,需要将原有的转向部分替换成现有的舵机,以实现固定 转角的转向。舵机的实物图如图 2.1所示。 需要说明的是由于小车系玩具车改装,在安装舵机是需要合理的利用小车的结构,将舵机安装 牢固,同时还需注意合理利用购买舵机是附赠的齿轮,从而将舵机固定在合适的位置。舵机的安装 方式有俯式、卧式多种,不同的安装方法力臂长短、响应速度都有所不同,这一点请自己根据实际 情况合理选择,图 2.2 为舵机的安装图。 5

图 2.1 舵机实物图图 2.2 舵机安装图 舵机安装过程中有一点需要尤其注意,由于舵机不是360°可转的,因此必须保证车轮左右转 的极限在舵机的转角范围之内。 舵机安装完毕之后就可以对小车的转角进行控制了,但是由于玩具车的车体设计往往限制了小 车的转角,因此可以对小车进行局部的“破坏”来增大前轮的转角,要知道在比赛中追求速度的同 时一个大的转角对小车的可控性会有一个很大的提升,如图2.3 所示,就是对增加小车转角的一个 改造,这是我在去年小车比赛中的用法。将阻碍前轮转角的一部分用烙铁直接烫掉。 但是这种做法也有风险,由于你的改造会破坏小车的整体 7

结构,有可能会对小车的硬件结构造 成破坏,因此如果你的小车在改造之后显得过于脆弱的话那你就要对你的小车采取些加固措施了。 3.4 舵机转向模块设计 舵机是小车转向的控制机构,具有体积小、力矩大、外部机械设计简单、稳定性高等特 点,无论是在硬件还是软件舵机设计是小车控制部分的重要组成部分,舵机的主要工作流程 为:控制信号→控制电路板→电机转动→齿轮组减速→舵盘转动→位置反馈电位计→控制电路板反馈。图 3.11 为舵机的实物图。 7

智能小车自主路径规划算法的设计与改进

龙源期刊网 https://www.360docs.net/doc/0b7500680.html, 智能小车自主路径规划算法的设计与改进 作者:王汉元 来源:《电子技术与软件工程》2018年第04期 摘要本文探讨了智能小车自主路径规划算法的设计与改进,并对所提出的算法进行了仿 真分析。该自主路径规划算法简单可行,能够使智能小车在顺利避开障碍物的同时从起始位置行进至目标位置,确保智能小车在整个行驶路径上的安全。该算法综合使用动态窗口法,根据智能小车与障碍物之间的距离,在智能小车通过动态窗口法规划得到的速度中引入从障碍物指向智能小车的逃逸速度,补偿了动态窗口法的不足,获得了搜索路径快、可执行性好、有效地防止智能小车与障碍物碰撞的优点。 【关键词】智能小车路径规划动态窗口法逃逸速度 1 引言 智能小车是各种高新技术综合集成的载体,其集环境感知、规划决策等功能于一体,融合了机器人技术、人工智能技术、自动化控制技术、机器视觉技术等。智能小车在进行自主路径规划时,其主要任务在于,在存在障碍物的环境中发现一条从起始位置到目标位置的适当的行驶路径,使智能小车在行进途中顺利地绕过障碍物而不与障碍物发生碰撞。如何提出一种简单可行的算法使智能小车在顺利避开障碍物的同时从起始位置行进至目标位置,是本领域的一个重要问题。 2 自主路径规划的背景介绍 2.1 自主路径规划的任务 智能小车的路径规划需要解决如下问题: (1)智能小车从起始位置行进至目标位置; (2)智能小车在不碰到障碍物的前提下对智能小车的路径进行优化。 2.2 路径规划方法的分类 根据对环境信息的把握程度,路径规划方法分为:基于先验完全信息的全局路径规划,在这种规划方法中,智能小车所处的环境的全部信息已知;以及基于传感器信息的局部路径规划,在这种规划方法中,智能小车所处的环境的部分信息或者全部信息未知。其中,局部路径规划是指,基于传感器的信息,在智能小车行进过程中动态地确定其当前位置以及周围局部范围内的环境,规划出局部最优路径以到达目标位置。

飞思卡尔 智能车舵机控制

智能车的制作中,看经验来说,舵机的控制是个关键.相比驱动电机的调速,舵机的控制对于智能车的整体速度来说要重要的多. PID算法是个经典的算法,一定要将舵机的PID调好,这样来说即使不进行驱动电机的调速(匀速),也能跑出一个很好的成绩. 机械方面: 从我们的测试上来看,舵机的力矩比较大,完全足以驱动前轮的转向.因此舵机的相应速度就成了关键.怎么增加舵机的响应速度呢?更改舵机的电路?不行,组委会不允许.一个非常有效的办法是更改舵机连接件的长度.我们来看看示意图: 从上图我们能看到,当舵机转动时,左右轮子就发生偏转.很明显,连接件长度增加,就会使舵机转动更小的转角而达到同样的效果.舵机的特点是转动一定的角度需要一定的时间.不如说(只是比喻,没有数据),舵机转动10度需要2ms,那么要使轮子转动同样的角度,增长连接件后就只需要转动5度,那么时间是1ms,就能反应更快了.据经验,这个舵机的连接件还有必要修改.大约增长0.5倍~2倍. 在今年中,有人使用了两个舵机分别控制两个轮子.想法很好.但今年不允许使用了.

接下来就是软件上面的问题了. 这里的软件问题不单单是软件上的问题,因为我们要牵涉到传感器的布局问题.其实,没有人说自己的传感器布局是最好的,但是肯定有最适合你的算法的.比如说,常规的传感器布局是如下图: 这里好像说到了传感器,我们只是略微的一提.上图只是个示意图,意思就是在中心的地方传感器比较的密集,在两边的地方传感器比较的稀疏.这样做是有好处的,大家看车辆在行驶到转弯处的情况: 相信看到这里,大家应该是一目了然了,在转弯的时候,车是偏离跑道的,所以两边比较稀疏还是比较科学的,关于这个,我们将在传感器中在仔细讨论。 在说到接下来的舵机的控制问题,方法比较的多,有人是根据传感器的状态,运用查表法差出舵机应该的转角,这个做法简单,而且具有较好的滤波"效果",能够将错误的传感器状态滤掉;还有人根据计算出来的传感器的中心点(比

智能循迹车及其路径规划的设计

智能循迹车及其路径规划的设计 本设计采用Arduino和STM32单片机最小系统,运用光电和运动姿态传感器,结合PID自动控制算法和A*路径规划算法,通过设计系统运行的总体框架,开发出了一款在具有基本自主循迹功能的基础上,结合了路径规划能力的智能循迹车。通过在竞赛中实际检验,本设计实现了在迷宫地图中的全场定位以及路径规划中的预设巡航行驶和最短路径行驶的功能,并达到了较佳的控制效果。本设计方案亦可作为相关机器人竞赛项目的基础参考方案。 标签:智能循迹车;路径规划;A*算法;Arduino;STM32 Abstract:This design adopts Arduino and STM32 single chip microcomputer minimum system,uses photoelectric and motion attitude sensor,combines PID automatic control algorithm and A* path planning algorithm,through the design of the overall framework of the system operation,and based on the basic autonomous tracking function,an intelligent tracking vehicle is developed,which combines the ability of path planning. Through the actual test in the competition,this design realizes the full field positioning in the labyrinth map and the preset cruising and the shortest path driving in the path planning,and achieves the better control effect. This design scheme can also be used as the basic reference scheme of the related robot competition projects. Keywords:intelligent tracking vehicle;path planning;A* algorithm;Arduino;STM32 引言 在近年来的各类机器人比赛中,智能循迹车因其具有技术性、竞技性和创新性,而成为了一个热门项目。智能循迹车系统结合传感器学、自动控制、嵌入式、路径规划技术等于一体,集成程度高,使用的算法较为多样,能够体现开发者的创新水平。路径规划技术是循迹车自主导航行驶的核心技术,运用了该技术的智能循迹车或自走机器人可以按程序设定完成规定路径巡航和自主探索两点之间的最短路径等任务。在众多的移动机器人路径规划算法中,A*算法[1]已得到广泛应用、验证以及推广。本设计结合循迹控制和路径规划,运用了PID控制算法[2]、运动传感器姿态解算[3]、全场定位和A*路径规划,综合达到了预期控制效果。 1 智能循迹车设计分析 1.1 智能循迹车设计要求 设计智能小车实现能够在白色底黑色线(25mm宽)地图上以自动循迹行驶为基础,完成按任意预设路径巡航行驶和探索两点间最短路径行驶的任务。地图

舵机控制程序

在机器人机电控制系统中,舵机控制效果是性能的重要影响因素。舵机可以在微机电系统和航模中作为基本的输出执行机构,其简单的控制和输出使得单片机系统非常容易与之接口。 舵机是一种位置伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。其工作原理是:控制信号由接收机的通道进入信号调制芯片,

获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。舵机的控制信号是PWM信号,利用占

空比的变化改变舵机的位置。一般舵机的控制要求如图1所示。 图1 舵机的控制要求 单片机实现舵机转角控制可以使用FPGA、模拟电路、单片机来产生舵机的控制信号,但FPGA成本高且电路复杂。对于脉宽调制信号的脉宽变换,常用的一种方法是采用调制信号获取有源滤波后的直流电压,但是需要50Hz(周期是20ms)的信号,这对运放 器件的选择有较高要求,从电路体积和功耗考虑也不易采用。5mV 以上的控制电压的变化就会引起舵机的抖动,对于机载的测控系统而言,电源和其他器件的信号噪声都远大于5mV,所以滤波

电路的精度难以达到舵机的控制精度要求。 也可以用单片机作为舵机的控制单元,使PWM信号的脉冲宽度实现微秒级的变化,从而提高舵机的转角精度。单片机完成控制算法,再将计算结果转化为PWM信号输出到舵机,由于单片机系统是一个数字系统,其控制信号的变化完全依靠硬件计数,所以受外界干扰较小,整个系统工作可靠。 单片机系统实现对舵机输出转角的控制,必须首先完成两个任务:首先是产生基本的PWM周期信号,本设计是产生20ms的周期信号;其次是脉宽的调整,即单片机模拟PWM信号的输出,并且调整占空比。当系统中只需要实现一个舵机的控制,采用的控制方式是改变单片机的一个定时器中断的初值,将20ms分为两次中断执行,一次短定时中断和一次长定时中断。这样既节省了硬件电路,也减少了软件开销,控制系统工作效率和控制精度都很高。 具体的设计过程: 例如想让舵机转向左极限的角度,它的正脉冲为2ms,则负脉冲为 20ms-2ms=18ms,所以开始时在控制口发送高电平,然后设置定时器在

机器人智能小车电机选择直流电机 步进电机 舵机

常用于机器人的电机有直流电机,步进电机,伺服电机。 直流电机:用于驱动机器人的移动,加上电源后,电机将一直转动,颠倒电机的电源和地线就会改变电机的转动方向。价格便宜,适用于大多数机器人应用。 点击参见:直流电机的H桥驱动原理和驱动电路选择 步进电机:也是直流电机的一种,步进电机内部有多个线圈,同时给一个或两个线圈加电,电机将转过一定的角度,要想电机连续转动,就要依次给给个线圈加电,加电的过程就是给电机施加 脉冲电流的过程。改变脉冲的频率就改变了电机的转速,改变施加脉冲的顺序就改变了电 机的转动方向。用于机器人需要位置控制的场合,如机械臂。 点击参见:步进电机的驱动原理和驱动电路 步进电机分类和选择 伺服电机:一个连续转动的直流电机,加一个闭环反馈控制的回路,以实现精确的位置控制。舵机即是伺服电机的一种,常用于飞机模型中用于转向控制。可用于驱动机器人的腿,手臂,头部和 其他肢体。 点击参见:数码舵机的原理与故障分析 点击参见:舵机的原理与单片机的控制

电机的技术参数 1、电机的电压 电压是选择直流电机的一个重要参数,小型的趣味机器人用的直流电机一般为1.5v-6v, 在这个电压范围内电机都可以工作,电压越高,转速越高。也有采用固定电压的高质量的电 机,如12V,24V直流电机。一般情况下电机都可以在高于或低于其工作电压的情况下 运行,如12V电机,可以在8v下工作,但转速降低,输出转矩变小,电机无力。如果长 时间在高于其工作电压30%-40%的电压下工作,电机线圈会发热,可能使电机永久 损坏。 2、电机的电流 空载电流:指电机不加轮胎及其他任何负载的情况下的电流。 负载电流:指加上轮胎,和其他重物下电机工作的电流。 通常空载的电流很小,负载电流是其实际工作的电流,是选择驱动电路的依据。当电机的负 载超过了电机所能承受的最大值时,电机将停止转动,电流不再增加,这就是堵转。 3、电机的转速 指的是电机的主轴每分钟转过的转数。单位为转数/分钟(r/min),机器人需要的电机转速 一般在100-200转每分钟,甚至更低的转数,而一般的直流电机的转速在4000~7000转每 分钟,无法直接在机器人上使用,必须经过降速。可以自己设计齿轮比来降速,也可以采用 现成的减速齿轮箱。 4、转矩 就是电机能够带动多大的负载,转矩越大电机越有劲。额定转矩:电机在正常工作下能够驱动负载的大小。测量方法是在电机轴上固定一个杠杆,杠杆上挂上重物,让电机带动重物旋转。 单位为g/cm,单位厘米所能带动的重物克数越大,转矩也就越大。 文章网址: https://www.360docs.net/doc/0b7500680.html,/wqb_lmkj/blog/item/41249a100292d2195aaf5394.html?timeStamp=1316176239437

基于Dubins路径的智能车辆路径规划算法

收稿日期:2015-05-10 修回日期:2015-06-09 基金项目: 山西省科技攻关基金资助项目(20130321005-04)作者简介:宋国浩(1990-),男,山东曲阜人,在读硕士研究生。研究方向:机械工程、智能车辆。 *摘 要:路径规划是车辆智能化的核心问题之一,而所有路径均可分解为简单的Dubins 路径。在Dubins 路径的 思想下对智能车辆的行驶路径进行分段研究,并利用经典PID 控制对该算法的执行性能进行检验。研究表明:算法能计算出车辆行驶的最短路径,减少了车辆行驶的路径长度,缩短了行驶时间,减少了控制系统的计算量,提高了车辆执行系统的执行力度,降低了执行误差,对最优路径具有较好的选择性。 关键词:智能车,路径规划,Dubins 路径,最短路径中图分类号:TP273+.1 文献标识码:A 基于Dubins 路径的智能车辆路径规划算法* 宋国浩,黄晋英,兰艳亭 (中北大学机械与动力工程学院,太原030051) Intelligent Vehicles Path Planning Algorithm Based on Dubins Path SONG Guo-hao ,HUANG Jin-ying ,LAN Yan-ting (School of Mechanical and Power Engineering ,North University of China ,Taiyuan 030051,Chian ) Abstract :The path planning is one of the core issues of intelligent vehicles.All paths can be decomposed into Dubins path.This paper sectionally researches into the intelligent vehicles ’travel path under the idea of Dubins path and carries out tests on the execution performance of the algorithm using PID control strategy.Researches showed that this algorithm can calculate the vehicles ’shortest path ,reduce the vehicles ’path length ,shorten the time of driving ,reduce the computation amount of the control system ,improve the enforcement of the vehicle execution system ,reduce the execution error ,and have a good selectivity of the optimal path. Key words : intelligent vehicles ,path planning ,dubins path ,the shortest path 0引言 路径规划应用在很多领域,例如:军事无人机、 航天探测机器人、智能车辆以及监视和侦察等工作 [1-3] 。路径规划在现代汽车领域中是一个研究热门领域,需要考虑多方面的因素,如:汽车自身约束条件,车辆行驶环境的约束以及其他的行驶问题。在路径规划中,首先应考虑车辆的可行驶性,在对车辆行驶路线进行规划时,应保证其安全行驶的前提下,尽可能大地规划出车辆行使范围。在保证车辆安全行驶的问题中,需要使车辆自主地绕开其他影响车辆行驶的物体,使车辆避免与障碍物相撞。路径规划算法应具有精确性,占有较小的内存,并满 足实时性的要求,在执行过程中没有明显的延时问 题[4-5]。此外,为了使行驶路径达到最优,提高行驶效率,还应缩短车辆行驶长度。 目前,在有关路径规划的研究中,如张明环等[6]提出的触须算法,此算法是在车辆行驶前,首先对车辆将要行驶的路线进行规划,让车辆按照规划好的16*81条可使用的路径行驶,这样可以使车辆节省大量的反应时间,但却不能够处理突变情况,研究背景过于理想化;王凯等[7]提出了改进的人工势场法,将此算法应用在智能车路径规划中的避障环节,解决了传统人工势场法在路径规划中易陷入局部极小值的问题,具有一定的实时性,但其受限于所用传感器性能的影响,其作用范围较小,且易受 文章编号:1002-0640(2016) 06-0041-05Vol.41,No.6Jun ,2016 火力与指挥控制 Fire Control &Command Control 第41卷第6期2016年6月 41··

51控制舵机程序大全

#include void InitTimer0(void) { TMOD = 0x01; TH0 = 0x0B1; TL0 = 0x0E0; EA = 1; ET0 = 1; TR0 = 1; }void delay(1)(void) { unsigned char a,b,c; for(c=1;c>0;c--) for(b=142;b>0;b--) for(a=2;a>0;a--); } void main(void) { InitTimer0(); P1_2=0; while(1); } void Timer0Interrupt(void) interrupt 1 { //20ms中断 TH0 = 0x0B1; TL0 = 0x0E0; P1_2=1; delay(1); P1_2=0; }

#include #include #include #define uchar unsigned char #define uint unsigned int sbit IN1=P0^0; sbit IN2=P0^1; sbit EA1=P0^5; sbitdj=P0^7; //舵机口 uint t=0;//中断次数 ucharzk;//高电平中断次数uchar p=0;//定义pwm占空比void delay(uint z) { uinti,j; for(i=0;i>8;//100us一次中断TL0=-100%256; if(t==0)zk=p; if(t=zk) dj=0; t++; if(t>=200) t=0;//20mspwm周期 } void turn_left() { IN1=1;IN2=0;EA1=1;//电机工作p=5;//0.5ms delay(600); } void turn_right() { IN1=1;IN2=0;EA1=1;//电机工作p=25;//2.5ms delay(600);

51单片机一个定时器控制多路舵机

#ifndef __interrupt0_H__ #define __interrupt0_H__ void interrupt0() //STM中断服务子程序 { _t2af = 0 ; switch (cnt) { case 0: PWMOUT_2 = PWMOUT_3 = PWMOUT_4 = PWMOUT_5 = PWMOUT_6 = 0; PWMOUTbuf_1 = (PWMbuf - PWMOUTbuf_1); _tm2al = PWMOUTbuf_1 & 0x00ff; _tm2ah = PWMOUTbuf_1 >>8 ; //重新定义计数初值 if( PWMOUTbuf_1 >= PWMOUTbufmin1 && PWMOUTbuf_1 <= PWMOUTbufmax1) {PWMOUTbuf_1 = PWMOUTcnt_1; PWMOUT_1 = 1;} else {PWMOUTbuf_1 = PWMbuf-PWMOUTcnt_1; PWMOUT_1 = 0 ; cnt = 1;} //判断脉宽是否在正常范围之内 break; case 1: PWMOUT_1 = PWMOUT_3 = PWMOUT_4 = PWMOUT_5 = PWMOUT_6 = 0; PWMOUTbuf_2 = (PWMbuf - PWMOUTbuf_2); _tm2al = PWMOUTbuf_2 & 0x00ff; //重新定义计数初值 _tm2ah = PWMOUTbuf_2 >> 8; if(PWMOUTbuf_2 >= PWMOUTbufmin1 && PWMOUTbuf_2 <= PWMOUTbufmax1) {PWMOUTbuf_2 = PWMOUTcnt_2; PWMOUT_2 = 1;} else {PWMOUTbuf_2 = PWMbuf-PWMOUTcnt_2;PWMOUT_2 = 0;cnt = 2;} //判断脉宽是否在正常范围之内 break; case 2: PWMOUT_1 = PWMOUT_2 = PWMOUT_4 = PWMOUT_5 = PWMOUT_6 = 0; PWMOUTbuf_3 = (PWMbuf - PWMOUTbuf_3); _tm2al = PWMOUTbuf_3 & 0x00ff; //重新定义计数初值 _tm2ah = PWMOUTbuf_3 >> 8; if(PWMOUTbuf_3 >= PWMOUTbufmin1 && PWMOUTbuf_3 <= PWMOUTbufmax1) {PWMOUTbuf_3 = PWMOUTcnt_3; PWMOUT_3 = 1;}

关于智能车舵机

伺服马达原理与控制, 模拟舵机和数字舵机的区别, 以及常见问题解决 伺服马达原理与控制 1、伺服马达内部结构 伺服马达内部包括了一个小型直流马达;一组变速齿轮组;一个反馈可调电位器;及一块电子控制板。其中,高速转动的直流马达提供了原始动力,带动变速(减速)齿轮组,使之产生高扭力的输出,齿轮组的变速比愈大,伺服马达的输出扭力也愈大,也就是说越能承受更大的重量,但转动的速度也愈低 伺服马达内部结构图 2、伺服马达的工作原理 伺服马达是一个典型闭环反馈系统,其原理可由下图表示:

伺服马达工作原理图 减速齿轮组由马达驱动,其终端(输出端)带动一个线性的比例电位器作位置检测,该电位器把转角坐标转换为一比例电压反馈给控制线路板,控制线路板将其与输入的控制脉冲信号比较,产生纠正脉冲,并驱动马达正向或反向地转动,使齿轮组的输出位置与期望值相符,令纠正脉冲趋于为0,从而达到使伺服马达精确定位的目的。 3、如何控制伺服马达 标准的微型伺服马达有三条控制线,分别为:电源、地及控制。电源线与地线用于提供内部的直流马达及控制线路所需的能源,电压通常介于4V—6V之间,该电源应尽可能与处理系统的电源隔离(因为伺服马达会产生噪音)。甚至小伺服马达在重负载时也会拉低放大器的电压,所以整个系统的电源供应的比例必须合理。 输入一个周期性的正向脉冲信号,这个周期性脉冲信号的高电平时间通常在1ms—2ms 之间,而低电平时间应在5ms到20ms之间,并不很严格,下表表示出一个典型的20ms周期性脉冲的正脉冲宽度与微型伺服马达的输出臂位置的关系:

4、伺服马达的电源引线 电源引线有三条,如图中所示。伺服马达三条线中白色的线是控制线,接到控制芯片上。中间的是SERVO工作电源线(红色),一般工作电源是5V。第三条是地线。 5、伺服马达的运动速度 伺服马达的瞬时运动速度是由其内部的直流马达和变速齿轮组的配合决定的,在恒定的电压驱动下,其数值唯一。但其平均运动速度可通过分段停顿的控制方式来改变,例如,我们可把动作幅度为90o的转动细分为128个停顿点,通过控制每个停顿点的时间长短来实现0o—90o变化的平均速度。对于多数伺服马达来说,速度的单位由“度数/秒”来决定。 6、使用伺服马达的注意事项 除非你使用的是数码式的伺服马达,否则以上的伺服马达输出臂位置只是一个不准确的大约数。 普通的模拟微型伺服马达不是一个精确的定位器件,即使是使用同一品牌型号的微型伺服马达产品,他们之间的差别也是非常大的,在同一脉冲驱动时,不同的伺服马达存在±10o 的偏差也是正常的。 正因上述的原因,不推荐使用小于1ms及大于2ms的脉冲作为驱动信号,实际上,伺服马达的最初设计表也只是在±45o的范围。而且,超出此范围时,脉冲宽度转动角度之间

飞思卡尔智能车的数据采集(CCD摄像头)程序,舵机,电机控制程序

*********************************************************************************** * Test.c * Description: This file includes I/ O function for test, the PWM outputs function for test, function * testing sensors. * (c) Copyright 2006,Zhao Cheng * All Rights Reserved * * By : Zhao Cheng * Note : Don't change this file if possible. **********************************************************************************/ #include #include #define HIGHSPEED 8000 #define LOWSPEED 11000 /* 速度变量,0-24000 数值越大,速度越慢*/ void PWMout(int, int); /* 24000-20000 */ void IOtest(void) { static unsigned char i=0,j=0x01,k; DDRB = DDRA = 0xFF; PORTB = 0xf0;

for(;;) { k=(~j)&0x7f; PORTA = PORTB = k; while (TCNT != 0x0000); while (TCNT == 0x0000) { if(i>9) { j=j<<1; i=0; } i++; } if(j>=0x80) j=0x01; } } void PWMtest(void) { int counter=-4500;

相关文档
最新文档