姓名:张梦洁学号:11300720276座号:50指导老师:冯辉上课时间:周一下午实验名称:直流电机实验目的:1、了解直流电机的控制原理2、了解PWM的原理3、掌握利用定时器产生PWM波控制信号的方法实验原理:1、H型双极可逆PWM驱动系统:H型双极可逆PWM电流波形:2、PWM(Pulsewidthmodulation),脉宽调制直流电机:ZDJ_A电压比ZDJ_B高,则电机正转;ZDJ_A电压比ZDJ_B低,则电机反转;姓名:张梦洁学号:11300720276座号:50指导老师:冯辉上课时间:周一下午实验内容:1、短接B10区的JP18跳线,B10区ZDJ_B连C1区GND。B10区的ZDJ_A连A2区的P10,利用定时器在P10口产生PWM波形来驱动电机。2、A2区P11连D1区的KEY1,P12连D1区的KEY2。利用两个按键来动态调整PWM的占空比,控制电机转速。实验设计:电路图:(修改后加上了直流电机的电路图)流程图:主程序流程图:姓名:张梦洁学号:11300720276座号:50指导老师:冯辉上课时间:周一下午开始初始化定时器200us开中断开计时器KEY1按下?高电平脉冲数达到上边界?高电平脉冲数加1高电平脉冲数达到上边界?定时器停止P1.0置为高电平增加占空比是否是高电平脉冲数达到下边界?重开定时器否是高电平脉冲数达到下边界?KEY2按下?高电平脉冲数减1高电平脉冲数达到下边界?定时器停止P1.0置为低电平降低占空比周期减1高电平脉冲数达到上边界?重开定时器否是否是否是否否是是否定时器中断服务程序程序流程图:姓名:张梦洁学号:11300720276座号:50指导老师:冯辉上课时间:周一下午中断服务程序开始计数值加1计数值等于高电平脉冲数?计数值等于周期数?计数器复位P1.0置高电平中断返回P1.0置低电平是否是否代码及注释:(修改后加上了防抖动的延时程序)PWMHDATA30H;高电平脉冲的个数PWMDATA31H;PWM的周期COUNTERDATA32H;计数器计数TEMPDATA33H;寄存器ORG8000H;硬件仿真程序AJMPMAINORG800BH;硬件仿真程序AJMPINTT0;中断服务程序ORG8100H;硬件仿真程序MAIN:MOVSP,#60H;给堆栈指针赋初值MOVPWMH,#02H;给高电平脉冲数赋初值MOVCOUNTER,#01H;给计数器赋初值MOVPWM,#15H;给周期赋初值MOVTMOD,#02H;定时器0在模式2下工作MOVTL0,#48H;定时器每200us产生一次溢出MOVTH0,#48H;自动重装的值SETBET0;使能定时器0中断SETBEA;使能总中断姓名:张梦洁学号:11300720276座号:50指导老师:冯辉上课时间:周一下午SETBTR0;开始计时KSCAN:JNBP1.1,K1CHECK;扫描KEY1,如果按下KEY1,则跳转到KEY1处理程序JNBP1.2,K2CHECK;扫描KEY2,如果按下KEY2,则跳转到KEY2处理程序SJMPKSCANK1CHECK:LCALLDELAY;延时一段时间JBP1.1,KSCANBACK0:JNBP1.1,BACK0;若仍保持闭合状态的电平,则确认按键处于闭合状态LCALLDELAY;延时一段时间JNBP1.1,BACK0SJMPK1HANDLE;确认按下KEY1键,跳转到KEY1处理程序K1HANDLE:MOVA,PWMHCJNEA,PWM,K1H0;判断是否到达上界SJMPKSCAN;是,则不进行任何操作K1H0:MOVA,PWMHINCACJNEA,PWM,K1H1;如果在加1后达到最大值CLRTR0;定时器停止SETBP1.0;置P1.0为高电平SJMPK1H2K1H1:CJNEA,#02H,K1H2;如果加1后达到下边界SETBTR0;重开定时器K1H2:INCPWMH;增加占空比SJMPKSCANK2CHECK:LCALLDELAY;延时一段时间JBP1.1,KSCANBACK1:JNBP1.1,BACK1;若仍保持闭合状态的电平,则确认按键处于闭合状态LCALLDELAY;延时一段时间JNBP1.1,BACK1SJMPK2HANDLE;确认按下KEY2键,跳转到KEY2处理程序K2HANDLE:MOVA,PWMHCJNEA,#01H,K2H0;判断是否到达下边界SJMPKSCAN;是,则不进行任何操作K2H0:姓名:张梦洁学号:11300720276座号:50指导老师:冯辉上课时间:周一下午MOVA,PWMHMOVTEMP,PWMDECACJNEA,#01H,K2H1;如果在减1后到达下边界CLRTR0;定时器停止CLRP1.0;置P1.0为低电平SJMPK2H2K2H1:DECTEMPCJNEA,TEMP,K2H2;如果到达上边界SETBTR0;重启定时器K2H2:DECPWMH;降低占空比SJMPKSCANDELAY:;10ms的延时子程序PUSHPSWSETBRS0MOVR7,#100D1:MOVR6,#50D2:DJNZR6,$DJNZR7,D1POPPSWRETINTT0:PUSHPSW;现场保护PUSHACCINCCOUNTER;计数值加1MOVA,COUNTERCJNEA,PWMH,INTT01;如果等于高电平脉冲数CLRP1.0;P1.0变为低电平INTT01:CJNEA,PWM,INTT02;如果等于周期数MOVCOUNTER,#01H;计数器复位SETBP1.0;P1.0变为高电平INTT02:POPACC;出栈POPPSWRETI;END姓名:张梦洁学号:11300720276座号:50指导老师:冯辉上课时间:周一下午实验结果及分析:上电后直流电机不转动,当连续两次按下KEY1增加占空比后,电机开始缓慢转动,继续按下KEY1,电机开始加速转动。用示波器观察P1.0口的波形,发现刚上电后波形为直流低电平,每按一次KEY1,波形的高电平持续时间增加200us,波形的周期为4ms,按20次KEY1后,波形为直流高电平。而每按一次KEY2键,波形的高电平持续时间减少200us,电机转速减慢。在实验中,将定时器设定为工作在模式2下,每200us产生一次溢出。故定时器的初值为,n=8,解得N=48H。将计数器的初值设为1,高电平脉冲的初始值设为2,在没有按下按键的情况下,定时器第一次中断,计数器加1就达到高电平脉冲数,输出置为低电平,故刚上电后P1.0口的输出波形为直流低电平,电机不工作。此后每按一次加速键KEY1,高电平脉冲数就会加1(即高电平脉冲持续时间增加200us),计数器的计数值也加1,直到计数值等于周期数,输出置为高电平,计数值自动重置位初值,如此循环。而没按一次减速键KRY2,高电平脉冲数减1,高电平脉冲持续时间减少200us。因为每按一次KEY1键,高电平脉冲数都会加1,所以电机的档位数应该为周期数减去高电平脉冲数的初值加1,再除以高电平脉冲数每次增加的值。有开始设定的初值PWM等于15H,PWMH等于02H,可知档位数为(15H-02H+01H)/01H=14H,即20档。用示波器观察P1.0口波形也可发现,按KEY1键20次后,P1.0口输出正好为直流高电平。所以,实验中若要改变电机的档位,只需改变PWM的初值,将其改为PWMH的初值加上所需档位数再减1即可。此外,若不改变PWM的周期,也可通过改变PWMH每次增加的高电平脉冲数来改变档位,但是此方法在加速和减速代码部分都需要作修改,相对比较麻烦。在实验中发现,当按下一次加速键,有时波形的高电平脉冲会连续增加两个(即按一次高电平持续时间增加了400us),这是由于按键的抖动而造成的。当按键按下或释放时,通常伴随有一定时间的触点机械抖动,然后触点才稳定下来。抖动时间的长短与开关的机械特性有关,一般为5~10ms。若在触点抖动期间检测按键的通断状态,可能导致判断出错,即按键一次按下或释放被错误地认为是多次操作。为此,我在程序中加入了一段防抖动的延时程序,在检测到有按键按下时,执行一个10ms左右的延时程序后,若该键仍保持闭合状态的电平,则可以确认该键处于闭合状态;同理,在检测到该键释放后,也采用相同的方法进行确认,从而消除按键抖动产生的影响。防抖动程序如下所示:K1CHECK:LCALLDELAY;延时一段时间JBP1.1,KSCANBACK0:JNBP1.1,BACK0;若仍保持闭合状态的电平,则确认按键处于闭合状态LCALLDELAY;延时一段时间JNBP1.1,BACK0SJMPK1HANDLE;确认按下KEY1键,跳转到KEY1处理程序加上防抖动程序后,按键的抖动情况有所改善,但是加速键KEY1偶尔仍会出现抖动现象,减速键KEY2则没有抖动现象,这也与按键的性能好坏有关。