单片机控制直流电机_第1页
单片机控制直流电机_第2页
单片机控制直流电机_第3页
单片机控制直流电机_第4页
单片机控制直流电机_第5页
免费预览已结束,剩余19页可下载查看

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、单片机课程设计单片机控制直流电动机姓名:XXX学号:XXX专业:XXX指导老师:XXX 组号:第XXX组单片机控制直流电机摘要随着时代的进步和科技的发展,电机调速系统在工农业生产、交通运输以及 日常伤害中起着越来越重要的作用、由于直流电机剧院良好的起、制动性能,宜 与在广泛范围内平滑调速。在轧钢机、矿井卷机,挖掘机、金属切削机床、金属 切削机床、造纸机高层电梯等领域中得到广泛应用。长期以来,由于直流调速系 统的性能指标优于交流调速系统。PWM控制技术就是以该结论为理论基础,使输出端得到一系列幅值相等而 宽度不相等的脉冲,用这些脉冲来代替正弦波或其他所需要的波形。按一定的规 则对各种脉冲的宽度进

2、行调制,既可改变逆变电路输出电压大小,也可以改变输 出频率。PWM控制技术及其控制简单、灵活和动态响应好的优点而成为电子技术最广泛 应用的控制方式,也是人们研究的热点。由于必须在工作期间改变宜流电机的速度,直流电机的控制是一个较困难的 问题。直流电机高效运行的最常见方法是施加一个PWM (脉宽调制)方波,其 占空比对应于所需速度。电机起到一个低通滤波器作用,将PWM信号转换为有 效直流电平。特别是对于微处理器驱动的直流电机,由于PWM信号相对容易产 生,这种驱动方式使用的更为广泛。设计要求采用单片机设计一个控制直流电机并测量转速的装置。单片机扩展有A/D转 换芯片ADC0809和D/A转换芯片

3、DAC0832。(1)通过改变A/D输入端可变电阻来改变A/D的输入电压,D/A输入检测 量大小,进而改变直流电机的转速。(2)手动控制。在键盘上设置两个按键一直流电动机加速键和直流电机减 速键。在手动状态下,每按一次键,电机的转速按照约定的速率改变。(3)键盘列扫描(4x6)o实验原理与步进电机类似,直流电机也可精确地控制旋转速度或转矩。直流电机是通过两个磁场的互作用产生旋转。其结构如下页图所示,固定部 分(定子)上,装设了一对直流励磁的静止的主磁极N和S,在旋转部分(转子) 上装设电枢铁心。定子与转子之间有一气隙。在电枢铁心上放置了由A和X两根导体连成的 电枢线圈,线圈的首端和末端分别连到

4、两个圆弧形的铜片上,此铜片称为换向片。直流电机的速度与施加的电压成正比,输出转矩则与电流成正比。由于必须 在工作期间改变直流电机的速度,直流电机的控制是一个较困难的问题。直流电机高效运行的最常见方法是施加一个PWM (脉宽调制)方波,其占 空比对应于所需速度。电机起到一个低通滤波器作用,将PWM信号转换为有效 直流电平。特别是对于微处理器驱动的直流电机,由于PWM信号相对容易产生, 这种驱动方式使用的更为广泛。利用直流电机的速度与施加电压成正比的原理,通过滑动变阻器向ADC0809 输入控制电压信号,经AD后,输入到AT89C51中,AT89C51将此信号转发给 DAC0832,通过功放电路放

5、大后,驱动直流电机。设计方案1 .系统控制电路采用STC89C52单片机由软件产生脉冲调制信号,来对直流电机进行控制。2 .电机控制电路采用由三极管搭成的H型桥电路来控制电机的转动。3 .键盘电路采用行式键盘实现电机转速的加速减速以及正反转的控制,在手动状态下, 每按一次,其转速相应发生改变。4 .显示电路采用LM016L对电机运动状态进行显示。系统组成框图系统总组成框图以STC89C52为主控芯片,采用桥式电路对直流电机驱动, 如下所示:H型桥式I直流Ip/ 驱动电路1/电机硬件电路设计L键盘控制电路按下DEC按钮,电机转速降低;按下INC按钮,电机转速增加。R8DECO O10K<T

