智能小车的直流电机控制

  • 格式:doc
  • 大小:159.50 KB
  • 文档页数:8

下载文档原格式

  / 22
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

智能小车的直流电机控制

【实验目的】

了解以单片机为核心的直流电机控制系统

掌握此系统中直流电机驱动与调速原理

熟悉ICCAVR 软件编译环境,会编写控制程序

【实验器材】

智能小车一部,下载线一根

【实验原理】

直流电机驱动控制系统示意图:

在本实验中所分析的是以单片机ATMEGA8515L 为核心的直流电机控制系统。

ATMEGA8515L 芯片的引脚图如下:

功放驱动电路采用基于双极性H-桥型脉宽调整方式PWM 的集成电路L293D。L293D是单块集成电路,高电压,高电流,四通道驱动,设计用来接受DTL 或者TTL 逻辑电平,驱动感性负载(比如继电器,直流和步近马达),和开关电源晶体管。其引脚图如下:

ATMEGA8515L 利用I/O 口(PD5,PE2,PD4,PD6)向驱动电路输出控制电平,这些I/O 口作为单片机控制指令的输出,连接到驱动电路中L293D 的相应管脚上。

其真值表如下:

对于电机的转速调整,我们是采用脉宽调制(PWM)办法,控制电机的时候,电源并非

连续地向电机供电,而是在一个特定的频率下以方波脉冲的形式提供电能。不同占空比的方波信号能对电机起到调速作用,这是因为电机实际上是一个大电感,它有阻碍输入电流和电压突变的能力,因此脉冲输入信号被平均分配到作用时间上,这样,改变在始能端PE2 和PD5 上输入方波的占空比就能改变加在电机两端的电压大小,从而改变了转速。

此实验中用微处理机来实现脉宽调制,通常的方法有两种:

(1)用软件方式来实现,即通过执行软件延时循环程序交替改变端口某个二进制位输出逻辑状态来产生脉宽调制信号,设置不同的延时时间得到不同的占空比。

(2)硬件电路自动产生PWM 信号,不占用CPU 处理的时间。

这就要用到ATMEGA8515L 的在PWM 模式下的计数器1,具体内容可参考相关书籍。

【实验步骤】

(1)连接好电路,把数据线,下载线连接好,打开电源

(2)进入ICCAVR 编译环境,调试程序直至没有错误,编译环境简介请参见附录一(3)下载,烧录进单片机,观察实验结果

(4)反复修改调试程序,逐渐增强其功能

(5)写好实验报告,实验心得体会

【程序示例】

1、小车前进一段——>左转一圈——>右转一圈——>前进一段——>后退一段——>停下//ICC-AVR application builder : 2005-5-19 19:12:13

// Target : M8515

// Crystal: 4.0000Mhz

#include

#include

unsigned int time;

unsigned int yan;

void port_init(void)

{

PORTA = 0x00;

DDRA = 0xFF;

PORTB = 0x00;

DDRB = 0x00;

PORTC = 0x00;

DDRC = 0x00;

PORTD = 0x00;

DDRD = 0xFF;

PORTE = 0x00;

DDRE = 0xFF;

}

//call this routine to initialize all peripherals

void init_devices(void)

{

//stop errant interrupts until set up

CLI(); //disable all interrupts

port_init();

MCUCR = 0x00;

EMCUCR =0x00;

GICR = 0x00;

TIMSK = 0x00;

SEI(); //re-enable interrupts

//all peripherals are now initialized

}

void delay(unsigned int yan)

{

while(yan>0)

yan--;

}

void runforth(void)

{

while(time<1000)

{

PORTE=0x04;

PORTD=0x70;

delay(2000);

time++;

}

time=0;

}

void zuozhuanwan(void) {while(time<1000)

{

PORTE=0x00;

PORTD=0X70;

delay(2000);

time++;

}

time=0;

}

void youzhuanwan(void) {while(time<1000)

{

PORTE=0x04;

PORTD=0x50;

delay(2000);

time++;

}

time=0;

}

void houtui(void) {while(time<1000)

{

PORTE=0x04;

PORTD=0x20;

delay(2000);

time++;

}

time=0;

}

void stop(void)