单片机课程设计单片机控制直流电动机
姓名:xxx
学号:xxx
专业:xxx
指导老师:xxx
组号:第xxx组
单片机控制直流电机
摘要
随着时代的进步和科技的发展,电机调速系统在工农业生产、交通运输以及日常伤害中起着越来越重要的作用、由于直流电机剧院良好的起、制动性能,宜与在广泛范围内平滑调速。在轧钢机、矿井卷机,挖掘机、金属切削机床、金属切削机床、造纸机高层电梯等领域中得到广泛应用。长期以来,由于直流调速系统的性能指标优于交流调速系统。
PWM控制技术就是以该结论为理论基础,使输出端得到一系列幅值相等而宽度不相等的脉冲,用这些脉冲来代替正弦波或其他所需要的波形。按一定的规则对各种脉冲的宽度进行调制,既可改变逆变电路输出电压大小,也可以改变输出频率。
PWM控制技术及其控制简单、灵活和动态响应好的优点而成为电子技术最广泛应用的控制方式,也是人们研究的热点。
由于必须在工作期间改变直流电机的速度,直流电机的控制是一个较困难的问题。直流电机高效运行的最常见方法是施加一个PWM(脉宽调制)方波,其占空比对应于所需速度。电机起到一个低通滤波器作用,将PWM信号转换为有效直流电平。特别是对于微处理器驱动的直流电机,由于PWM信号相对容易产生,这种驱动方式使用的更为广泛。
设计要求
采用单片机设计一个控制直流电机并测量转速的装置。单片机扩展有A/D转换芯片ADC0809和D/A转换芯片DAC0832。
(1)通过改变A/D输入端可变电阻来改变A/D的输入电压,D/A输入检测量大小,进而改变直流电机的转速。
(2)手动控制。在键盘上设置两个按键—直流电动机加速键和直流电机减速键。在手动状态下,每按一次键,电机的转速按照约定的速率改变。
(3)键盘列扫描(4 6)。
实验原理
与步进电机类似,直流电机也可精确地控制旋转速度或转矩。
直流电机是通过两个磁场的互作用产生旋转。其结构如下页图所示,固定部分(定子)上,装设了一对直流励磁的静止的主磁极N和S,在旋转部分(转子)上装设电枢铁心。
定子与转子之间有一气隙。在电枢铁心上放置了由A和X 两根导体连成的电枢线圈,线圈的首端和末端分别连到两个圆弧形的铜片上,此铜片称为换向片。
直流电机的速度与施加的电压成正比,输出转矩则与电流成正比。由于必须在工作期间改变直流电机的速度,直流电机的控制是一个较困难的问题。
直流电机高效运行的最常见方法是施加一个 PWM (脉宽调制)方波,其占空比对应于所需速度。电机起到一个低通滤波器作用,将PWM 信号转换为有效直流电平。特别是对于微处理器驱动的直流电机,由于PWM 信号相对容易产生,这种驱动方式使用的更为广泛。
利用直流电机的速度与施加电压成正比的原理,通过滑动变阻器向ADC0809输入控制电压信号,经AD 后,输入到AT89C51中,AT89C51将此信号转发给DAC0832,通过功放电路放大后,驱动直流电机。
设计方案
1.系统控制电路
采用STC89C52单片机由软件产生脉冲调制信号,来对直流电机进行控制。 2.电机控制电路
采用由三极管搭成的H 型桥电路来控制电机的转动。 3.键盘电路
采用行式键盘实现电机转速的加速减速以及正反转的控制,在手动状态下,每按一次,其转速相应发生改变。
4.显示电路
采用LM016L 对电机运动状态进行显示。 系统组成框图
系统总组成框图以STC89C52为主控芯片,采用桥式电路对直流电机驱动,如下所示:
硬件电路设计
1.键盘控制电路
按下DEC按钮,电机转速降低;按下INC按钮,电机转速增加。
2.单片机主控电路图
该部分电路主要由STC89C52主控芯片和晶振组成。STC89C52芯片是低功耗8位CMOS微处理器,提供串口程序下载口。它主要有以下几个特点:256字节的RAM;4KB的ROM;32个通用I/O口线,为用户提供了丰富的I/O口资源;32个通用工作寄存器;2个定时器/计数器;具有6个中断源;4.0~5.5V的工作电压等。
晶振给单片机正常工作提供稳定的信号。
3.H型桥式电机驱动电路
H桥式电机驱动电路包括4个三极管和一个电机。要使电机运转,只须导通对角线上的一对三极管。
在此设计中用到的完整的驱动电路如下:
主控程序程序流程
总仿真电路图
程序清单1.主程序
#include "AT89X51.h"
#include
#include
#include "led.h"
#include "uart.h"
#include "timer0.h"
#include "timer1.h"
#include "common.h"
#include "ADC0831.h"
#include "lcd1602.h"
#include "keyboard.h"
#include "ISR.h"
#include "DaType_Change.h"
#define DcMotor_Direction_P
uChar8 code *String1 = "DC Motor Control";
uChar8 code *String2 = "pwm: /100";
uChar8 PWM_buff[3];
void main(void)
{
LCD_Init();
timer0_Init();
timer1_Init();
#ifdefDcMotor_Direction_P
Der1=0;
#else Der1=1;
#endif
LED_Run_EN();
WrStrLCD(0,0,String1);
WrStrLCD(1,0,String2);
while(1)
{
key_Process(); //按键处理子程序
Char_To_Str(PWM_duty, &PWM_buff[0]); //液晶显示子程序
WrStrLCD(1,4,&PWM_buff[0]);
}
}
2.子程序………………………………………………………………………………………………………………………………………………………#include
unsigned char value_converted=0x00;
unsigned char value_AN6=0x00;
unsigned char value_AN7=0x00;
bitend_of_convertion=0;
voidADC_Config(void)
{
ADCF = 0xC0;
ADCLK = 0x06;
ADCON = 0x20;
EA = 1;
EADC = 1;
while(1)
{
ADCON &= ~0x07;
ADCON |= 0x06;
ADCON &= ~0x40;
ADCON |= 0x08;
while(!end_of_convertion);
end_of_convertion=0;
value_AN6=value_converted;
ADCON &= ~0x07;
ADCON |= 0x07;
ADCON &= ~0x40;
ADCON |= 0x08;
while(!end_of_convertion);
end_of_convertion=0;
value_AN7=value_converted;
}
}
voidit_Adc(void) interrupt 8
{
ADCON &= ~0x10;
value_converted = ADDH;
end_of_convertion=1;
} …………………………………………………………………………………………………………………………………………………….. #include "adc0831.h"
void ADC_CLK(void)
{
adcclk=1;
_nop_();
adcclk=0;
_nop_();
}
uChar8 Read_ADC(void)
{
uChar8 i;
bit temp = ADC_Val^0;
adccs=0;
ADC_CLK();
while(adcdo);
for (i=0; i<8; i++)
{
ADC_CLK();
ADC_Val = (ADC_Val<<1)|adcdo;
}
adccs=1;
return(ADC_Val);
}
voidIntToStr(uInt16 t, uChar8 *str, uChar8 n)
{
uChar8 a[5];
char i, j;
a[0]=(t/10000)%10; //取得整数值到数组
a[1]=(t/1000)%10;
a[2]=(t/100)%10;
a[3]=(t/10)%10;
a[4]=(t/1)%10;
for(i=0; i<5; i++) //转成ASCII码
a[i]=a[i]+'0';
for(i=0; a[i]=='0' && i<=3; i++); //计算空格(0)数量
for(j=5-n; j
{ *str=' '; str++; }
for(; i<5; i++)
{ *str=a[i]; str++; } //加入有效的数字
*str='\0';
} …………………………………………………………………………………………………………………………………………………...... #include "beep.h"
sbit beep=P1^4;
voidBeepRing(void)
{
beep=0;
DelayMS(100);
beep=1;
DelayMS(100);
} ………………………………………………………………………………………………………………………………………………………#include "DaType_Change.h"
voidChar_To_Str(uChar8 Data, uChar8 *str)
{
uChar8 a[4];
uChar8i,j;
a[0]=(Data/100)%10;
a[1]=(Data/10)%10;
a[2]=(Data/1)%10;
for(i=0; i<3; i++) //转成ASCII码
a[i]=a[i]+'0';
for(i=0; a[i]=='0' && i<3; i++);
for(j=0; j
{ *str=' '; str++; }
for(; i<3; i++)
{ *str=a[i]; str++; } //加入有效的数字
*str='\0';
} ………………………………………………………………………………………………………………………………………………………#include"delay.h"
void DelayUS(uChar8 ValUS) //精确延时,18uS+(ValUS-1)*8us
{
for(;ValUS>0;ValUS--)
{;}
}
static void Delay1MS(void)
{
uChar8 i=2,j=199;
do
{
while(--j);
}
while(--i);
}
voidDelayMS(uInt16 ValMS)
{
uInt16uiVal;
for(uiVal=0;uiVal { Delay1MS(); } } ………………………………………………………………………………………………………………………………………………………#include"DS18B20.h" sbit DQ=P1^0; void SendDS18B20(uChar8 SendDat) { uChar8 i; for(i=0;i<8;i++) { DQ=0; _nop_();_nop_();_nop_();_nop_(); //延时4us if((SendDat&0x01)==0) DQ=0; else DQ=1; SendDat=SendDat>>1; DelayUS(5); DQ=1; } } uChar8 Init_DS18B20(void) { uChar8 i; DQ=0; DelayUS(61); DQ=1; DelayUS(8); for(i=0;i<100;i++) { if(DQ) break; } DQ=1; DelayUS(11); return 0xff; } uChar8 ReceiveDS18B20(void) { uChar8tmp=0; uChar8 i; for(i=0;i<8;i++) { tmp=tmp>>1; DQ=0; _nop_();_nop_();_nop_(); _nop_();_nop_();_nop_(); DQ=1; DelayUS(1); if(DQ) tmp|=0x80; DQ=1; _nop_();_nop_();_nop_(); _nop_();_nop_();_nop_(); } return(tmp); } uInt16 ReadDS18B20(void) { union{ uInt16 Data; uChar8tmp[2]; }temp; temp.tmp[1]=ReceiveDS18B20(); temp.tmp[0]=ReceiveDS18B20(); return(temp.Data); } uInt16GetTemper(void) { uInt16 Temper; DQ=1; Init_DS18B20(); SendDS18B20(0xcc); SendDS18B20(0xbe); Temper=ReadDS18B20(); return(Temper); } ……………………………………………………………………………………………………………………………………………………... #include "ISR.h" uInt16 ms_Counter; uChar8ucCounter; uInt16 key_l; //按键低电平计数器 uChar8 key_h; //按键高电平计数器 uChar8 key; uChar8kpush; bitUpdate_ADC_Flag=0; void ISR_Ext0(void) interrupt 0 void ISR_timer0(void) interrupt 1 { TH0=(65535-1000)/255; TL0=(65535-1000)%255; if(ms_Counter==PWM_duty) { Der2 = 0; } ms_Counter++; if(ms_Counter==PWM_cycle) { ms_Counter=0; if(PWM_duty) Der2 = 1; } } void ISR_timer1(void) interrupt 3 { TH1=0xFB; TL1=0x1E; if((P0&0x0C)==0x0C) { if((key_l>30)&&(key_l<800)&&(key_h>30)) //释放按键,如果之前按键的时间<1s,读出键值 {key=kpush;} if((++key_h)>200) key_h=0; //记录高电平时间 key_l=0; if(key>0x80) key=0; } else { kpush=P0&0x0C; key_l++; if((key_l>800)&&(key_h>30)) { key=kpush|0x80; key_h=0; key_l=0; } } } ………………………………………………………………………………………………………………………………………………………#include "keyboard.h" #include "ISR.h" #include "LED.h" uChar8 PWM_duty = 50; uChar8 PWM_cycle = 100;#include "keyboard.h" #include "ISR.h" #include "LED.h" uChar8 PWM_duty = 50; uChar8 PWM_cycle = 100; //4*4矩阵式键盘扫描 uChar8 Key_Scan(void) { uChar8 code_h,code_l; P3=0xF0; if((P3&0xF0)!=0xF0) { DelayMS(1); if((P3&0xF0)!=0xF0) { code_h=0xFE; while((P3&0xF8)!=0xF0) { P3=code_h; if((P3&0xF0)!=0xF0) { code_l=(P3&0xF0|0x0F); return((~code_h)+(~code_l)); } elsecode_h=(code_h<<1)|0x01; } } } return(0); } //4*4矩阵式键盘译码 uChar8 Get_Key_Val(uChar8 key_temp) { switch(key_temp) { case 0x14 : return 1; case 0x24 : return 2; case 0x44 : return 3; case 0x12 : return 4; case 0x22 : return 5; case 0x42 : return 6; case 0x11 : return 7; case 0x21 : return 8; case 0x41 : return 9; default : return 0; } } //按键处理函数 voidkey_Process(void) { switch(key) { case 0x08: //KB1键按下 { if(PWM_duty==100) PWM_duty=100; elsePWM_duty++; break; } case 0x88: //KB1键按下 { if(PWM_duty==100) PWM_duty=100; else if(PWM_duty<=90)PWM_duty=PWM_duty+10; break; } case 0x04: //KB2键按下 { if(PWM_duty==0x00) PWM_duty=0x00; elsePWM_duty--; break; } case 0x84: //KB2键按下 { if(PWM_duty==0x00) PWM_duty=0x00; else if(PWM_duty>=10)PWM_duty=PWM_duty-10; break; } default : break; } key = 0x1C; } uChar8 Key_Scan(void) { uChar8 code_h,code_l; P3=0xF0; if((P3&0xF0)!=0xF0) { DelayMS(1); if((P3&0xF0)!=0xF0) { code_h=0xFE; while((P3&0xF8)!=0xF0) { P3=code_h; if((P3&0xF0)!=0xF0) { code_l=(P3&0xF0|0x0F); return((~code_h)+(~code_l)); } elsecode_h=(code_h<<1)|0x01; } } } return(0); } //4*4矩阵式键盘译码 uChar8 Get_Key_Val(uChar8 key_temp) { switch(key_temp) { case 0x14 : return 1; case 0x24 : return 2; case 0x44 : return 3; case 0x12 : return 4; case 0x22 : return 5; case 0x42 : return 6; case 0x11 : return 7; case 0x21 : return 8; case 0x41 : return 9; default : return 0; } } //按键处理函数 voidkey_Process(void) { switch(key) { case 0x08: //KB1键按下 { if(PWM_duty==100) PWM_duty=100; elsePWM_duty++; break; } case 0x88: //KB1键按下 { if(PWM_duty==100) PWM_duty=100; else if(PWM_duty<=90)PWM_duty=PWM_duty+10; break; } case 0x04: //KB2键按下 { if(PWM_duty==0x00) PWM_duty=0x00; elsePWM_duty--; break; } case 0x84: //KB2键按下 { if(PWM_duty==0x00) PWM_duty=0x00; else if(PWM_duty>=10)PWM_duty=PWM_duty-10; break; } default : break; } key = 0x1C; ………………………………………………………………………………………………………………………………………………………#include"lcd1602.h" sbit RS=P0^5; sbit RW=P0^6; sbit EN=P0^7; static void DectectBusyBit(void) { P2=0xFF; RS=0; RW=1; EN=1; DelayMS(1); while(P2&0x80); EN=0; } voidWrComLCD(uChar8 ComVal) { RS=0; RW=0; EN=1; P2=ComVal; DelayMS(1); EN=0; } voidWrDatLCD(uChar8 DatVal) { RS=1; RW=0; EN=1; P2=DatVal; DelayMS(1); EN=0; } voidLCD_Init(void) { WrComLCD(0x38); //16x2行显示,5x7点阵,8位数据接口DelayMS(1); WrComLCD(0x38); WrComLCD(0x01); //显示清屏 WrComLCD(0x06); //光标自增,画面不动 DelayMS(1); WrComLCD(0x0C); //开显示,关光标并不闪烁 voidClearDisLCD(void) { WrComLCD(0x01); DelayMS(1); } voidWrStrLCD(bit Row,uChar8 Column,uChar8 *String) { if(!Row) WrComLCD(0x80+Column); elseWrComLCD(0xC0+Column); while(*String) { WrDatLCD(*String); String++; } } voidWrCharLCD(bit Row,uChar8 Column,uChar8 Dat) { if(!Row) WrComLCD(0x80+Column); elseWrComLCD(0xC0+Column); WrDatLCD(Dat); } ………………………………………………………………………………………………………………………………………………………#include "led.h" voidLED_Run_EN() { LED_Run = 0; } voidLED_Run_disEN() { LED_Run = 1; } voidLED_Alarm_EN() { LED_Alarm = 0; } voidLED_Alarm_disEN() { LED_Alarm = 1; } voidLED_Flash(void) { P0^1 = 0; DelayMS(1000); P0^1 = 1; DelayMS(1000); } ………………………………………………………………………………………………………………………………………………………#include "SPI.h" charserial_data; chardata_example=0x55; chardata_save; bittransmit_completed= 0; voidSPI_Config(void) { SPCON |= 0x10; /* Master mode */ SPCON |= 0x82; /* FclkPeriph/128 */ SPCON |= 0x20; /* P1.1 is available as standard I/O pin */ SPCON &= ~0x08; /* CPOL=0; transmit mode example */ SPCON |= 0x04; /* CPHA=1; transmit mode example */ IEN1 |= 0x04; /* enable spi interrupt */ SPCON |= 0x40; /* run spi */ EA=1; /* enable interrupts */ } voidit_SPI(void) interrupt 9 /* interrupt address is 0x004B */ { switch( SPSTA ) /* read and clear spi status register */ { case 0x80: serial_data=SPDAT; transmit_completed=1; break; case 0x10: break; case 0x40: break; } } ………………………………………………………………………………………………………………………………………………………#include"timer0.h" void timer0_Init(void) { TMOD=((TMOD&0xF0)|0x01); //定时器0工作在模式1下 //每1mS中断一次 TH0=(65535-1000)/255; TL0=(65535-1000)%255; EA=1; //开总中断 ET0=1; //打开定时器0的中断 《单片机原理及应用》课程设计基于单片机的步进电机(直流电机)控制器设计 学院:物联网工程学院 班级:自动化 姓名: 学号: 同组成员: 日期:2016.6.20-2016.6.24 一、设计目的 通过具体小型测试系统设计,实践单片机系统设计及调试的全过程,以加深对单片机内部结构、功能和指令系统的理解,并进一步学习单片机开发系统的应用及一些外围芯片的接口和编程方法,初步掌握单片机系统的硬、软件设计技术及调试技巧。 二、设计要求 1)电机转速可以平稳控制 2)通过键盘和显示器可以设置电机的转速 3)显示电机的速度趋势 三、仪器设备 1)IBMPC机一台 2)https://www.doczj.com/doc/4e12495205.html,单片机仿真器、编程器、试验仪三合一综合开发平台一台 四、硬件线路图及主要芯片说明 1、AT89C5单片机芯片说明 AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。该器件采用ATMEL 高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。 VCC:AT89C51 电源正极输入,接+5V 电压。 GND:电源接地端。 XTAL1:接外部晶振的一个引脚。在单片机内部,它是一反相放大器输入端,这个放大器构成了片内振荡器。它采用外部振荡器时,些引脚应接地。 XTAL2:接外部晶振的一个引脚。在片内接至振荡器的反相放大器输出端和内部时钟发生器输入端。当采用外部振荡器时,则此引脚接外部振荡信号的输入。 RST:AT89C51 的复位信号输入引脚,高电位工作,当要对芯片又时,只要将此引脚电位提 升到高电位,并持续两个机器周期以上的时间,AT89C51 便能完成系统复位的各项工作, 使得内部特殊功能寄存器的内容均被设成已知状态。 ALE/PROG ALE:是英文"ADDRESS LATCH ENABLE"的缩写,表示允许地址锁存允许信号。当访问外部存储器时,ALE 信号负跳变来触发外部的8 位锁存器(如74LS373),将端口P0 的地址总线(A0-A7)锁存进入锁存器中。在非访问外部存储器期间,ALE 引脚的输出频率是系统工作频率的1/16,因此可以用来驱动其他外围芯片的时钟输入。当问外部存储器期间,将以1/12 振荡频率输出。 EA/VPP:该引脚为低电平时,则读取外部的程序代码(存于外部EPROM 中)来执行程序。因此 在8031 中,EA 引脚必须接低电位,因为其内部无程序存储器空间。如果是使用AT89C51 或其它内部有程序空间的单片机时,此引脚接成高电平使程序运行时访问内部程序存器, 当程序指针PC 值超过片内程序存储器地址(如8051/8751/89C51 的PC 超过0FFFH)时,将自动转 我上周刚做的这个实验成功拉,给你参考一下吧这可是我当时辛辛苦苦编出来的啊,不过我用的是L298驱动的和ULN2003一样,你把它换成2003就行拉 #include for(j=200;j>0;j--); temp=P3; temp=temp&0x0f; if(temp!=0x0f) { temp=P3; temp=temp&0x0f; switch(temp) { case 0x0e: key=1; break; case 0x0d: key=2; break; case 0x0b: key=3; break; case 0x07: key=4; break; } temp=P3; temp=temp&0x0f; while(temp!=0x0f) { temp=P3; temp=temp&0x0f; } } } P3=0xff; P3_5=0; temp=P3; temp=temp&0x0f; if(temp!=0x0f) { for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3; temp=temp&0x0f; if(temp!=0x0f) { temp=P3; temp=temp&0x0f; switch(temp) 实用标准文案 目录 1 总体设计框 架 (3) 2 硬件电路设 计 (4) 2.1 芯片介 绍 (4) 2.2 驱动电 路 (9) 2.3 按键控制电 路 (10) 3 程序编写 ................................................. 10 3.1 工作原 理 (10) 21程序书写过程 3.2 ...................................................... 参考资 料 (16) 精彩文档. 实用标准文案 直流电机驱动 Abstract 摘要:本文主要内容是利用PIC18F452单片机来控制直流电机,通过L293NE来驱动电机,通过按键来使其正转,反转。Keywords 关键词:直流电机,PWM,L293NE 精彩文档. 实用标准文案 总体设计框架1硬件电路利用驱动芯片L293D来驱动直流电机,按键则是单独引出。如图1所示。软件则是C语言编程。 PI驱C直动1流8电电F路机452 图1硬件设计框精彩文档. 实用标准文案 2硬件电路设计 2.1 芯片介绍 首先,总体说明硬件电路设计,如图2 原理图,图3 PCB图以及图4板子的图所示。三个输入信号,如图分别为RD4,RD5,RD6连上光耦的2脚,然后通过光耦的4脚引入L293D的使能引脚(12EN)以及输入引脚(1A,2A),然后L293D的输出引脚(1Y,2Y)通过H-桥型控制电路与直流电机连接。 图2 直流电机控制部分原理图 精彩文档. 实用标准文案 PCB图图3直流电机控制部分 成品板图4 其中红线圈表示直流电机控制部分。下面详细介绍各个芯片。PIC18F452 目录 摘要............................................................................................................................................................... I I ABSTRACT ................................................................................................................................................. III 1系统论述 (5) 1.1设计思路 (5) 1.2基本原理 (5) 1.3总体设计框图 (5) 2直流电机单元电路设计与分析 (6) 2.1直流电机驱动模块 (6) 2.2直流电机的中断键盘控制模块 (11) 2.31602LCD液晶显示模块 (13) 3直流电机PWM控制系统的实现 (15) 3.1总电路图 (15) 3.2总电路功能介绍 (16) 3.3直流电机控制程序 (16) 4系统仿真 (23) 5结束语 (26) 参考文献资料 (27) 摘要 本文是对直流电机PWM调速器设计的研究,主要实现对电机的控制。本课程设计主要是实现PWM调速器的正转、反转、加速、减速、停止等操作。并实现电路的仿真。为实现系统的微机控制,在设计中,采用了AT89C51单片机作为整个控制系统的控制电路的核心部分,配以各种显示、驱动模块,实现对电动机转速参数的显示和测量;由命令输入模块、光电隔离模块及H型驱动模块组成。采用带中断的独立式键盘作为命令的输入,单片机在程序控制下,不断给光电隔离电路发送PWM 波形,H型驱动电路完成电机正反转控制.在设计中,采用PWM调速方式,通过改变PWM的占空比从而改变电动机的电枢电压,进而实现对电动机的调速。设计的整个控制系统,在硬件结构上采用了大量的集成电路模块,大大简化了硬件电路,提高了系统的稳定性和可靠性,使整个系统的性能得到提高。 关键词:AT89C51单片机;PWM调速;正反转控制;仿真。 滨江学院 专业综合设计 题目直流电机闭环调速系统控制 院系自动控制 专业自动化 组别第二组 组长周未政 指导教师周旺平 二0 一0 年十二月二十八日基于单片机的直流电机闭环调速控制系统 摘要:设计以AT89C51单片机控制模块为核心,由单片机控制、红外线光电检测装置、直流电机转速为被测量组成的控制系统。原理是利用红外线光电传感器接收直流电机转速所产生的红外信号转换成电信号传输给单片机,并调节转速的闭环调速控制系统。 1.AT80C51单片机介绍 1.1主电源引脚 V ss—(20脚):电路地电平 V cc—(40脚):正常运行和编程校检(8051/8751)时为+5V电源。 1.2外接晶振或外部振荡器引脚 XTAL1—(19脚):接外部晶振的一个引脚. 在单片机内部,它是一个反相放大器的输入端,这个放大器构成了片内振荡器. 当采用外部振荡器时,此引脚应该接地. XTAL2—(18脚):接外部晶振的另一个引脚. 在片内接至振荡器的反相放大器的输出和内部时钟发生器的输入端. 当采用外部振荡器时,则此引脚接外部振荡信号的输入。 1.3控制、选通或电源复用引脚 RST/V pd—(9引脚): RST即Reset(复位)信号输入端。 ALE/PROG—(30引脚): ALE,允许地址索存信号输出。 PSEN—(29脚):访问外部程序存储器选通信号,低电平有效。. V pp/EA—(31引脚): EA为访问内部或外部程序存储器选择信号。 1.4多功能I/O口引脚 P0口—(32-39脚):8位漏极开路双向并行I/O接口. P1口—(1-8脚): 8位准双向并行I/O接口. P2口—(21-28脚):8位准双向并行I/O接口. P3口—(10-17脚):具有内部上拉电路的8位准双向并行I/O端口。它还提供第二特殊功能,具体含义为: P3.0—(10脚)RXD:串行数据接收端。 P3.1—(10脚)TXD:串行数据发送端。 P3.2—(10脚)INT0:外部中断0请求端,低电平有效。 P3.3—(10脚)INT1:外部中断1请求端,低电平有效。. P3.4—(10脚)T0:定时器/计数器0外部事件计数输入端。. 南京XX大学 指导老师:张X 课程设计基于51单片机的步进电机控制 机械电子工程学院 测控技术与仪器 XXXXX Xxx 2012年1年4日 步进电机控制系统 [摘要]本课程设计的内容是利用51单片机,达到控制步进电机的启 动、停止、正转、反转、两档速度和状态显示的目的,使步进电机控制更加灵活。步进电机驱动芯片采用ULN2803,ULN2803具有大电流、高电压,外电路简单等优点。利用四位数码管增设电机状态显示功能,各项数据更直观。实测结果表明,该控制系统达到了设计的要求。 关键字:步进电机、数码管、51单片机、ULN2803 一步进电机与驱动电路 1.1 什么是步进电机 步进电机是一种将电脉冲转化为角位移的执行机构。通俗一点讲:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时也可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。 1.2 步进电机的种类 步进电机分永磁式(PM)、反应式(VR)、和混合式(HB)三种。永磁式步进一般为两相,转矩和体积较小,步进角一般为7.5度或15度;反应式步进一般为三相,可实现大转矩输出,步进角一般为1.5度,但噪声和振动都很大。在欧美等发达国家80年代已被淘汰;混合式步进是指混合了永磁式和反应式的优点。它又分为两相和五相:两相步进角一般为1.8度而五相步进角一般为 0.72度。这种步进电机的应用最为广泛。 1.3 步进电机的特点 1.精度高一般的步进电机的精度为步进角的3-5%,且不累积。可在宽广的频率范围内通过改变脉冲频率来实现调速,快速起停、正反转控制及制动等,这是步进电动机最突出的优点 2.过载性好其转速不受负载大小的影响,不像普通电机,当负载加大时就会出现速度下降的情况,所以步进电机使用在对速度和位置都有严格要求的场合; 3.控制方便步进电机是以“步”为单位旋转的,数字特征比较明显,这样就给计算 基于单片机对直流电机的控制 第十五组 姓名:吴代露20131325010 张鹏飞20131325012 金静丽20131325014 周敏20131325015 胡会华20131325017 顾蓉20131325018 专业:2013级信息工程(系统工程方向) 指导老师:周旺平 2014.12.22 基于单片机对直流电机的控制 内容摘要 电动机作为最主要的动力源,在生产和生活中占有重要地位。电动机的调速控制过去多用模拟法,随着计算机的产生和发展以及新型电力电子功率器件的不断涌现,电动机的控制也发生了深刻的变化。 关键字:电动机飞思卡尔 PWM控制 一、引言 (一)直流电机的定义 直流电机(direct current machine):是指能将直流电能转换成机械能(直流电动机)或将机械能转换成直流电能(直流发电机)的旋转电机。它是能实现直流电能和机械能互相转换的电机。当它作电动机运行时是直流电动机,将电能转换为机械能;作发电机运行时是直流发电机,将机械能转换为电能。 (二)直流电机的基本结构 由直流电动机和发电机工作原理示意图可以看到,直流电机的结构应由定子和转子两大部分组成。直流电机运行时静止不动的部分称为定子,定子的主要作用是产生磁场,由机座、主磁极换向极、端盖、轴承和电刷装置等组成。运行时转动的部分称为转子,其主要作用是产生电磁转矩和感应电动势,是直流电机进行能量转换的枢纽,所以通常又称为电枢,由转轴、电枢铁心、电枢绕组、换向器和风扇等组成。 (三)直流电机工作原理 直流电机里边固定有环状永磁体,电流通过转子上的线圈产生安培力,当转子上的线圈与磁场平行时,再继续转受到的磁场方向将改变,因此此时转子末端的电刷跟转换片交替接触,从而线圈上的电流方向也改变,产生的洛伦兹力方向不变,所以电机能保持一个方向转动。直流发电机的工作原理就是把电枢线圈中感应的交变电动势,靠换向器配合电刷的换向作用,使之从电刷端引出时变为直流电动势的原理。感应电动势的方向按右手定则确定(磁感线指向手心,大拇指指向导体运动方向,其他四指的指向就是导体中感应电动势的方向)。导体受力的方向用左手定则确定。这一对电磁力形成了作用于电枢一个力矩,这个力矩在旋转电机里称为电磁转矩,转矩的方向是逆时针方向,企图使电枢逆时针方向转动。如果此电磁转矩能够克服电枢上的阻转矩(例如由摩擦引起的阻转矩以及其它负载转矩),电枢就能按逆时针方向旋转起来。 (四)直流电机的分类 直流电动机按结构及工作原理可划分:无刷直流电动机和有刷直流电动机。(1)无刷直流电动机:无刷直流电动机是将普通直流电动机的定子与转子进行了互换。其转子为永久磁铁产生气隙磁通:定子为电枢,由多相绕组组成。在结构上,它与永磁同步电动机类似。无刷直流电动机定子的结构与普通的同步电动机或感应电动机相同.在铁芯中嵌入多相绕组(三相、四相、五相不等).绕组可接成星形或三角形,并分别与逆变器的各功率管相连,以便进行合理换相。由于电动机本体为永磁电机,所以习惯上把无刷直流电动机也叫做永磁无刷直流电动机。 (2)有刷直流电动机:又可分为永磁直流电动机和电磁直流电动机。 永磁直流电动机划分:稀土永磁直流电动机、铁氧体永磁直流电动机和铝镍钴永磁直流电动机。稀土永磁直流电动机:体积小且性能更好,但价格昂贵,主要用于航天、计算机、井下仪器等;铁氧体永磁直流电动机:由铁氧体材料制成的磁极体,廉价,且性能良好,广泛用于家用电器、汽车、玩具、电动工具等领域;铝镍钴永磁直流电动机:需要消耗大量的贵重金属、价格较高,但对高温的适应性好,用于环境温度较高或对电动机的温度稳定性要求较高的场合。 电磁直流电动机划分:串励直流电动机、并励直流电动机、他励直流电动机和复励直流电动机。 (1)串励直流电动机:电流串联,分流,励磁绕组是和电枢串联的,直流串励电 //程序说明:使用内部时//PWM0=P3^7PWM1=P3^5 PWM2=P2^0 PWM3=P2^4 #include 可以实现的功能是: 按下左转键则开始向左转动 按下右转键则向右转动 按下停止键则开始逐渐停止转动 按下调速键一次则会加速一档 按下调速键二次则会加速二档 按下调速键三次则会加速三档 按下调速键四次则会加速四档 按下调速键五次则会回到最初速度重新记档位 设计思路: 直流电机只要能提供一定的直流就可以转动,改变电压极性可以改变转动方向,可以通过给直流电机提供脉冲信号来驱动它,脉冲信号的占空比可以影响到直流电机的平均速度,因此可以通过调整占空比从而能实现调速的目的。直流电机的驱动电路要有过流保护作用,图中的二极管就直到这个作用,另外电机的驱动电流是比较大的所以需要用三极管来放大电流。程序的关键就是如何实现占空比的调整,这个可以通过对51单片机定时器重装初值进行改变,从而改变时间。用51实现PWM信号的输出,相对麻烦点,要是AVR就可以方便地实现PWM信号,由见51单片机的局限性与AVR单片机的优势。 原理图 详细程序: #include 单片机原理及系统课程设计 1 引言 步进电机又称为脉冲电动机或阶跃电动机,它是基于最基本的电磁感应作用,将电脉冲信号转变为角位移或线位移的开环控制元件。单片机控制的步进电机广泛地应用于工业自动控制、数控机床、组合机床、机器人、计算机外围设备、照相机,大型望远镜,卫星天线定位系统等等。 随着经济的发展,技术的进步和电子技术的发展,步进电机的应用领域更加广阔,同时也对步进电机的运行性能提出了更高的要求。 步进电机的原始模型起源于1830年至1860年,1870年前后开始以控制为目的的尝试,应用于氩弧灯的电极输送机构中,这被认为最早的步进电机。 1950年后期晶体管的发明也逐渐应用在步进电机上,对于数字化的控制变得更为容易。到20世纪60年代后期,在步进电机本体方面随着永磁材料的发展,各种实用性步进电机应运而生。步进电机往后经过不断改良,使得今日步进电机已广泛运用在需要高定位精度、高分解能、高响应性、信赖性等灵活控制性高的机械系统中。 在生产过程中要求自动化、省人力、效率高的机器中,我们很容易发现步进电机的踪迹,尤其以重视速度、位置控制、需要精确操作各项指令动作的灵活控制性场合步进电机用得最多。 2 设计方案与原理 4.1 设计方案 设计一个51单片机四相步进电机控制系统要求系统具有如下功能: (1)由I/O口产生的时序方波作为电机控制信号; (2)信号经过驱动芯片驱动电机的运转; (3)电机的状态通过键盘控制,包括正转,反转,加速,减速,停止和单步运行。 4.2 设计原理 步进电机实际上是一个数字\角度转换器,也是一个串行的数\模转换器。步进电机的基本控制包括启停控制、转向控制、速度控制、换向控制4个方面。从结构上看,步进电机分为三相、四相、五相等类型,本次设计的是四相电机。四相步进电机的工作方式有单四拍、双四拍和单双八拍三种。 在本次设计中,我们使用的是四相单八拍的工作方式。通过P1口给A,B,C,D四相依次输出高电平即可实现步进电机的旋转,通过控制两次输出的间隔,即可实现对步进电机的速度控制。 图 2.1 步进电机内部结构截图 根据步进电机的相关相序表我们可以正常的控制电机的步进运行。基于单片机的步进电机(直流电机)控制器设计
51单片机控制的步进电机C语言程序
pic单片机控制直流电机
基于单片机的直流电机控制器的设计
基于单片机的直流电机闭环调速控制系统xin
基于51单片机的步进电机控制-设计报告(说明书)及源程序
基于单片机对直流电机的控制
51单片机PWM控制直流电机正反转
基于51单片机控制直流电机的设计
基于51单片机控制步进电机
单片机PWM控制直流电机的速度