6、EXT>R6INC10K<TEXT>R14200<TEXT>R13200<TEXT>D2LED-RED 而<T>LED-GREEN2.单片机主控电路图该部分电路主要由STC89C52主控芯片和晶振组成。STC89C52芯片是低功耗 8位CMOS微处理器,提供串口程序下载口。它主要有以下儿个特点:256字节 的RAM; 4KB的ROM; 32个通用I/O 口线,为用户提供了丰富的I/O 口资源; 32个通用工作寄存器;2个定时器/计数器;具有6个中断源;4.05.5V的工作 电压等。晶振给单片机正常工作提供稳定的信号。U1LU on cm d

7、CXI WAFVlr-v yRfc.Rl cn .<. ACV4rnirsnCO VAFY7CM.riRKUr> AHLU r?a 4。PSEN ALEOZ> 1i A 4 *ng1. ryj 7aKm】/A,IC JR.*Xty> T/X 4CPIOP3XXRXD产3 FIXOPiPJX'T7r*i 1Pt P1 3nCOjnm icn.T2 Wr c ) ,onL L1G18.29393DAlorT37KS1 "/35KBg _SKHN34RS '33R»V86 :21DO222m323D2d24D3冕2SAc36D5727DOa

8、20Bo_w!23Tn15n16Deriner .RP13.H型桥式电机驱动电路H桥式电机驱动电路包括4个三极管和一个电机。要使电机运转,只须导通对角线上的一对三极管。在此设计中用到的完整的驱动电路如下:rtrnt-凡七程序流程主控程序总仿真电路图程序清单1 .主程序include "AT89X51.h"#include <intrins.h>#include <stdio.h>include "led.h"#include ,uart.hH#include "timerO.h"#include "t

9、imerl.h"#include ,common.hninclude llADC0831.hHinclude ,lcdl602.hH#include ,keyboard.hninclude "ISR.h"#include HDaType_Change.hH#define DcMotor_Direction_PuChar8 code *Stringl = MDC Motor Control11;uChar8 code *String2 = Mpwm: /100H;uChar8 PWM_buff;void main(void)(LCD_lnit();timerO_ln

10、it();timerl_lnit();#ifdef DcMotor_Direction_PDerl=0;#else Derl=l;#endifLED_Run_EN();WrStrLCD(OAStringl);WrStrLCD(lAString2);while(l)key_Process();按键处理子程序Char_To_Str(PWM_duty, &PWM_buffO); 液晶显示子程序 WrStrLCD(lA&PWM_buffO);)2 .子程序#include <ADC.h>unsigned char vaIue_converted=0x00;unsigned

11、char value_AN6=0x00;unsigned char value_AN7=0x00;bit end_of_convertion=0;void ADC_Config(void)(ADCF = OxCO;ADCLK = 0x06;ADCON = 0x20;EA = 1;EADC = 1;while(l)ADCON &= -0x07;ADCON |=0x06;ADCON &= -0x40;ADCON |=0x08;while(!end_of_convertion);end_of_convertion=0;value_AN6=value_converted;ADCON &

12、amp;= -0x07;ADCON | = 0x07;ADCON &= -0x40;ADCON |=0x08;while(!end_of_convertion);end_of_convertion=0;value_AN7=value_converted;)void it_Adc(void) interrupt 8(ADCON &= 0xl0;value_converted = ADDH; end_of_convertion=l;) #include ,adcO831.hHvoid ADC.CLK(void)(adcclk=l;_nop_();adcclk=0;_nop_();)

