- 1、本文档共42页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第5章 智能小车设计;目录;5.1 制作智能小车;5.1.1直流电机;5.1.2直流无刷电机的控制原理;当电机转动起来,控制部会再根据驱动器设定的速度及加/减速率所组成的命令(Command)与hall-sensor信号变化的速度加以比对(或由软件运算)再来决定由下一组(AH、BL或AH、CL或BH、CL或……)开关导通,以及导通时间长短。速度不够则开长,速度过头则减短,此部份工作就由PWM来完成。PWM是决定电机转速快或慢的方式,如何产生这样的PWM才是要达到较精准速度控制的核心。 高转速的速度控制必须考虑到系统??CLOCK 分辨率是否足以掌握处理软件指令的时间,另外对于hall-sensor信号变化的资料存取方式也影响到处理器效能与判定正确性、 实时性。至于低转速的速度控制尤其是低速起动则因为回传的hall-sensor信号变化变得更慢,怎样撷取信号方式、处理时机以及根据电机特性适当配置控制参数值就显得非常重要。或者速度回传改变以encoder变化为参考,使信号分辨率增加以期得到更佳的控制。电机能够运转顺畅而且响应良好,P.I.D.控制的恰当与否也无法忽视。之前提到直流无刷电机是闭回路控制,因此回授信号就等于是告诉控制部电机转速距离目标速度还差多少,这就是误差(Error)。知道了误差自然就要补偿,方式有传统的工程控制如P.I.D.控制。但控制的状态及环境其实是复杂多变的,若要控制的坚固耐用则要考虑的因素恐怕不是传统的工程控制能完全掌握,所以模糊控制、专家系统及神经网络也将被纳入成为智能型P.I.D.控制的重要理论。;5.1.3 直流电机的控制;简单控制的示例:
void setup()
{pinMode(3,OUTPUT);}
void loop()
{digitalWrite(3,HIGH);
delay(2000);
pinMode(3,OUTPUT);}
int motorpin = 3;
void setup(){}
void loop(){
for(int fadeValue = 0;fadeValue <=255;fadeValue+=50)
{analogWrite(motorpin,fadeValue);
delay(2000);}
for(int fadeValue =255;fadeValue >=0;fadeValue-=50)
{analogWrite(motorpin,fadeValue);
delay(2000);}}
;5.2 采用驱动模块进行控制;图5-3 接口定义;*当ENA 使能 IN1 IN2 控制 OUT1 OUT2*当ENB 使能 IN3 IN4 控制 OUT3 OUT4由于本模块是2路的H桥驱动,所以可以同时驱动两个电机,使能ENA ENB之后,*可以分别从IN1 IN2输入PWM信号驱动电机1的转速和方向*可以分别从IN3 IN4输入PWM信号驱动电机2的转速和方向
;(2)接线方式
IN1-4 分别接Arduino mega2560的PIN4-7,将L298N上的ENA、ENB插口上的插销拔掉,随后,将ENA与Arduino mega2560 的PIN11脚相连,ENB与Arduino mega2560的PIN8相连。连线示意图如图5-6所示。IN1接PIN4; IN2接PIN5; IN3接PIN6; IN4接PIN7;ENA接PIN11; ENB接PIN8;
;示例:
#define motor1pin1 4 //定义IN1引脚
#define motor1pin2 5 //定义IN2引脚
#define motor1pwm 11 //定义ENA引脚(我的是Mega2560的板子)
#define motor2pin1 6 //定义IN3引脚
#define motor2pin2 7 //定义IN4引脚
#define motor2pwm 8 //定义ENB引脚
void motor(int motorpin1,int motorpin2,int motorpwm,int val) {
pinMode(motorpin1,OUTPUT); //输出第一个引脚
pinMode(motorpin2,OUTPUT); //输出第二个引脚
digitalWrite(motorpin2,0); //将第二个引脚置低
digitalWrite(motorpin1,1); //将第一个引脚抬高
analogWrite(motorpwm,val); //给EN引脚设定模拟值,设定转速}
void setup(){ }
void loop()
{int i;
;for(i=100;i<=255;i++) //让电机的转速从100到255转
文档评论(0)