STC系列PWM方式控制两相步进电机
基于单片机STC89C52的直流电机PWM调速控制系统
第一章:前言Pwm 电机调速原理对于电机的转速调整,我们是采用脉宽调制(PWM)办法,控制电机的时候,电源并非连续地向电机供电,而是在一个特定的频率下以方波脉冲的形式提供电能。
不同占空比的方波信号能对电机起到调速作用,这是因为电机实际上是一个大电感,它有阻碍输入电流和电压突变的能力,因此脉冲输入信号被平均分配到作用时间上,这样,改变在始能端EN1 和EN2 上输入方波的占空比就能改变加在电机两端的电压大小,从而改变了转速。
此电路中用微处理机来实现脉宽调制,通常的方法有两种:(1)用软件方式来实现,即通过执行软件延时循环程序交替改变端口某个二进制位输出逻辑状态来产生脉宽调制信号,设置不同的延时时间得到不同的占空比。
(2)硬件实验自动产生PWM 信号,不占用CPU 处理的时间。
这就要用到STC89C52的在PWM模式下的计数器1,具体内容可参考相关书籍。
51 单片机PWM 程序产生两个PWM,要求两个PWM 波形占空都为80/256,两个波形之间要错开,不能同时为高电平!高电平之间相差48/256,PWM 这个功能在PIC 单片机上就有,但是如果你就要用51 单片机的话,也是可以的,但是比较的麻烦.可以用定时器T0来控制频率,定时器T1 来控制占空比:大致的的编程思路是这样的:T0 定时器中断是让一个I0口输出高电平,在这个定时器T0的中断当中起动定时器T1,而这个T1 是让IO 口输出低电平,这样改变定时器T0 的初值就可以改变频率,改变定时器T1 的初值就可以改变占空比。
前言:直流电机的定义:将直流电能转换成机械能(直流电动机)或将机械能转换成直流电能(直流发电机)的旋转电机。
近年来,随着科技的进步,直流电机得到了越来越广泛的应用,直流具有优良的调速特性,调速平滑,方便,调速范围广,过载能力强,能承受频繁的冲击负载,可实现频繁的无极快速起动、制动和反转,需要满足生产过程自动化系统各种不同的特殊要求,从而对直流电机提出了较高的要求,改变电枢回路电阻调速、改变电压调速等技术已远远不能满足现代科技的要求,这是通过 PWM 方式控制直流电机调速的方法就应运而生。
基于STC52单片机的直流电机PWM调速系统
基于STC52单片机的直流电机PWM调速系统作者:付洪江来源:《中国科技博览》2017年第20期[摘要]本文介绍一种基于STC52单片机控制的PWM直流电机脉宽调速系统。
系统以廉价的STC52单片机为控制核心,以直流电机为控制对象。
从系统的角度出发,对电路进行总体方案论证设计,确定电路各个的功能模块之间的功能衔接和接口设置,详细分析了各个模块的方案论证和参数设置。
整个系统利用52单片机的定时器产生1K左右的PWM脉冲,通过快速光耦6N137实现控制单元与驱动单元的强弱电隔离,采用4个9013和2个9012构成的H桥电路实现对直流电机的调速,用光电编码盘完成测速功能。
[关键词]直流电动机;调速中图分类号:TM33 文献标识码:A 文章编号:1009-914X(2017)20-0186-01一、数字直流调速的意义现在电气传动的主要方向之一是电机调速系统采用微处理器实现数字化控制。
从上世纪80年代中后期起,世界各大电气公司如ABB、通用、西屋、西门子等都在竞相开发数字式调速传动装置,经过二十几年的发展,当前直流调速已发展到一个很高的技术水平:功率元件采用可控硅;控制板采用表面安装技术;控制方式采用电源换相、相位控制[1]。
二、系统总体方案论证1、系统方案比较与选择方案一:采用专用PWM集成芯片、IR2110功率驱动芯片构成整个系统的核心,现在市场上已经有很多种型号,如Tl公司的TL494芯片,东芝公司的ZSK313I芯片等。
这些芯片除了有PWM信号发生功能外,还有“死区”调节功能、过流过压保护功能等。
这种专用PWM集成芯片可以减轻单片机的负担,工作更可靠,但其价格相对较高,难于控制工业成本不宜采用。
方案二:采用STC52单片机、功率集成电路芯片L298构成直流调速装置。
L298是双H 高电压大电流功率集成电路,直接采用TTL逻辑电平控制,可用来驱动继电器、线圈、直流电动机、步进电动机等电感性负载。
其驱动电压为46V,直流电流总和为4A。
用PWM 细分步进电机,包含原理和程序
用PWM细分步进电机,包含原理和程序农民讲习所 这是俺一个关于打印机项目中步进马达中的内容,使用的原理为电流矢量图(a),为减少矢量表的误差,改进为(g).(误差大的时候,Ia和Ib的绝对值变大,角度不变,即比例不变) 磁场合成决定步进马达当前的位置。
我们常用的是图(b),用电压驱动时和线圈个数有关系,直接驱动它们,合成的最小角度都是固定的。
细分最常见的是电流细分,电流引起的磁场的合成就决定马达的角度。
所以我们一般用电流合成图来代替磁场合成图。
用电流合成电路复杂一点(用MCU+DA+L298实现也不难)。
这里俺用PWM方式,用控制电压的方式代替电流。
原因:在电压稳定后,线圈的电流和电压成正比。
稳定是PWM细分的要点,也决定马达速度不能太高。
在细分的情况下,电机分两相和四相是没意义的。
可以把四相电机当两相使用。
下面是俺的程序,使用MEGA16,因为有PWM。
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //2相步进马达驱动 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #define Step_OutMode() DDRB|=BIT(6)|BIT(7) #define Step_InMode() DDRB&= ̄(BIT(6)|BIT(7)) #define Step_ReadIO() (PORTB&(  ̄(BIT(6)|BIT(7)) )) #define Step_WriteIO(x) PORTB=x struct Motor2P_Table{ //细分表结构 unsigned char mQuadrant; //象限0-3 unsigned char mX_Pwm; //x输出的PWM unsigned char mY_Pwm; //y输出的PWM }; struct Motor2P{ unsigned char mTableId; //细分表ID unsigned char mTask; //马达驱动的任务转移号 unsigned char mSaveTimer; //马达驱动节电模式使用的计数器 unsigned char mReg; //马达驱动使用的寄存器 unsigned char mTimer; //对2MS的计数器,时间扩展 unsigned int mSteps; //马达要走的步数 unsigned char mDirect; //马达走动方向 unsigned char mStepRunTimer; //步进时输出有效的时间寄存器 unsigned char mStepIdleTimer; //步进时输出节电的时间寄存器 unsigned char mStepCount; //细分表走动步长。
STC12内部PWM使用方法解析
STC12内部PWM使用方法解析首先说一下PWM是一个什么样的东西,PWM的中文名字叫做“脉宽调制”,也就是说呢,我们的电路有两种状态,通或者不通,我们用单片机控制输出高电平低电平从而控制电路的通断来达到我们想要的某种模拟电路特有的效果的一种技术。
我们举个例子,比如说我们的直流电机直接接在五伏的电源上,要么全速运转,要么不转。
那我们怎样实现调速呢?我们可以通过单片机来控制这个电路,让电机电路通一段时间断一段时间。
比如说通一秒断一秒,那么电机的速度就会比全速运转时候低,不断改变这个通断之间的间隔时间,我们就可以达到一种调速的效果。
下面呢,我们就切入正题。
STC12C5A60S2这款单片机(下面说成12系列单片机),与89系列的单片机相比,它的内部增加了独立的PCA(计数器阵列,说简单点就是好几个计数器)或者说PWM模块,通过配置相关的特殊功能寄存器,我们可以实现一些额外的功能,比如说计时器,高脉冲输出,PWM输出等,如果我们用这种方法来实现PWM功能,要比用定时器加中断组合那种方法简单很多。
大家可能都看过那个技术文档,但是不得不说它的技术文档写的真是让人不敢恭维。
经过查阅资料,还有逛论坛,我大致了解了PCA模块,它到底是什么样一个东西,应当怎样用等。
下面我把相关的内容分享给大家,与大家交流一下。
如果有什么不对的地方,大家可以评论里边指出来,一定虚心思考。
我们看官方对PCA模块的介绍:对于图片里边提到的定时器的概念,大家已经非常熟悉了,而“捕获/比较器”,这个东西对我们来说可能比较生疏,其实通俗的说呢,在PWM功能里边,模块0与模块1里边的捕获比较器,就是一个比较大小的硬件装置。
假如有一个固定的值装在模块0的特殊功能寄存器里边,有一个外部来的外来值与它里边装的那个值不停的进行比较大小这种操作,如果外来的值比较小,那么这个比较大小的装置就会输出0,反之输出1。
(至于捕获模式,我们暂时用不到,他们其实是一个可以检测到相应引脚高低电平变化的硬件装置,我们知道,引脚拉高拉低并不是一下子就完成的,无论拉高或拉低,都有一定的上升或下降沿,捕获其实捕获的就是这种上升下降沿,一旦捕获到,可以触发相应的中断,这些都由软件决定。
(仅供参考)控制步进电机STC12C5A60S2输出变频PWM
#include <stc12c5a60s2.h>#define FOSC 12000000Lunsigned char length,HZ;unsigned long PCHZ,count,m,lowest_PCHZ,Acc_m,Dec_m,L_PCHZ; unsigned long Acc_Inplace,Dec_Inplace;unsigned long increasing,decline;sbit direction=P0^6;sbit PWM0=P1^3;sbit enable=P3^2;sbit led1=P0^7;unsigned char yb,syb;bit pause_busy,stop_busy,busy,Timer1_busy;bit pause,go_ahead,stop,reset;bit USART_Flag=0;bit Acc_flag,Dec_flag;bit flag=0;bit Trans_pause_busy;void ENPCA_Init() //PWM输出初始化函数{CCON=0 ;CMOD |=0x05;CL=0;CH=0;CR=1;}void Timer0_Init(unsigned char tt){AUXR |=0x80;TMOD |=0x02;TH0= tt;TL0= tt;TR0= 1;}void send(unsigned char send_data) //串口发送函数{SBUF=send_data;while(!TI);}void PWM_OUT(unsigned char channel,unsigned char start_value) //PWM 输出函数{if(channel == 0){CCAP0L = start_value; //Set the initial value same as CCAP0HCCAP0H = start_value; //25% Duty CycleCCAPM0 = 0x53; //0x42 Setup PCA module 0 in PWM mode }if(channel == 1){CCAP1L = start_value; //Set the initial value same as CCAP1HCCAP1H = start_value; //25% Duty CycleCCAPM1 = 0x73; //0x42 Setup PCA module 1 in PWM mode }}void Set_Function1() //数据设置函数{if(set_data[2]==0xFF){flag=0;Dec_flag=0;Acc_flag=0;if(!busy){count=set_data[3]*65536+set_data[4]*256+set_data[5];PCHZ=set_data[6]*256+set_data[7];HZ=(256-(FOSC/256/PCHZ));direction=(set_data[8]&0x01);enable=(set_data[8]&0x02)>>1;if(enable){PWM_OUT(0,0X80);ENPCA_Init();Timer0_Init(HZ);}}else{send('D');}}else if (set_data[2]==0xFE){Acc_flag=1;flag=1;count=set_data[3]*65536+set_data[4]*256+set_data[5];lowest_PCHZ=set_data[6]*256+set_data[7];L_PCHZ=lowest_PCHZ;HZ=(256-(FOSC/256/lowest_PCHZ));PCHZ=set_data[8]*256+set_data[9];direction=(set_data[10]&0x01);enable=(set_data[10]&0x02)>>1;if(enable){PWM_OUT(0,0x80);ENPCA_Init();Timer0_Init(HZ);}}else{if(!busy){if(set_data[2]<=0x04){flag=0;Acc_flag=0;Dec_flag=0;if(set_data[2]==0x01){count=set_data[3]*65536+set_data[4]*256+set_data[5];}else if(set_data[2]==0x02){PCHZ=set_data[3]*256+set_data[4];HZ=(256-(FOSC/256/PCHZ));}else if(set_data[2]==0x03){direction=(set_data[3]&0x01);}else if(set_data[2]==0x04){enable=(set_data[3]&0x01);}if(enable){PWM_OUT(0,0X80);ENPCA_Init();Timer0_Init(HZ);}}else{flag=1;Dec_flag=0;Acc_flag=1;if(set_data[2]==0x05){count=set_data[3]*65536+set_data[4]*256+set_data[5];}if(set_data[2]==0x06){lowest_PCHZ=set_data[6]*256+set_data[7];L_PCHZ=lowest_PCHZ;HZ=(256-(FOSC/256/lowest_PCHZ));}else if(set_data[2]==0x07){PCHZ=set_data[8]*256+set_data[9];}else if(set_data[2]==0x08){direction=(set_data[3]&0x01);}else if(set_data[2]==0x09){enable=(set_data[3]&0x01);}if(enable){Acc_flag=1;PWM_OUT(0,0X80);ENPCA_Init();Timer0_Init(HZ);}}}else{if(set_data[2]==0x0A){pause=set_data[3]&0x01;}if(set_data[2]==0x0B){go_ahead=set_data[3]&0x01;}if(set_data[2]==0x0C){stop=set_data[3]&0x01;}if(set_data[2]==0x0D){reset=set_data[3]&0x01;}}}}void Modbus_Init(unsigned char cc) //moudbus协议转换函数{unsigned char i,t;for(i=1;i<=(cc-3);i++){if((rsbuf[i]>=0x30)&&(rsbuf[i]<=0x39)){if(i%2){rsbuf[i]=(rsbuf[i]-0x30)<<4;}else{rsbuf[i]=rsbuf[i]-0x30;}}else if((rsbuf[i]>=0x41)&&(rsbuf[i]<=0x46)){if(i%2){rsbuf[i]=(rsbuf[i]-0x37)<<4;}else{rsbuf[i]=rsbuf[i]-0x37;}}else if((rsbuf[i]>=0x61)&&(rsbuf[i]<=0x66)){if(i%2){rsbuf[i]=(rsbuf[i]-0x47)<<4;}else{rsbuf[i]=rsbuf[i]-0x47;}}}t=1;for(i=1;i<=(cc-3);i=i+2){if(t<=((cc-3)>>1)){set_data[t]=rsbuf[i]+rsbuf[i+1];t++;}else{t=0;}}}void Serical_Init() //串口初始化函数{PCON |= 0x80; //使能波特率倍速位SMODSCON = 0x50; //8位数据,可变波特率BRT = 0xFA; //设定独立波特率发生器重装值AUXR |= 0x04; //独立波特率发生器时钟为Fosc,即1TAUXR |= 0x01; //串口1选择独立波特率发生器为波特率发生器AUXR |= 0x10; //启动独立波特率发生器ES=1;}void Clear_Function() //PWM输出定位清空函数{if(m==1){send('4');}if(m>=count){TR0=0;CR=0;busy=0;enable=0;send(m/65536);send((m%65536)/256);send(((m%65536)%256)%256);m=0;PCHZ=0;count=1;lowest_PCHZ=0;Dec_flag=0;Acc_flag=0;flag=0;}if(flag){if(lowest_PCHZ<PCHZ){HZ=(256-(FOSC/256/lowest_PCHZ));Timer0_Init(HZ);}else{Acc_flag=0;Dec_flag=0;HZ=(256-(FOSC/256/PCHZ));Timer0_Init(HZ);}if(m>=count-Acc_m){Dec_flag=1;Acc_flag=0;if(lowest_PCHZ<=L_PCHZ){Dec_flag=0;lowest_PCHZ=L_PCHZ;}}}}void USART_Data() //串口接收数据处理函数{unsigned char ii;for(ii=0;ii<=length-1;ii++){ssbuf[ii]=rsbuf[ii];}Modbus_Init(length);if(set_data[1]==0x01){Set_Function1();yb=0;}}void Pause_Function() //PWM输出中暂停处理函数{if(Acc_flag | Dec_flag){CR=0;TR0=0;count=count-m;send(m/65536);send((m%65536)/256);send(((m%65536)%256)%256);m=0;Trans_pause_busy=1;}else{CR=0;TR0=0;count=count-m;send(m/65536);send((m%65536)/256);send(((m%65536)%256)%256);m=0;pause_busy=1;}}void Go_ahead_Function() //PWM输出暂停后继续输出函数{if(Trans_pause_busy){CR=1;TR0=1;flag=1;Trans_pause_busy=0;}else if (pause_busy){CR=1;TR0=1;flag=0;pause_busy=0;}}void Stop_Function() //PWM输出停止函数{stop_busy=1;CR=0;TR0=0;count=count-m;m=0;}void Reset_Function() //PWM输出复位函数{if(stop_busy){if(direction){direction=0;flag=0;Timer0_Init(15);TR0=1;CR=1;stop_busy=0;}else{flag=0;Timer0_Init(15);TR0=1;CR=1;stop_busy=0;}}}void main() //程序运行主函数{enable=0;direction=0;P2=0x01;Serical_Init();EA=1;busy=0;CR=0;IPH |=0x10;PS =1;while(1){if(USART_Flag) //判断是否接收到数据{USART_Flag=0; //判断标记位清零USART_Data(); //处理接收数据}Clear_Function();if(pause) //判断是否接收到暂停指令{pause=0;Pause_Function();}if(go_ahead) //判断是否接收到继续指令{go_ahead=0;Go_ahead_Function();}if(stop) //判断是否接收到停止指令{stop=0;Stop_Function();}if(reset) //判断是否接收到复位指令{reset=0;Reset_Function();}}}void Serical_Interrupt() interrupt 4 //串口中断函数{unsigned char temp,temp_next;if(RI){RI=0;temp=SBUF;rsbuf[yb]=temp;yb++;led1=0;if((rsbuf[0]==':')&&(temp_next=0x0D)&&(temp==0x0A)){length=yb;USART_Flag=1;}temp_next=temp;}if(TI){TI=0;}}void PCA_Interrupt ()interrupt 7 //PWM输出中断函数{CF=0;CCF0=0;m++;busy=1;if(Acc_flag){{lowest_PCHZ++;}if(lowest_PCHZ==PCHZ){Acc_m=m;Acc_flag=0;}}if(Dec_flag){{lowest_PCHZ--;}}}。
两相步进电机控制原理
两相步进电机控制原理步进电机是一种特殊的电动机,它可以通过按照预定的步进角度进行准确的位置控制。
而两相步进电机是步进电机中最常见的一种类型。
本文将介绍两相步进电机的控制原理。
我们来了解一下两相步进电机的基本结构。
两相步进电机由两个相位差90度的绕组组成,每个绕组都连接在一个电源上。
这两个绕组分别称为A相和B相。
当电流通过A相时,电机转子会朝一个方向旋转;当电流通过B相时,电机转子会朝另一个方向旋转。
为了实现对两相步进电机的控制,我们需要使用一个驱动器。
驱动器可以提供电流和控制信号,使电机按照预定的步进角度转动。
常见的驱动器有单片机控制的驱动器和专用步进电机驱动器。
单片机控制的驱动器是通过单片机来控制电机的转动。
单片机可以根据程序中的指令,依次给A相和B相施加电流,从而使电机按照预定的步进角度转动。
这种方法的优点是灵活性高,可以根据需求编写各种控制程序。
但是,由于单片机的处理能力有限,只能控制少数几个电机。
专用步进电机驱动器是一种专门设计用于控制步进电机的驱动器。
它通常由集成电路组成,可以提供更高的输出电流和更丰富的控制功能。
专用驱动器可以根据输入信号的变化,实时调整输出电流和脉冲频率,从而实现更精确的控制。
此外,专用驱动器还可以提供保护功能,如过流保护和过热保护,以保证电机的安全运行。
在使用两相步进电机进行控制时,我们一般会采用开环控制和闭环控制两种方式。
开环控制是指根据预先设定的步进角度和速度,通过给驱动器输入相应的控制信号,使电机按照设定的步进角度转动。
这种控制方式简单直接,适用于一些对位置要求不是特别严格的场合。
闭环控制是指通过反馈系统实时监测电机的转动情况,并根据实际情况调整控制信号,使电机的转动更加准确。
闭环控制可以提高电机的定位精度和动态响应能力,适用于对位置要求较高的场合。
总结起来,两相步进电机的控制原理是通过驱动器给电机施加电流和控制信号,使电机按照预定的步进角度转动。
控制方式可以采用开环控制或闭环控制,具体根据应用场景的需求来选择。
关于STC15F2K60S2的PWM应用
关于STC15F2K60S2的PWM应⽤STC15F2K60S2芯⽚PWM的应⽤1.⽬的脉宽调制(PWM,Pulse Width Modulation)是⼀种使⽤程序来控制波形占空⽐、周期、相位波形的技术,在三相电机驱动、D/A转换等场合有⼴泛的应⽤。
STC15系列单⽚机的PCA模块可以通过设定各⾃的寄存器PCA_PWMn(n=0,1,2.下同)中的位EBSn_1/PCA_PWMn.7及EBSn_0/PCA_PWMn.6,使其⼯作于8位PWM或7位PWM 或6位PWM模式。
PCA⼯作模式寄存器的格式如下:当CIDL = 0时,空闲模式下PCA计数器继续⼯作;当CIDL = 1时,空闲模式下PCA计数器停⽌⼯作;CPS2、CPS1、CPS0:PCA计数脉冲源选择控制位。
,PWM的频率为SYSclk/256.如果要⽤系统时钟/3来作为PCA的时钟源,应选择T0的溢出作为CCP/PCA/PWM的时钟源,此时应让T0⼯作在1T模式,计数3个脉冲即产⽣溢出。
⽤T0的溢出可对系统时钟进⾏1~65536级分频(T0⼯作在16为重装载模式)。
ECF:PCA计数溢出中断使能位。
当ECF = 0时,禁⽌寄存器CCON中CF位的中断;当ECF = 1时,允许寄存器CCON中CF位的中断。
2.2.PCA控制寄存器CCONPCA控制寄存器的格式如下:寄存器的ECF位置位,则CF标志可⽤来产⽣中断。
CF位可通过硬件或软件置位,但只能通过软件清零。
CR:PCA计数器阵列运⾏控制位。
该位通过软件置位,⽤来启动计数器阵列计数。
该位通过软件清零,⽤来关闭PCA计数器。
CCF2:PCA模块2中断标志。
当出现匹配或捕捉时该位由硬件置位。
该位必须通过软件清零。
CCF1:PCA模块1中断标志。
当出现匹配或捕捉时该位由硬件置位。
该位必须通过软件清零。
CCF0:PCA模块0中断标志。
当出现匹配或捕捉时该位由硬件置位。
该位必须通过软件清零。
2.3.PCA⽐较/捕获寄存器CCAPM0、CCAPM1和CCAPM2PCA模块0的⽐较/捕获寄存器的格式如下:ECOM0:允许⽐较器功能控制位。
基于STC单片机无线控制的步进电机调速系统的设计
摘要步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。
在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。
使得在速度、位置等控制领域用步进电机来控制变的非常的简单。
步进电机的调速一般是改变输入步进电机的脉冲的转动一个固定的角度,这样就可以通过控制步进电机的一个脉冲到下一个脉冲的时间间隔来改变脉冲的频率,延时的长短来具体控制步进角来改变电机的转速,从而实现步进电机的调速。
在本设计方案中采用STC89C51型单片机内部的定时器改变定时器设定值从而实现对步进电机的转速进行控制,并通过无线控制实现电机调速与正反转的功能。
关键词:步进电机;单片机;调速系统;无线控制;液晶显示AbstractStep-by-step electric motor is the ring opening gating element changing electricity pulse signal into angular displacement or line displacement. Under the situation of must overload, the electric motor rotation rate , discontinuous location depend on pulse signal frequency and pulse number only , make free from being loaded with the effect changing ,but be that being added a pulse signal , the electric motor by electric motor is to have rotated a step spur angle. Feasible simplicity controlling a field using step-by-step electric motor to come to control changeable extraordinary in speed, location etc. Step-by-step electric motor speed regulation general be change import step-by-step electric motor pulse frequency come true step-by-step electric motor speed regulation, because of step-by-step electric motor every be given to a pulse right away rotate one fixed angle, such right away not bad pass under the control of step-by-step electric motor a pulse arrive at next pulse period come to change pulse frequency, Come to control the speed regulation , realizing step-by-step electric motor thereby to come to change the electric motor rotation rate step-by-step angle concretely the deferred length. Frequency adopt the internal timer of AT89C51 type monolithic machine to change CP pulse in the design plan in realizes the speed regulation controlling , realizing an electric motor and the function that the positive and negative rotates being in progress to step-by-step electric motor rotation rate thereby.Key words:Step-by-step Electric Motor; Monolithic Machine; Speed Regulation System; Wireless Controls; Liquid Crystal Display目录1 前言 (1)2 步进电机概述 (2)2.1 步进电机的特点 (2)2.2 步进电机的工作原理 (2)2.3 步进电机的技术参数 (3)2.4 步进电机详细调速原理 (4)3 硬件电路设计 (4)3.1 单片机的选择 (4)3.2 无线收发电路 (6)3.3 步进电机驱动电路 (7)3.4 液晶显示及矩阵键盘电路 (8)3.4.1 液晶显示模块概述 (8)3.4.2 外形尺寸 (9)3.5 液晶显示模块引脚功能 (9)3.6 液晶显示模块接口电路 (10)3.7 矩阵键盘 (10)4 系统软件设计 (13)4.1 显示子程序 (13)4.2 键盘子程序 (13)4.3 驱动程序 (15)4.4 正反转程序 (15)4.4.1正反转程序 (15)4.4.2转速快慢程序 (17)4.4.3定时中断程序 (18)5 实验结果与分析 (18)6 总结 (19)参考文献 (21)附录 (23)1 前言步进电机最早在1920年由英国人开发,1950年代后期晶体管的发明也逐渐应用在步进电机上.步进电动机的发展与计算机工业和数字控制技术密切相关,产品按结构划分有磁阻式、永磁式和混合型等多种形式.近年来,伴随着微电子技术大功率电力电子器件及驱动技术的进步,发达国家已普遍使用性能优越的混合式步进电机,最典型的产品是二相8极50齿的电动机,步距角1.8°/0.9°(全步/半步);还有五相10极50齿和一些转子100齿的二相和五相步进电动机,五相电动机主要用于运行性能较高的场合.驱动技术采用恒相电流与细分驱动相结合,使步进电机在中、小功率控制系统内的精度提高,并逐步向高速大功率应用领域渗透.步进电动机最大的生产国是日本,如日本伺服公司、东方公司、SANYO DENKI 和MINEBEA 及NPM 公司等,特别是日本东方公司,无论是电动机性能和外观质量还是生产手段,都是世界上最好的。
STC增强型51单片机利用PWM脉冲控制4个57步进电机的编程方法
IAP15W4K58S4单片机利用PWM脉冲控制4个步进电机的编程方法最近购入一块IAP15W4K58S4(图1)的STC单片机的最小系统,然后用它控制步进电机,步进电机驱动器为基于TB6600的MicroStep Driver(图2)驱动器。
为了能控制该驱动器,利用现有的单片机系统控制驱动器。
连接电路原理图如图3所示,图中Vcc=5V.图1 IAP15W4K58S4单片机最小系统图2 步进电机驱动器使IAP15W4K58S4单片机能够控制步进电机,首先需要产生PWM脉冲,本例子产生频率为1KHz,占空比为50%的脉冲,P2.1、P2.2、P2.3、P3.7口输出4路PWM脉冲。
生产PWM脉冲,单片机涉及到的寄存器(不考虑PWM中断)有P_SW2(端口配置寄存器)、PWMCFG(PWM配置寄存器,初始电平高低)、PWMCKS(PWM时钟选择寄存器)、由PWMCH(高7位)和PWMCL(低8位)组成的15位PWM计数器、由PWM n T1H、PWM n T1L和PWM n T2H、PWM n T2L组成的PWM脉冲翻转计数器(其中PWM n T1H、PWM n T1L组成第一次翻转15位计数器,其中PWM n T2H、PWM n T2L组成第二次翻转15位计数器,n取值范围为2、3、4、5、6、7)、PWM n CR(PWM n的控制寄存器,设置输出管脚选择和中断使能控制,n取值范围为2、3、4、5、6、7)和PWMCR(PWM控制寄存器,用于开启各个端口和PWM模块开关,该寄存器最后设置)。
由于生成PWM,需将I/O 口配置为准双向口或强推挽模式,所以还需配置P m M0和P m M1寄存器,m取值范围为0~3。
以上寄存器各个位配置可参考该单片机的数据手册,本项目的例程参考STC官方例程基础进行修改,如后文所述。
IAP15W4K58S4单片机的特殊功能寄存器区中要使用扩展的特殊功能寄存器需要配置P_SW2的bit7位,将其(bit7)置1。
步进电机的PWM控制
步进电机的PWM控制作者:马天才鲍小春来源:《速读·中旬》2017年第04期摘要:随着微电子和计算机技术的发展,步进电机的需求量与日俱增,在各个国民经济领域都有应用,所以步进电机的控制就显得尤为重要。
本文介绍了PWM向导控制的设定方法,并阐述利用PWM实现步进电机控制的系统设计。
关键词:步进电机;PWM;控制步进电机作为执行元件,是机电一体化的关键产品之一,广泛应用在各种自动化控制系统中。
随着微电子和计算机技术的发展,步进电机的需求量与日俱增,在各个国民经济领域都有应用,所以步进电机的控制就显得尤为重要。
步进电机的控制方法有很多种,比如PLS控制、运动向导控制等,在众多控制中,PWM控制具有它独特的优点。
一、控制要求步进电机选用KINCO公司的2S86Q-03080两相双极微步型电机,驱动器选用KINCO-2M530。
设置驱动器细分为10,输出相电流为3.0A。
按下正转启动按钮,步进电机顺时针旋转,转一圈用时5秒,按下反转启动按钮,步进电机逆时针旋转,转一圈用时10秒,并且步进电机在任何时刻都能够从正转变为反转或从反转变为正转,按下停止按钮,步进电机停止。
二、控制方案步进电机是一种将电脉冲转化为角位移或线位移的执行机构。
当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(即步进角)。
通过控制脉冲个数来控制角位移量或线位移量,从而达到准确定位的目的;通过控制脉冲频率来控制电机转动的速度,从而达到调速的目的。
驱动器细分为10,则设定DIP1=OFF、DIP2=OFF、DIP3=OFF、DIP4=ON,输出相电流为3.0A,则设定DIP6=OFF、DIP7=OFF、DIP8=ON。
2S86Q-03080型步进电机的步进角是1.8°,而驱动器细分为10,于是每来一个脉冲,步进电机旋转的角度为0.18°,旋转一圈就需要2000个脉冲。
旋转角=步进角/细分数=1.8°/10=0.18°旋转一圈脉冲数=2∏/旋转角=360°/0.18°=2000PWM输出周期=转一圈所需时间/转一圈所需脉冲数所以本步进电机正转时的PWM输出周期=2500us/脉冲,反转时的PWM输出周期=5000us/脉冲。
关于步进电机的PWM控制探讨
关于步进电机的PWM控制探讨摘要:步进电机是一种常用的机电元件,它以精确的开环控制在工业各领域都得到了广泛应用。
本文介绍了PWM向导控制的设定方法,并阐述利用PWM实现步进电机控制的系统设计。
关键词:步进电机;PWM;控制步进电机作为执行元件,是机电一体化的关键产品之一,广泛应用在各种自动化控制系统中。
随着微电子和计算机技术的发展,步进电机的需求量与日俱增,在各个国民经济领域都有应用,所以步进电机的控制就显得尤为重要。
步进电机的控制方法有很多种,比如PLS控制、运动向导控制等,在众多控制中,PWM控制具有它独特的优点。
一、步进电机的PWM控制要求步进电机选用KINCO公司的2S86Q-03080两相双极微步型电机,驱动器选用KINCO-2M530。
设置驱动器细分为10,输出相电流为3.0A。
按下正转启动按钮,步进电机顺时针旋转,转一圈用时5秒,按下反转启动按钮,步进电机逆时针旋转,转一圈用时10秒,并且步进电机在任何时刻都能够从正转变为反转或从反转变为正转,按下停止按钮,步进电机停止。
二、控制方案步进电机是一种将电脉冲转化为角位移或线位移的执行机构。
当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(即步进角)。
通过控制脉冲个数来控制角位移量或线位移量,从而达到准确定位的目的;通过控制脉冲频率来控制电机转动的速度,从而达到调速的目的。
驱动器细分为10,则设定DIP1=OFF、DIP2=OFF、DIP3=OFF、DIP4=ON,输出相电流为3.0A,则设定DIP6=OFF、DIP7=OFF、DIP8=ON。
2S86Q-03080型步进电机的步进角是1.8°,而驱动器细分为10,于是每来一个脉冲,步进电机旋转的角度为0.18°,旋转一圈就需要2000个脉冲。
旋转角=步进角/细分数=1.8°/10=0.18°旋转一圈脉冲数=2∏/旋转角=360°/0.18°=2000PWM输出周期=转一圈所需时间/转一圈所需脉冲数所以本步进电机正转时的PWM输出周期=2500us/脉冲,反转时的PWM输出周期=5000us/脉冲。
两相伺服电动机的控制方式
两相伺服电动机的控制方式
两相伺服电动机的控制方式主要有以下几种:
1. 位置控制:通过反馈装置(如编码器或霍尔传感器)检测电机的实际位置,并与给定的位置指令进行比较,然后根据误差信号调整电机的转速和转向,使其精确地达到目标位置。
2. 速度控制:根据给定的速度指令,调整电机的转速。
速度控制可以是开环控制,也可以是闭环控制,闭环控制通常使用测速发电机或编码器等反馈装置来检测电机的实际转速,并进行比较和调整。
3. 转矩控制:通过控制电机的转矩来实现对负载的精确控制。
转矩控制常用于需要对负载进行精密调节的应用,如张力控制、扭矩限制等。
4. 脉冲控制:两相伺服电动机可以接收脉冲信号进行控制。
控制系统发送一定频率和数量的脉冲给电机驱动器,驱动器根据脉冲的频率和数量来控制电机的转速和转向。
5. 模拟量控制:使用模拟信号(如电压或电流)来控制电机的转速、转矩或位置。
模拟量控制可以提供更平滑的控制效果,但通常需要更复杂的控制电路。
6. 通信控制:现代的两相伺服电动机可以通过各种通信接口(如串口、以太网等)与上位控制器进行通信,实现更高级的控制功能,如参数设置、故障诊断、远程控制等。
这些控制方式可以单独使用,也可以结合使用,以满足不同的应用需求。
在实际应用中,选择合适的控制方式需要考虑到被控对象的特性、控制要求、系统成本等因素。
基于STC单片机的经济型步进电机控制系统
/study基于STC 单片机的经济型步进电机控制系统 0 引言 步进电机是工业控制中应用十分广泛的一种电动机,它能将数字信号直接转换成角位移 或线位移,驱动速度和指令脉冲能严格同步,具有较高的定位精度,控制系统成本低廉,在 经济型数控机床等领域应用广泛。
这里针对电磁干扰较强以及要求低成本应用的场合,采用 超强抗干扰、小巧低功耗的工业级STC12C 系列单片机,充分利用单片机内部的硬件资源, 设计实用的步进电机控制和驱动系统。
1 控制系统总体方案设计 系统功能原理示意图如图1 所示。
在该系统中由单片机直接输出电机的各相控制脉冲序列,光耦进行必要的光电隔离,采 用分立元件构成功率.MOSFET 管驱动电路,带动电机转动。
键盘接口与LED 显示功能由具有SPI 串行接口功能的ZLG7289 实现。
既可使用按键输入的方式精确设置电机的工作方 式与转速,也可以通过调速旋钮实现电机转速的连续调节,还能通过上位机实现对电机工作 方式的调整与控制。
2 硬件电路设计2.1 控制电路设计控制芯片采用STC12C4052AD ,它是1 个时钟/机器周期的单片机,速度比普通的8051 单片机快8~12 倍,有20 个引脚且为小巧封装。
该单片机具有超强抗干扰,抗静电的特点, 能轻松通过4 kV 快速脉冲干扰,其功耗超低,正常工作模式下的典型功耗为2.7~7 mA 。
芯片自带硬件看门狗,具有高速SPI 通信端口,8 通道8 位A /D 转换,2 路PWM 输出,4 KB容量的FLASH 存储器,256 B 容量的SRAM ,4 个定时器,1 个全双工串行通信口。
由于单片机内部的资源丰富,性价比高,能够满足该设计的要求,而且减少了硬件电路的设计,提 高了工作效率。
单片机的外部引脚定义,及其在该设计中的资源分布如图2 所示。
诺德单片机学习资料/studyP1.4(ADC4)口外接4.7 k Ω的可调电位器,利用单片机内部的模/数转换功能转换 成数字量,进而控制输出脉冲频率,完成步进电机速度的“连续”调节。
基于STC89C52单片机的直流脉冲(PWM)调速及旋转方向控制系统设计讲解
rotates for each winding supplies electrical energy. Energized rotor winding and the stator
1.2.3电机驱动电路的设计.............................................................................................. 8
2系统软件设计............................................................................................................................. 9
.
摘要随着时代的进步和科技的发展 电机调速系统在工农业生产、交通运输以及日常
生活中起着越来越重要的作用。直流电机是通过两个磁场的相互作用而发生旋转的。
定子通过永磁体或受激励电磁铁产生一个固定磁场 转子由一系列绕组和导磁材料构
成 电流通过每个绕组时都会产生磁场。对有刷直流电机而言 转子上的换向器和定
子上的电刷在电机旋转时为每个绕组供给电能。通电转子绕组与定子磁体有相反的极
the current, and the. For the DC motor control is a challenge, because must be at work
during changing the speed of DC motor. The DC motor is the efficient operation of most
STC12C5A08S2直流电机PWM调速
课程设计说明书题目:直流电机pwm调速院(系):电子工程与自动化专业:智能科学与技术学生姓名:学号:指导教师:年月日摘要本文主要研究了利用STC12C系列单片机控制PWM信号从而实现对滞留电机转速进行控制的方法。
文章中采用了专门的芯片组成了PWM信号的发生系统,并且对PWM信号的原理,产生方法以及如何通过软件编程对PWM信号占空比进行调节,从而控制其输入信号波形等均作了详细的阐述。
此外,本文中还采用了IRF540和IRF9540搭建了H桥来驱动电机转动。
关键词: 直流电机调速;STC12C5A08S2;模糊PI;PWM;引言 (3)1 课程设计概述 (3)1.1 课程设计题目 (3)1.2 主要仪器设备 (3)2 硬件设计 (3)2.1 单片机部分 (3)2.2 串行接口部分 (4)2.3驱动电路部分 (5)3 软件设计 (5)3.1 流程设计 (5)3.1.1 速度控制主程序流程 (5)4 电机调速原理 (5)4.1 PWM原理 (6)4.2 PWM控制电机调速原理 (6)5 系统调试 (6)5.1 单片机程序仿真 (7)5.2 STC12C5A08S2单片机系统电路调试 (7)5.3 驱动电路调试 (8)5.4 系统调试......................................... 错误!未定义书签。
6总结与改进展望 (8)7 谢辞 (8)引言直流电机因具有良好的线性调速特性、效率高、控制简单、调速性能好及体积小等优点得到了广泛使用。
常规电机调速控制方法中,电机工作不稳定,损耗较大,尤其在低电压轻负荷时情况更为严重,且工作频率受电源频率的限制, 难以满足高精度的调速要求,不利于广泛推广[1]。
如何才能使电路具有成本低、控制精度高、调试修改参数方便,且能方便和灵活地适用于大功率、可靠性高的直流电机控制系统中,是我们研究的目的。
1 课程设计概述1.1 课程设计题目用单片机实现PWM信号产生和MOS管功率驱动,可通过键盘设置电机速度*附加要求:通过RS232或RS485接口与PC机通信,在PC机上进行参数显示和设置。
第14章 STC单片机增强型PWM发生器原理及应用(2)
增强型PWM发生器应用
-产生PWM波形
#definePWM5T1(*(unsigned int volatile xdata *)0xff30) #definePWM5T2(*(unsigned int volatile xdata *)0xff32) #definePWM5CR(*(unsigned char volatile xdata *)0xff34)
记为P2.2的插孔。 调整示波器的量程并观察结果。
增强型PWM发生器应用 -产生PWM波形
增强型PWM发生器应用
--产生互补PWM波形
两个互补PWM波形特征为:
PWM波形发生器为系统时钟的4分频; 波形由通道4和通道5输出; 周期为20个PWM时钟; 通道4的有效高电平为13个PWM时钟; 通道5的有效高电平为10个PWM时钟; 前端死区为2个PWM时钟,末端死区为1个PWM时钟。
(*(unsigned int volatile xdata *)0xfff0)
(*(unsigned char volatile xdata *)0xfff2)
增强型PWM发生器应用
-产生PWM波形
#definePWM2T1(*(unsigned int volatile xdata *)0xff00) #definePWM2T2(*(unsigned int volatile xdata *)0xff02) #definePWM2CR(*(unsigned char volatile xdata *)0xff04)
#definePWM7T1(*(unsigned int volatile xdata *)0xff50) #definePWM7T2(*(unsigned int volatile xdata *)0xff52) #definePWM7CR(*(unsigned char volatile xdata *)0xff54)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.57步进机电23HS66202.DM524 型细分型两相混合式步进机电驱动器3.STC12C5A60S2 系列单片机][程序一、二[程序一、二]通过计算机对单片机芯片的编程 ,将单片机与驱动器相连 ,从而实现对步进机电 的各种方式控制.1.根据所期望的结果编写程序,并在实验仪器上调试和验证.2.使用步近机电的工作原理与步进机电驱动器.3.学习控制步进机电转角、速度、方向的实时软件设计1.57步进机电23HS66202.DM524型细分型两相混合式步进机电驱动器,采用直流18~50V 供电,适合驱 动电压24V~50V, 电流小于4.0V,外径42~86毫米的两相混合式步进机电.此驱 动器采用交流伺服驱动器的电流环进行细分控制, 机电的转矩波动很小,低速 运行很平稳,几乎没有振动和噪音.高速时力矩也大大高于其它二相驱动器, 定位精度高.广泛合用于雕刻机、数控机床、包装机械等分辩率要求较高的设 备上.输入电流 输出电流湿 气 重小于4安培1.0A ~4.2A功耗: 80W ; 内部保险: 6A 工作温度-10~45℃; 存放温度-40℃~70℃不能结露,不能有水珠 禁止有可燃气体和导电灰尘200克〔1〕平均电流控制,两相正弦电流驱动输出〔2〕直流24~50V 供电 〔3〕光电隔离信号输入/输出〔4〕有过压、欠压、过流、相间短路保护功能 〔5〕十五档细分和自动半流功能 〔6〕八档输出相电流设置 〔7〕具有脱机命令输人端子 〔8〕高启动转速 〔9〕高速力矩大 〔10〕机电的扭矩与它的转速有关,而与机电每转的步数无关控制信号定义PLS/CW+ : PLS/CW-: DIR/CCW+: DIR/CCW-: 步进脉冲信号输入正端或者正向步进脉冲信号输入正端 步进脉冲信号输入负端或者正向步进脉冲信号输入负端步进方向信号输入正端或者反向步进脉冲信号输入正端 步进方向信号输入负端或者反向步进脉冲信号输入负端ENA+: 脱机使能复位信号输入正端 ENA- : 脱机使能复位信号输入负端输入电压 直流18~50V 输入耗度度 体 量功 温脱机使能信号有效时复位驱动器故障,禁止任何有效的脉冲,驱动器的输出功率元件被关闭, 机电无保持扭矩.控制信号连接上位机的控制信号可以高电平有效,也可以低电平有效.当高有效时,把所有控制信号的负 端连在一起作为信号地,低有效时,把所有控制信号的正端连在一起作为信号公共端. 现在以集电极开路和 PNP 输出为例 ,接口电路示意图如下: 控制器集电极开路输出图2.输入接口电路〔共阴极接法〕控制器 PNP 输出注意: VCC 值为5V 时,R 短接; VCC 值为12V 时,R 为1K,大于1/8W 电阻;VCC 值为24V 时,R 为2K,大于1/8W 电阻; R 必须接在控制器信号端.功能选择 〔用驱动器面板上的 DIP 开关实现〕 设置机电每转步数驱动器可将机电每转的步数分别设置为400、500、800、1000、1250、1600、2000、 2500 、3200 、4000 、5000 、6400 、8000 、10000 、12800步.用户可以通过驱动器 正面板上的拨码开关的 SW5、SW6、SW7、SW8位来设置驱动器的步数〔如表1〕:SW6状 态 SW7状 态 SW8状 态步数ONONON400 OF FONON800OF FONON160 0ONOF FON320 0ONOF FON640 0OF F OF FON128 00OF F OF FON256 00ONONOF F 100 0ONONOF F 200 0OF FONOF F 400 0OF FONOF F 500 0ONOF F OF F 800 0ONOF F OF F 100 00OF F OF F OF F 200 00OF F OF F OF F 250 00控制方式选择拨码开关 SW4位可设置成两种控制方式:当设置成"OFF"时,为有半流功能.当设置成"ON"时,为无半流功能. 设置输出相电流为了驱动不同扭矩的步进机电 ,用户可以通过驱动器面板上的拨码开关 SW1、 SW2 、SW3位来设置驱动器的输出相电流〔有效值〕单位安培 ,各开关位置对应 的输出电流,不同型号驱动器所对应的输出电流值不同.具体见表2.SW1 SW2 SW3PEAK RMS 输出电流<A>OF ONF SW5状态 OF FOF FOF FOF FOF FOF F OF FONONONONONONON ON ON 1.00 0.71OFF ON ON 1.46 1.04ON OFF ON 1.91 1.36OFF OFF ON 2.37 1.69ON ON OFF 2.84 2.03OFF ON OFF 3.31 2.36ON OFF OFF 3.76 2.69OFF OFF OFF 4.20 3.00半流功能半流功能是指无步进脉冲500ms 后,驱动器输出电流自动降为额定输出电流的70%,用来防止机电发热.+V、GND:连接驱动器电源+V:直流电源正级, 电源电压直流16~50V.最大电流是5A.GND:直流电源负级.A+ A- B+ B-:连接两相混合式步进机电驱动器和两相混合式步进机电的连接采用四线制, 机电绕组有并联和串联接法, 并联接法,高速性能好,但驱动器电流大<为机电绕组电流的1.73倍>,串联接法时驱动器电流等于机电绕组电流.周围要有20mm 的空间,不能放在其它发热的设备旁,要避免粉尘、油雾、腐蚀性气体,湿度太大与强振动场所.状态灯指示RUN:ERR:故障与排除绿灯,正常工作时亮.红灯,故障时亮, 机电相间短路、过压保护和欠压保护.LED 不亮机电不转,且无保持扭矩机电不转,但有保持扭矩机电转动方向错误机电扭矩太小电源接错电源电压低机电连线不对脱机使能RESET 信号有效无脉冲信号输入动力线相序接错方向信号输入不对相电流设置过小加速度太快机电堵转驱动器与机电不匹配检查电源连线提高电源电压改正机电连线使RESET 无效调整脉冲宽度与信号的电平互换任意两相连线改变方向设定正确设置相电流减小加速度值排除机械故障换合适的驱动器解决措施故障原因一个完整的步进机电控制系统应含有步进驱动器、直流电源以与控制器〔脉冲源〕 .以下为典型系统接线图:单片机 STC12C5A60S2 系列当PCA 计数值与模块的捕获/ 比较寄存器的值相匹配时, 如果TOG 位〔CCAPMn.2〕置位,模块CEXn 输出将发生翻转.当PCA 计数值与模块的捕获/ 比较寄存器的值相匹配时,如果匹配位MATn〔CCAPMn.3〕置位, CCON 寄存器的CCFn 位将被置位.CAPNn〔CCAPMn.4〕和CAPPn〔CCAPMn.5〕用来设置捕获输入的有效沿.CAPNn 位使能下降沿有效.CAPPn 位使能上升沿有效.如果两位都置位,则两种跳变沿都被使能,捕获可在两种跳变沿产生.通过置位CCAPMn 寄存器的ECOMn 位〔CCAPMn.6〕来使能比较器功能.每一个PCA 模块还对应此外两个寄存器CCAPnH 和CCAPnL.当浮现捕获或者比较时,它们用来保存16 位的计数值.当PCA 模块用在PWM 模式中时它们用来控制输出的占空比.脉宽调制<PWM Pulse Width Modulation>是一种使用程序来控制波形占空比、周期、相位波形的技术.CPS2、CPS1、CPS0:PCA 计数脉冲源选择控制位.当三者分别为0、1、0 时,选择PCA/PWM 时钟源输入为定时器0 的溢出频率. 由于定时器0 可以工作在1T 模式,所以可以达到计一个时钟就溢出,从而达到最高工作频率CPU 时钟SYSclk.通过改变定时器0 的溢出率,可以实现可调频率的PWM 输出.#include <REG51.H>#include <intrins.h>#define U8 unsigned char#define U16 unsigned intsbit key1=P1^0;sbit key2=P1^1;sbit key3=P1^5;sbit key4=P1^6;U8 table[4]={0xea,0xf2,0xfa,0xfc};U8 table1[4]={0xfc,0xfa,0xf2,0xea};U16 timer0=0;U16 j=0;void DelayMs<U8 ms>;void PWM_clock<U8 clock>;void PWM_start<U8 module,U8 mode>;////////////////////// 延时子程序/////////////////////////////void DelayMs<U8 ms> //在11.0592M 晶振下,stc10f 系列〔单周期指令〕的ms 级延时{U16 i;while<ms-->for<i = 0; i < 850; i++>;}}////////////////////主函数入口////////////////////////////sfr AUXR sfr CCON sfr CMOD sfr CCAPM0 = 0X8E;= 0xD8; //PCA 控制寄存器= 0xD9; //PCA 模式寄存器= 0xDA; //PCA 模块0 模式寄存器// 模块0 对应P1.3/CEX0/PCA0/PWM0<STC12C5A60S2 系列>sfr CCAPM1 = 0xDB; //PCA 模块 1 模式寄存器// 模块 1 对应P1.4/CEX1/PCA1/PWM1<STC12C5A60S2 系列>sfr CL sfr CH sfr CCAP0L sfr CCAP0H sfr CCAP1L sfr CCAP1H = 0xE9; //PCA 定时寄存器低位= 0xF9; //PCA 定时寄存器高位= 0xEA; //PCA 模块0 的= 0xFA; //PCA 模块0 的= 0xEB; //PCA 模块1 的= 0xFB; //PCA 模块1 的捕获寄存器捕获寄存器捕获寄存器捕获寄存器低位高位低位高位sfr PCA_PWM0 = 0xF2; //PCA PWM 模式辅助寄存器0 sfr PCA_PWM1 = 0xF3; //PCA PWM 模式辅助寄存器1sbit CF sbit CR sbit CCF1 sbit CCF0 = 0xDF;= 0xDE;= 0xD9;= 0xD8;//PCA 计数溢出标志位//PCA 计数器运行控制位//PCA 模块1 中断标志//PCA 模块0 中断标志//* CCAPOH = CCAPOL = 0XC0; //模块0 输出//* CCAPOH = CCAPOL = 0X80; //模块0 输出//* CCAPOH = CCAPOL = 0X40; //模块0 输出void PWM_clock<U8 clock>;void PWM_start<U8 module,U8 mode>; 占空因数为25%占空因数为50% 占空因数为75%/*****************************************************************************设置PWM 时钟信号来源函数参数:Clock0: 系统时钟/12<即12 分频>;1:系统时钟/2<即2 分频>;2:定时器0 的溢出脉冲;3: ECI/P1.2<或者P4. 1>脚输入的外部时钟;4:系统时钟<即不分频> ;5:系统时钟/4<即4 分频>;6:系统时钟/6<即6 分频>;7:系统时钟/8<即8 分频>;/*****************************************************************************/ void PWM_Clock<unsigned char clock>{if<clock==2>AUXR |= 0x80;//定时器0 时钟为Fosc,即1TTMOD|=0x02; //8 位自动重装载TH0=0xe1;//TR0=1;}CMOD |= <clock<<1>;//CMOD=0x84;CL = 0;CH = 0;}void PWM_Start<U8 module,U8 R0,U8 R1>{CCAP0L = 0XFF-<R0*256/100>;CCAP0H = 0XFF-<R0*256/100>;CCAP1L = 0XFF-<R1*256/100>;CCAP1H = 0XFF-<R1*256/100>;if<module==0>CCAPM0 = 0X42; //模块0 设置为8 位PWM 输出,无中断else if<module==1>CCAPM1 = 0X42; //模块1 设置为8 位PWM 输出,无中断else if<module==2>CCAPM0 = CCAPM1 = 0X42; //模块0 和1 设置为8 位PWM 输出,无中断CR=1; //PCA 计数器开始计数}void main<>{U8 keycode=0;U8 keycode1=0;PWM_Clock<2>; // PCA/PWM 时钟源为定时器0 的溢出PWM_Start<0,20,0>;// 模块0,设置为PWM 输出,无中断,初始占空因素为25% while<1>{if<key1==0>{while<key1==0>;EA=0;TR0=1;TH0=table[keycode];keycode++;if<keycode==4>keycode=0;}DelayMs<100>;if<key3==0>{while<key3==0>;TR0=1;EA=0;TH0=table1[keycode1];keycode1++;if<keycode1==4>keycode1=0;}DelayMs<100>;if<key2==0>{while<key2==0>;EA=1;ET0=1;TR0=1;TH0=0xD1;}}}void timer<> interrupt 1{++timer0;if<timer0==256>{++j;timer0=0;}if<j==3032>{j=0;TR0=0;}}#include <REG51.H>#include <intrins.h>#define U8 unsigned char#define U16 unsigned intsbit DIR=P1^5;sbit key1=P3^0;sbit key2=P3^1;sbit key3=P3^2;sbit key4=P3^3;U16 i=0;U8 keycode=0;U8 table[4]={0xea,0xf7,0xfa,0xfe}; // 调频void DelayMs<U8 ms>;void PWM_clock<U8 clock>;void PWM_start<U8 module,U8 mode>;////////////////////// 延时子程序/////////////////////////////void DelayMs<U8 ms> //在11.0592M 晶振下,stc10f 系列〔单周期指令〕的ms 级延时{U16 i;while<ms-->{for<i = 0; i < 850; i++>;}}////////////////////主函数入口////////////////////////////sfr AUXR sfr CCON sfr CMOD sfr CCAPM0 = 0X8E;= 0xD8; //PCA 控制寄存器= 0xD9; //PCA 模式寄存器= 0xDA; //PCA 模块0 模式寄存器// 模块0 对应P1.3/CEX0/PCA0/PWM0<STC12C5A60S2 系列>sfr CCAPM1 = 0xDB; //PCA 模块 1 模式寄存器// 模块 1 对应P1.4/CEX1/PCA1/PWM1<STC12C5A60S2 系列>sfr CL= 0xE9; //PCA 定时寄存器低位sfr CH= 0xF9; //PCA 定时寄存器高位sfr CCAP0L= 0xEA; //PCA 模块0 的捕获寄存器低位sfr CCAP0H= 0xFA; //PCA 模块0 的捕获寄存器高位sfr CCAP1L= 0xEB; //PCA 模块1 的捕获寄存器低位sfr CCAP1H = 0xFB; //PCA 模块1 的捕获寄存器高位sfr PCA_PWM0 = 0xF2; //PCA PWM 模式辅助寄存器0sfr PCA_PWM1 = 0xF3; //PCA PWM 模式辅助寄存器1sbit CF= 0xDF; //PCA 计数溢出标志位sbit CR= 0xDE; //PCA 计数器运行控制位sbit CCF1= 0xD9; //PCA 模块1 中断标志sbit CCF0 sbit ECCF0 = 0xD8;= 0xDA;//PCA 模块0 中断标志sbit ECF= 0xD9;sbit PWM0 = 0xD8;//* CCAPOH = CCAPOL = 0XC0; //模块0 输出占空因数为25% //* CCAPOH = CCAPOL = 0X80; //模块0 输出占空因数为50% //* CCAPOH = CCAPOL = 0X40; //模块0 输出占空因数为75% void PWM_clock<U8 clock>;void PWM_start<U8 module,U8 mode>;void PWM_Clock<unsigned char clock>{if<clock==2>{AUXR |= 0x80;//定时器0 时钟为Fosc,即1TTMOD|=0x02; //8 位自动重装载TH0=0xe1; //设定频率}CMOD |= 0x05;//<clock<<1>;CL = 0;CH = 0;//EA=1;}void PWM_Start<U8 module,U8 R0,U8 R1>{CCAP0L = 0XFF-<R0*256/100>;CCAP0H = 0XFF-<R0*256/100>;CCAP1L = 0XFF-<R1*256/100>;CCAP1H = 0XFF-<R1*256/100>;if<module==0>CCAPM0 = 0X42; //模块0 设置为8 位PWM 输出,无中断else if<module==1>CCAPM1 = 0X42; //模块1 设置为8 位PWM 输出,无中断else if<module==2>CCAPM0 = CCAPM1 = 0X42; //模块0 和1 设置为8 位PWM 输出,无中断}void main<>{PWM_Clock<2>;PWM_Start<0,20,0>; TR0=0;EA=1;while<1>// PCA/PWM 时钟源为定时器0 的溢出// 模块0,设置为PWM 输出,无中断,初始占空因素为25%{if<key1==0>{while<!key1>TR0=1;CR=1;i=0;CH =0x9c;}if<key2==0> // 0x9c// 0x38 200步数100{EA=0;TR0=1;CR=1;while<key2==0>;TH0=table[keycode]; //调频keycode++;if<keycode==4>keycode=0;}if<key3==0> //方向{while<!key3>DIR=0;}}DelayMs<100>;}void PCA_isr<> interrupt 7{i=i+1;CH=0x9c; // 0x9c 100 步数// 0x37 200CF=0;if<i==100> //100*4 200*125{CR=0;i=0;}}首先对各寄存器设定初值,选择工作模式,使PCA 计数频率为定时器0 的溢出率, 实现可调频率的PWM 输出.设定CCAP0H 和CCAP0L 与CL 和CH 的初值,当PCA 计数器的低位CL 从0xFF 递减到0x00 过程中,若值大于CCAP0L,则输出高电平, 否则为低电平,从而调节占空比.采用定时器0 的八位自动装载,通过给TH0 赋初值,改变PWM 的输出频率,从而控制机电的转速.在同一细分的条件下,频率越大,转速越快.将各初值对应的频率制成数表,通过按键1、3 调用数表,选择对应的频率,从而实现步进机电的加减速.步进机电的转向则是通过驱动器的DIR/CCW+<步进方向信号输入正端或者反向步进脉冲信号输入正端>和DIR/CCW- 〔步进方向信号输入负端或者反向步进脉冲信号输入负端〕来控制.[程序一]通过按键2 开启定时器0 的中断,在中断中对中断次数进行控制,实现PCA 的计数功能,通过PCA 的计数值,控制步进机电的转角.在同一频率下,对不同细分进行操作.例如,在400 细分下,设置379 个脉冲使步进机电转一圈.在800 细分下,则设置2*379=758 个脉冲实现转一圈. 以此类推,所有的实验结果均满足之前的假设. [程序二]通过按键1调用PCA 中断,通过设置CH0的初值,来改变PCA 的溢出率,在中断中记录PCA 的中断次数,从而进行对转角的调节.改变初值,来实现单步、多步的控制.通过按键2使机电进行4个不同频率的调速,频率的设置通过软件设定,变频的次数也可通过软件调节.通过按键3使机电的方向改变.程序可在400~25000细分下进行机电的单步,多步控制.在实验过程中,我们发现了一些数据与理论值有出入,故在此进行说明.1.歩距角:理论值是1.8度/步,但是实际实验中单步进行时,与理论值有偏差.2.令步进机电转一圈的准确度:这一现象取决于步进机电的歩距角、程序中按键的响应时间、步进机电本身启动等因素.通过本次课程设计,对步进机电的使用有了更深刻的了解.理清了PWM 输出频率与步进机电转速,驱动器细分与机电转角等的关系.实现了对步进机电的单步、多步、加速、减速、正转、反转的控制.通过自己编程,试验了不少种可能的方式, 保留了实用的方案,最终实现了对步进机电的控制.在找到最终可用方案之前,我们不仅要找出步进机电、编写的程序自身的规律,更要找出它们的内在联系.在这个过程中,我们不仅锻炼了自身读资料、整合知识和想法、编写程序的能力,更锻炼了团队协作的能力.根据电子设计大赛的训练题目学习步进机电的控制.。