13、uChar8 Read_ADC(void)(uChar8 i;bit temp = ADC_ValA0;adccs=0;ADC_CLK();while(adcdo);for (i=0; i<8; i+)(ADC_CLK();ADC-Val = (ADC_Val«l)| adcdo;)adccs=l;return(ADC_Val);)void lntToStr(ulntl61, uChar8 *strz uChar8 n)(uChar8 a5;char i, j;a 0=(t/10000)%10;取得整数值到数组al=(t/1000)%10;a2=(t/100)%10;a3=(t

14、/10)%10;a4=(t/l)%10;for(i=0; i<5; i+)转成 ASCII 码ai=ai+'O'for(i=0; ai=0' && i<=3; i+);计算空格(0)数量for(j=5-n; j<i; j+) 填充空格 *str=,str+; for(; i<5; i+) *str=ai; str+; 加入有效的数字 *str='O') #include ,beep.hH sbit beep=PlA4; void BeepRing(void) (beep=0;DelayMS(lOO);beep=l;

15、DelayMS(lOO);) #include ,DaType_Change.h'1 void Char_To_Str(uChar8 Data, uChar8 *str)(uChar8 a4;uChar8 ij;a0=(Data/100)%10;al=(Data/10)%10;a2=(Data/l)%10;for(i=0; i<3; i+)转成 ASCII 码ai=ai+'O'for(i=0; ai=,0' && i<3; i+);for(j=0; j<i; j+) 填充空格 *str=,str+;for(; i<3; i

16、+) *str=ai; str+; 加入有效的数字 *str='O') #include,delay.h"void DelayUS(uChar8 ValUS)精确延时,18uS+(ValUS-l)*8us(for(;ValUS>0;ValUS-) ; )static void DelaylMS(void)(uChar8 i=2J=199;dowhile(-j);while(-i);)void DelayMS(ulntl6ValMS)(ulntl6 uiVal;for(uiVal=0;uiVal<ValMS;uiVal+)DelaylMS();) #incl

17、ude,DS18B20.hnsbit DQ=P1AO;void SendDS18B20(uChar8 SendDat)(uChar8 i;for(i=0;i<8;i+)延时4usDQ=0;_nopj);_nop_();_nop_();_nopj);if(SendDat&OxOl)=O)DQ=0;elseDQ=1;SendDat=SendDat»l;DelayUS ; DQ=1;)uChar8 lnit_DS18B20(void)(uChar8 i;DQ=0;DelayUS(61);DQ=1;DelayUS(8);for(i=0;i<100;i+)if(DQ) br

18、eak;DQ=1;DelayUS(ll);return Oxff;)uChar8 ReceiveDS18B20(void)(uChar8 tmp=0;uChar8 i;for(i=0;i<8;i+)tmp=tmp»l;DQ=0;_nopj);_nop_();_nop_();_nopj);_nop_();_nop_();DQ=1;DelayUS ;if(DQ)tmp|=0x80;DQ=1;_nopj);_nop_();_nop_();_nopj);_nop_();_nop_(); return(tmp);)ulntl6 ReadDS18B20(void)(unionulntl6

19、Data;uChar8 tmp2;temp;temp.tmpl=ReceiveDS18B20();temp.tmp0=ReceiveDS18B20(); return(temp.Data);)ulntl6 GetTemper(void)(ulntl6 Temper;DQ=1; lnit_DS18B20();SendDS18B20(0xcc);SendDS18B20(0xbe);Temper=ReadDS18B20(); return(Iemper);) include "ISR.h"ulntl6 ms_Counter;uChar8 ucCounter;ulntl6 key_

20、l;按键低电平计数器uChar8 key_h;按键高电平计数器uChar8 key; uChar8 kpush; bit Update_ADC_Flag=O; void ISR_ExtO(void) interrupt 0 void ISR_timerO(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; )voi

21、d ISR_timerl(void) interrupt 3 (THl=0xFB;TLl=0xlE;if(P0&0x0C)=0x0C) if(key_l>30)&&(key_l<800)&&(key_h>30)释放按健,如果之前按键的时间Vis,读出键值 key=kpush; if(+key_h)>200) key_h=0;记录高电平时问key_l=O;if(key>0x80) key=O;elsekpush=PO&OxOC;key_l+;if(key_l>800)&&(key_h>30)

22、 key=kpush|0x80;key_h=O; key_l=O;) #include ,keyboard.hninclude "ISR.h"include ,LED.h,1uChar8 PWM_duty = 50;uChar8 PWM_cycle = 100; #include ,keyboard.h"include "ISR.h"include ,LED.h,1uChar8 PWM_duty = 50;uChar8 PWM_cycle = 100;/4*4矩阵式键盘扫描uChar8 Key_Scan(void) (uChar8 code_h

