直流电机调速系统设计报告信息与控制工程学院电气工程系2015年1月23日一、实习任务:设计并制作一套直流电机调速系统,系统的结构简图如图1所示。主要包括两个部分:主电路部分和以控制电路为核心的控制电路部分。要求设计制作电路和主电路,实现如下功能:(1)通过码盘和光耦得到一系列脉冲利用M法、T法、或M/T法对这些脉冲在单片机中进行处理即可得到电机的转速,可以在数码管上显示。(2)DC/DC电路能够正常工作,通过旋钮或旋钮设定转速,并能够通过电力电子电路输出合适的电压,使电机的转速达到设定转速。直流电源DCDC驱动与保护电路单片机系统旋钮输入数码管显示码盘和光耦图1基于单片机的直流电机调速系统示意图二、实习要求(1)单片机最小系统。根据给出的单片机及相关的元器件,设计并制作单片机最小系统,单片机最小系统能够正常工作,即程序能够正常下载和运行。(2)输入单元。能够用键盘或者旋钮来实现对转速的设定。(3)显示单元。能够用数码管准确显示转速。根据提供的元器件选择显示方案:采用并口+数码管;采用串口驱动数码管。(我们组采用的是串口驱动数码管)(4)主电路单元。根据所列出的原器件清单,选择和设计合理的DC/DC电路,能够实现对转速的闭环控制。可以选择以下方案:BUCK电路、H桥电路或半桥电路。三、核心电路原理图220V78127805+5V220:15104104104104+12V470uF220uF220uF图1整流电路接线图IR2125PWM1234567812V10uF10510422ohm4.7K1N4741M24V470uF图2驱动电路(BUCK)电路接线图四、主程序流程1)主程序主程序初始化对转速值的个、十、百、千位进行分离,存入数组2)测速环节外部中断0开始M法计数值+1外部中断0结束定时器0中断开始定时器中断次数+1记满50次?清中断标志,重装计算转速、清计数值定时器0中断结束YN2)调速环节定时器1中断开始标志位清0,重装关LED显示取段码装入P0,取位码装入P2AD开始转换显示位计数值Counter+1Counter=4?Counter=0定时器1中断结束NYADC中断开始清中断标志位将AD转换结果送入PWM占空比寄存器ADC中断结束五、心得体会本次课程设计任务为设计一个由单片机控制的直流电机调速系统,包含电源、单片机最小系统、光耦测速系统、PWM调速系统4部分。系统以增强型51单片机为核心,通过电位器提供转速控制信号,由单片机产生PWM波对电机进行控制,光耦进行测速并使用数码管进行显示。下面说一下此次课程设计中遇到的几个问题,首先在前期焊接电路板时,四位七段数码管在导入程序之后中间两位数并没有发亮,经过检查,发现是74HC595D芯片的5V电源及地线虚焊;后来在带电机调试时数码管显示的亮度微弱甚至消失,用万用表测量单片机电源端发现电压只有1.6V,595的电源端也是此值,整流电路7805芯片的3管脚输出正是1.6V,而其输入是15V交流电没错,2管脚也没有虚焊,7815芯片的输入输出都正常,在换了一个7805芯片的情况下也仍是1.6V,将电路板插入电脑USB时数码管正常发亮,因此断定是7805芯片前半部分电路的原因。因为两路整流电路的前部分相同,所以我们去掉了5V电路的整流桥,从15V处引进,之后7805芯片输出恢复正常,数码管正常发亮,电机也实现了可调速。附:程序代码#includestc15w.h#includeintrins.h#includemath.h#defineuintunsignedint#defineucharunsignedcharucharbdataOutByte;/*定义待输出字节变量*/sbitBit_Out=OutByte^7;/*定义输出字节的最高位,即输出位*/sbitBout=P1^2;/*位输出引脚*/sbitSclk=P1^4;/*位同步脉冲输出*/sbitSLclk=P1^3;/*锁存脉冲输出*/sbitPWM7=P1^7;ucharcodeSegment[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管段码ucharLocation=1;//定义位码uchari=0,m=0,n=0,k=0;ucharadc_count=0;uintad_get=0;uintAD_val=0;uintad_result=0;voidpwm7_setw(uintw);/*输出点亮一个7段LED显示器*/voidOneLed_Out(uchari,ucharLocation){ucharj;OutByte=Location;/*先输出位码*/for(j=1;j=8;j++){Bout=Bit_Out;Sclk=0;Sclk=1;Sclk=0;/*位同步脉冲输出*/OutByte=OutByte1;}OutByte=Segment[i];/*再输出段码*/for(j=1;j=8;j++){Bout=Bit_Out;Sclk=0;Sclk=1;Sclk=0;/*位同步脉冲输出*/OutByte=OutByte1;}SLclk=0;SLclk=1;SLclk=0;/*一个锁存脉冲输出*/}/*延时1us*/voiddelay(uintz){uintx,y;for(x=z;x0;x--)for(y=110;y0;y--);}/*ADC初始化*/voidADC_init(){P1=0XFF;P1ASF=0X01;//p1^0作为A/D输入端口使用ADC_RES=0;//ad结果寄存器清零ADC_RESL=0;ADC_CONTR=0XE8;//ADC_POWER+转换周期设定为90周期+ADC_FLAG+ADC_START+输入通道设置为p1.0delay(2);//上电延时,等待内部模拟电压稳定}//ADC中断服务程序voidadc_re()interrupt5{ADC_CONTR&=0xEF;//清标志位,其他寄存器位不变AD_val=ADC_RES*4+ADC_RESL;//读取转换结果ad_get+=AD_val;adc_count+=1;if(adc_count==50){ad_result=ad_get/50;adc_count=0;ad_get=0;pwm7_setw(ad_result);}ADC_RES=0;//高八位数据清零ADC_RESL=0;//低两位清零ADC_CONTR|=0x08;//启动AD转换}/**//*ad结果显示*/voidad_disp(){uinta=0,b=0,c=0,d=0;a=(uint)ad_result/1000;b=(uint)ad_result%1000/100;c=(uint)ad_result%100/10;d=(uint)ad_result%10;OneLed_Out(a,1);OneLed_Out(b,2);OneLed_Out(c,4);OneLed_Out(d,8);}/*PWM设置*/voidpwm_cfg(){P1M0=0X00;P1M1=0X00;P1&=~0X80;P_SW2|=0X80;//端口配置,扩展SFRPWMCKS=0X00;//PWM时钟源设定PWMC=1024;//pwm周期设定PWM7T1=1;//第一次翻转PWM7T2=0;//第二次翻转PWM7CR=0X00;//设置P1.7为PWM输出口PWMCFG=0X00;PWMCR=0X3F;PWMCR|=0X80;P_SW2&=~0x80;}voidpwm7_setw(uintw){if(w==0){PWMCR&=~0X20;PWM7=0;}elseif(w==1024){PWMCR&=~0X20;PWM7=1;}else{P_SW2|=0X80;PWM7T1=w;P_SW2&=~0X80;PWMCR|=0X20;}}voidmain(){ADC_init();IE=0XA3;//开总中断,开ADC中断,开定时器0中断,开外部中断0pwm_cfg();while(1){ad_disp();}}