单片机课程设计单片机控制直流电动机姓名:xxx学号:xxx专业:xxx指导老师:xxx组号:第xxx组1单片机控制直流电机摘要随着时代的进步和科技的发展,电机调速系统在工农业生产、交通运输以及日常伤害中起着越来越重要的作用、由于直流电机剧院良好的起、制动性能,宜与在广泛范围内平滑调速。在轧钢机、矿井卷机,挖掘机、金属切削机床、金属切削机床、造纸机高层电梯等领域中得到广泛应用。长期以来,由于直流调速系统的性能指标优于交流调速系统。PWM控制技术就是以该结论为理论基础,使输出端得到一系列幅值相等而宽度不相等的脉冲,用这些脉冲来代替正弦波或其他所需要的波形。按一定的规则对各种脉冲的宽度进行调制,既可改变逆变电路输出电压大小,也可以改变输出频率。PWM控制技术及其控制简单、灵活和动态响应好的优点而成为电子技术最广泛应用的控制方式,也是人们研究的热点。由于必须在工作期间改变直流电机的速度,直流电机的控制是一个较困难的问题。直流电机高效运行的最常见方法是施加一个PWM(脉宽调制)方波,其占空比对应于所需速度。电机起到一个低通滤波器作用,将PWM信号转换为有效直流电平。特别是对于微处理器驱动的直流电机,由于PWM信号相对容易产生,这种驱动方式使用的更为广泛。设计要求采用单片机设计一个控制直流电机并测量转速的装置。单片机扩展有A/D转换芯片ADC0809和D/A转换芯片DAC0832。(1)通过改变A/D输入端可变电阻来改变A/D的输入电压,D/A输入检测量大小,进而改变直流电机的转速。(2)手动控制。在键盘上设置两个按键—直流电动机加速键和直流电机减速键。在手动状态下,每按一次键,电机的转速按照约定的速率改变。(3)键盘列扫描(46)。实验原理与步进电机类似,直流电机也可精确地控制旋转速度或转矩。直流电机是通过两个磁场的互作用产生旋转。其结构如下页图所示,固定部分(定子)上,装设了一对直流励磁的静止的主磁极N和S,在旋转部分(转子)上装设电枢铁心。定子与转子之间有一气隙。在电枢铁心上放置了由A和X两根导体连成的电枢线圈,线圈的首端和末端分别连到两个圆弧形的铜片上,此铜片称为换向片。2单片机主控电路直流电机的速度与施加的电压成正比,输出转矩则与电流成正比。由于必须在工作期间改变直流电机的速度,直流电机的控制是一个较困难的问题。直流电机高效运行的最常见方法是施加一个PWM(脉宽调制)方波,其占空比对应于所需速度。电机起到一个低通滤波器作用,将PWM信号转换为有效直流电平。特别是对于微处理器驱动的直流电机,由于PWM信号相对容易产生,这种驱动方式使用的更为广泛。利用直流电机的速度与施加电压成正比的原理,通过滑动变阻器向ADC0809输入控制电压信号,经AD后,输入到AT89C51中,AT89C51将此信号转发给DAC0832,通过功放电路放大后,驱动直流电机。设计方案1.系统控制电路采用STC89C52单片机由软件产生脉冲调制信号,来对直流电机进行控制。2.电机控制电路采用由三极管搭成的H型桥电路来控制电机的转动。3.键盘电路采用行式键盘实现电机转速的加速减速以及正反转的控制,在手动状态下,每按一次,其转速相应发生改变。4.显示电路采用LM016L对电机运动状态进行显示。系统组成框图系统总组成框图以STC89C52为主控芯片,采用桥式电路对直流电机驱动,如下所示:键盘控制电路直流电机H型桥式驱动电路3硬件电路设计1.键盘控制电路按下DEC按钮,电机转速降低;按下INC按钮,电机转速增加。2.单片机主控电路图该部分电路主要由STC89C52主控芯片和晶振组成。STC89C52芯片是低功耗8位CMOS微处理器,提供串口程序下载口。它主要有以下几个特点:256字节的RAM;4KB的ROM;32个通用I/O口线,为用户提供了丰富的I/O口资源;32个通用工作寄存器;2个定时器/计数器;具有6个中断源;4.0~5.5V的工作电压等。晶振给单片机正常工作提供稳定的信号。43.H型桥式电机驱动电路H桥式电机驱动电路包括4个三极管和一个电机。要使电机运转,只须导通对角线上的一对三极管。在此设计中用到的完整的驱动电路如下:5主控程序程序流程开始系统初始化主控程序加速控制按键减速控制按键复位还原按键方向控制按键减速取反控制方向位加速消去TF0,重装初值6总仿真电路图程序清单1.主程序#includeAT89X51.h#includeintrins.h#includestdio.h#includeled.h#includeuart.h#includetimer0.h#includetimer1.h#includecommon.h#includeADC0831.h#includelcd1602.h#includekeyboard.h#includeISR.h#includeDaType_Change.h#defineDcMotor_Direction_PuChar8code*String1=DCMotorControl;uChar8code*String2=pwm:/100;uChar8PWM_buff[3];voidmain(void){LCD_Init();timer0_Init();timer1_Init();#ifdefDcMotor_Direction_PDer1=0;7#elseDer1=1;#endifLED_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.子程序………………………………………………………………………………………………………………………………………………………#includeADC.hunsignedcharvalue_converted=0x00;unsignedcharvalue_AN6=0x00;unsignedcharvalue_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;}8}voidit_Adc(void)interrupt8{ADCON&=~0x10;value_converted=ADDH;end_of_convertion=1;}……………………………………………………………………………………………………………………………………………………..#includeadc0831.hvoidADC_CLK(void){adcclk=1;_nop_();adcclk=0;_nop_();}uChar8Read_ADC(void){uChar8i;bittemp=ADC_Val^0;adccs=0;ADC_CLK();while(adcdo);for(i=0;i8;i++){ADC_CLK();ADC_Val=(ADC_Val1)|adcdo;}adccs=1;return(ADC_Val);}voidIntToStr(uInt16t,uChar8*str,uChar8n){uChar8a[5];chari,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;i5;i++)//转成ASCII码a[i]=a[i]+'0';for(i=0;a[i]=='0'&&i=3;i++);//计算空格(0)数量9for(j=5-n;ji;j++)//填充空格{*str='';str++;}for(;i5;i++){*str=a[i];str++;}//加入有效的数字*str='\0';}…………………………………………………………………………………………………………………………………………………......#includebeep.hsbitbeep=P1^4;voidBeepRing(void){beep=0;DelayMS(100);beep=1;DelayMS(100);}………………………………………………………………………………………………………………………………………………………#includeDaType_Change.hvoidChar_To_Str(uChar8Data,uChar8*str){uChar8a[4];uChar8i,j;a[0]=(Data/100)%10;a[1]=(Data/10)%10;a[2]=(Data/1)%10;for(i=0;i3;i++)//转成ASCII码a[i]=a[i]+'0';for(i=0;a[i]=='0'&&i3;i++);for(j=0;ji;j++)//填充空格{*str='';str++;}for(;i3;i++){*str=a[i];str++;}//加入有效的数字*str='\0';}………………………………………………………………………………………………………………………………………………………#includedelay.hvoidDelayUS(uChar8ValUS)//精确延时,18uS+(ValUS-1)*8us{for(;ValUS0;ValUS--){;}}10staticvoidDelay1MS(void){uChar8i=2,j=199;do{while(--j);}while(--i);}voidDelayMS(uInt16ValMS){uInt16uiVal;for(uiVal=0;uiValValMS;uiVal++){Delay1MS();}}………………………………………………………………………………………………………………………………………………………#includeDS18B20.hsbitDQ=P1^0;voidSendDS18B20(uChar8SendDat){uChar8i;for(i=0;i8;i++){DQ=0;_nop_();_nop_();_nop_();_nop_();//延时4usif((SendDat&0x01)==0)DQ=0;elseDQ=1;SendDat=SendDat1;DelayUS(5);DQ=1;}}uChar8Init_DS18B20(void){uChar8i;DQ=0;DelayUS(61);DQ=1;DelayUS(8);11for(i=0;i100;i++){if(DQ)break;}DQ=1;DelayUS(11);return0xff;}uChar8ReceiveDS18B20(void){uChar8tmp=0;uChar8i;for(i=0;i8;i++){tmp=tmp1;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