23、,codej;P3=0xF0;if(P3&0xF0)!=0xF0) DelayMS(l);if(P3&0xF0)!=0xF0) code_h=0xFE;while(P3&0xF8)!=0xF0) P3=code_h;if(P3&0xF0)!=0xF0)(codeJ=(P3&0xF0|0x0F);return(code_h)+(code_l); )else code_h=(code_h«l) 10x01;) return(O);)/4*4矩阵式键盘译码uChar8 Get_Key_Val(uChar8 key_temp)(switch(key_t

24、emp)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 Oxll: return 7;case 0x21: return 8;case 0x41: return 9; default: return 0; ) 按键处理函数 void key_Process(void) ( switch(key) case 0x08:KB1 键按下( if(PWM_duty=100) PWM_duty

25、=100;else PWM_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;else PWM_duty-;break;)case 0x84:KB2 键按下(if(PWM_duty=0x00) PWM_duty=0x00;else if(PWM_duty>=10)PWM_duty=PWM_duty-10; b

26、reak;)default: break;)key = OxlC;)uChar8 Key_Scan(void)(uChar8 code_hzcodej;P3=0xF0;if(P3&0xF0)!=0xF0)DelayMS(l);if(P3&0xF0)!=0xF0)code_h=OxFE;while(P3&0xF8)!=0xF0)P3=code_h;if(P3&0xF0)!=0xF0)(codeJ=(P3&0xF0|0x0F);return(code_h)+(code_l);)else code_h=(code_h«l) 10x01;)return

27、(O);)/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; )按键处理函数void key_Process(vo

28、id)(switch(key)case 0x08:KB1 键按下( if(PWM_duty=100) PWM_duty=100;else PWM_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;else PWM_duty-; break;)case 0x84:KB2 键按下( if(PWM_duty=0x00)

29、PWM_duty=0x00;else if(PWM_duty>=10)PWM_duty=PWM_duty-10; break;) default: break;) key = OxlC;#include,llcdl602.hnsbit RS=P0A5;sbit RW=P0A6;sbit EN=P0A7;static void DectectBusyBit(void)(P2=0xFF;RS=0;RW=1;EN=1;DelayMS(l);while(P2&0x80);EN=0;)void WrComLCD(uChar8 ComVal) (RS=0;RW=0;EN=1;P2=ComVa

30、l;DelayMS(l);EN=0;)void WrDatLCD(uChar8 DatVal)(RS=1;RW=0;EN=1;P2=DatVal;DelayMS(l);EN=0;)void LCDJnit(void)(/16x2行显示,5x7点阵,8位数据接I I显不清屏光标自增,画面不动开显示,关光标并不闪烁WrComLCD(0x38);DelayMS(l);WrComLCD(0x38);WrComLCD(OxOl);WrComLCD(0x06);DelayMS(l);WrComLCD(OxOC);)void ClearDisLCD(void)(WrComLCD(OxOl);DelayMS(

31、l);)void WrStrLCD(bit Row,uChar8 Column,uChar8 *String) (if(!Row) WrComLCD(0x80+Column);else WrComLCD(OxCO+Column);while(*String)WrDatLCD(*String);String+;)void WrCharLCD(bit Row,uChar8 ColumuCharS Dat)(if(!Row) WrComLCD(0x80+Column);else WrComLCD(OxCO+Column);WrDatLCD(Dat);) include "led.h&quo

32、t;void LED_Run_EN()(LED_Run = 0;)void LED_Run_disEN()(LED_Run = 1;)void LED_Alarm_EN()(LED_Alarm = 0;)void LED_Alarm_disEN()(LED_Alarm = 1;)void LED_Flash(void)(P0Al = 0;DelayMS(lOOO);POA1 = 1;DelayMS(lOOO);)include "SPl.h"char serial_data;char data_example=Ox55;char data_save;bit transmit

33、_completed= 0;void SPI_Config(void)(SPCON | = 0x10; /* Master mode */SPCON |=0x82;/* Fclk Periph/128 */SPCON | = 0x20; /* Pl.l 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 inte

34、rrupt */SPCON |=0x40; /* run spi */EA=1; /* enable interrupts */)void it_SPI(void) interrupt 9 /* interrupt address is 0x004B */(switch( SPSTA ) /* read and clear spi status register */case 0x80:serial_data=SPDAT;transmit_completed=l;break;case 0x10:break;case 0x40:break;) #include,timerO.h,void timerO_lnit(void)(TMOD=(TMOD&OxFO)10

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论