STC系列PWM方式控制两相步进电机
STC系列PWM方式控制两相步进电机
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 输出频率与步进机电转速,驱动器细分与机电转角等的关系.实现了对步进机电的单步、多步、加速、减速、正转、反转的控制.通过自己编程,试验了不少种可能的方式, 保留了实用的方案,最终实现了对步进机电的控制.在找到最终可用方案之前,我们不仅要找出步进机电、编写的程序自身的规律,更要找出它们的内在联系.在这个过程中,我们不仅锻炼了自身读资料、整合知识和想法、编写程序的能力,更锻炼了团队协作的能力.根据电子设计大赛的训练题目学习步进机电的控制.。
基于STC12单片机做的PWM控制直流电机和角度传感器程序
s SCLK = P2 ^ 5;//时钟
sbit k1=P3^4;
sbit k2=P3^5;
//Function Definition函数声明
void Lcd_init(void);
#include <math.h> //Keil library
#include <stdio.h> //Keil library
//#define FOSC 18432000L
#define FOSC 11059200L //晶振11.0592M
#define BAUD 9600
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define uchar unsigned char
#define uint unsigned int
/*Declare SFR associated with the ADC */
/*sfr AUXR1 = 0XA2;
sfr ADC_CONTR = 0xBC; //ADC control register
void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s);
void LCD_Write_number(unsigned char s);
void Lcd_Mark2(void);
void Conut(void);
void delayms(unsigned int ms);
#define ADC_SPEEDLL 0x00 //420 clocks
基于单片机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 方式控制直流电机调速的方法就应运而生。
基于STC12C5A16S2单片机的PWM电机调速系统
控制科学与工程综合技术实验项目设计说明书项目:电机转速控制系统姓名:学号:xxxxxxxxxxxxxxxxxxxxx系xxxx年xx月xx日1 概述(系统基本功能描述)本项目主要介绍一种单片机实现直流电机闭环转速控制系统,该项目可以根据用户设定电机的转速,然后由单片机控制电机的转速在设定的范围内。
该项目分为上位机的软件实现和下位机的软硬件实现,在上位机上可以设定电机的转速和PID控制中的参数,下位机实现控制电机转速为设定值。
2 总体设计本系统以STC12C5A16S2单片机为核心,进行PWM斩波控制,以实现普通直流电机按设定速度运行。
其中利用光电开关检测普通直流电机的转速,通过信号放大和滤波电路,输出到单片机闭环系统对信号进行处理,达到上位机对直流电机设置的速度,并实时显示电机转速。
2.1 系统功能及技术指标(分类细化系统功能和技术指标)此单片机的直流闭环调速控制系统需要具有以下功能:1.上位机与单片机进行串口通信;2.通过上位机对直流电机的参数(速度)和控制参数(比例系数、积分系数、微分系数)设置;3.下位机能够产生直流信号驱动直流电动机;4.下位机实现对直流电机的速度控制;5.检测电路对直流电机的转速检测;6.实时在上位机显示直流电机的转速。
2.2 系统构成(尽量采取图示描述)电机转速控制系统主要由上位机及下位机构成。
上位机就是PC机,完成电机转速系统速度设定和控制参数的设定,实时显示电机的转速。
下位机由电源、检测单元,控制单元以及驱动电机单元组成。
如图2-1所示。
图2-1 电机转速控制系统结构框图2.3 主要设备及元器件选型(说明选择依据)电机转速控制系统主要的设备及元器件:综合训练1号电路板、STC12C5A60S2系列单片机、L298N 电机驱动芯片、7805电压转换芯片、光电开关、发光二极管、电阻、电容、串行通信线、普通直流电机。
2.4 系统核心处理策略(控制算法、信号处理方法等)电机转速控制系统采用自制光电传感器实时检测反馈脉冲信号,经单片机处理获得直流电机的实时速度,与给定速度比较得速度偏差e ;速度偏差e ,通过PID 算法计算获得所要求的PWM 占空比,形成PWM 控制电压驱动直流电动机运转,直至偏差e 为0,实现普通直流电机的速度调节。
基于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。
(仅供参考)控制步进电机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--;}}}。
基于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 Ω的可调电位器,利用单片机内部的模/数转换功能转换 成数字量,进而控制输出脉冲频率,完成步进电机速度的“连续”调节。
第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)
基于STC12C4052AD单片机电位器调节PWM控制微型直流电机无级调速实验
基于STC12C4052AD单片机电位器调节PWM控制微型直流电机无级调速实验用STC单片机做完电压表演示后,很想做一做STC片内A/D转换与PWM的联用,此前曾用过它的PWM功能,是双键控制LED发光管调光的应用,此次决定搞一次电位器调光/调速的实验;器材如下:1.STC12C4052AD单片机最小系统。
2.10K 可调电阻。
3.光驱出/进仓驱动微电机一只。
电路图如下:实验程序如下:/******************************************************************** **基于STC单片机的电位器调节微型直流电机无级调速演示程序---wannenggong 程序根据杜洋的程序模板改编由电位器获得直流变量经片内ADC进行A/D转换,转换值控制片内PWM驱动微电机********************************************************************* */#include <STC12C2052AD.H> //单片机头文件#include <intrins.h> //51基本运算(包括_nop_空函数)#define uchar unsigned char#define uint unsigned intuint M;sbit ON=P3^0;/*****************************************************************函数名:毫秒级CPU延时函数调用:DELAY_MS (?);参数:1~65535(参数不可为0)返回值:无结果:占用CPU方式延时与参数数值相同的毫秒时间备注:应用于1T单片机时i<600,应用于12T单片机时i<125/******************************************************************/void DELAY_MS (uint a){uint i;while( a-- != 0){for(i = 0; i < 600; i++);}}/******************************************************************* 函数名:8位A/D转换函数调用:? = Read ();参数:无返回值:8位的ADC数据结果:读出指定ADC接口的A/D转换值,并返回数值备注:适用于STC12C2052AD系列单片机(必须使用STC12C2052AD.h头文件)*******************************************************************/ uchar Read (uchar CHA){uchar AD_FIN=0; //存储A/D转换标志/******以下为ADC初始化程序****************************/CHA &= 0x07; //选择ADC的8个接口中的一个(0000 0111 清0高5位)ADC_CONTR = 0x40; //ADC转换的速度设定_nop_();ADC_CONTR |= CHA; //选择A/D当前通道_nop_();ADC_CONTR |= 0x80; //启动A/D电源DELAY_MS(1); //使输入电压达到稳定(1ms即可?/******以下为ADC执行程序****************************/ADC_CONTR |= 0x08; //启动A/D转换(0000 1000 令ADCS = 1)_nop_();_nop_();_nop_();_nop_();while (AD_FIN ==0){ //等待A/D转换结束AD_FIN = (ADC_CONTR & 0x10); //0001 0000测试A/D转换结束否}ADC_CONTR &= 0xE7; //1111 0111 清ADC_FLAG位, 关闭A/D 转换,return (ADC_DATA); //返回A/D转换结果(8位)}/**********PWM初始化函数****************************************/ void PWM_init (void){CMOD=0x02; //PCA工作模式设定CL=0x00; //PCA计数器低8位置0CH=0x00; //PCA计数器高8位置0CCAPM1=0x42; //设置为脉宽调节PWM方式(0100 0010)CCAP1L=0x00; //CCAP1L复位CCAP1H=0x00; //CCAP1H复位CR=1; //启动PCA定时器}/**********PWM1占空比赋值函数***********************************/ void PWM1_set (uchar a){//输出为可调方波CCAP1L=a; //CCAP1L赋值CCAP1H=a; //CCAP1H赋值}/****************************************************************函数名:主函数调用:无参数:无返回值:无结果:程序开始处,无限循环备注:****************************************************************/ void main (void){PWM_init ();P1M0 = 0x03; //P1.0/P1.1:0000 0011(高阻)P1M1 = 0x00; //P1.0/P1.1:0000 0000ON=1;while(1){if(ON==0) //STC软件下载提示信号检测{ISP_CONTR=0x60;} //从STC的ISP区开始运行程序的软件复位设置else{M=Read(0); //P1.0口模拟量转换PWM1_set(M); //转换结果为PWM赋值}}}结果与结论:经实验,调整KW,电机由停止到最高转速可以平滑过渡,若将电机换成LED则可均匀调光。
关于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:允许⽐较器功能控制位。
基于STC12C5A16S2单片机的PWM电机调速系统
控制科学与工程综合技术实验项目设计说明书项目:电机转速控制系统姓名:学号:xxxxxxxxxxxxxxxxxxxxx系xxxx年xx月xx日1 概述(系统基本功能描述)本项目主要介绍一种单片机实现直流电机闭环转速控制系统,该项目可以根据用户设定电机的转速,然后由单片机控制电机的转速在设定的范围内。
该项目分为上位机的软件实现和下位机的软硬件实现,在上位机上可以设定电机的转速和PID控制中的参数,下位机实现控制电机转速为设定值。
2 总体设计本系统以STC12C5A16S2单片机为核心,进行PWM斩波控制,以实现普通直流电机按设定速度运行。
其中利用光电开关检测普通直流电机的转速,通过信号放大和滤波电路,输出到单片机闭环系统对信号进行处理,达到上位机对直流电机设置的速度,并实时显示电机转速。
2.1 系统功能及技术指标(分类细化系统功能和技术指标)此单片机的直流闭环调速控制系统需要具有以下功能:1.上位机与单片机进行串口通信;2.通过上位机对直流电机的参数(速度)和控制参数(比例系数、积分系数、微分系数)设置;3.下位机能够产生直流信号驱动直流电动机;4.下位机实现对直流电机的速度控制;5.检测电路对直流电机的转速检测;6.实时在上位机显示直流电机的转速。
2.2 系统构成(尽量采取图示描述)电机转速控制系统主要由上位机及下位机构成。
上位机就是PC机,完成电机转速系统速度设定和控制参数的设定,实时显示电机的转速。
下位机由电源、检测单元,控制单元以及驱动电机单元组成。
如图2-1所示。
图2-1 电机转速控制系统结构框图2.3 主要设备及元器件选型(说明选择依据)电机转速控制系统主要的设备及元器件:综合训练1号电路板、STC12C5A60S2系列单片机、L298N 电机驱动芯片、7805电压转换芯片、光电开关、发光二极管、电阻、电容、串行通信线、普通直流电机。
2.4 系统核心处理策略(控制算法、信号处理方法等)电机转速控制系统采用自制光电传感器实时检测反馈脉冲信号,经单片机处理获得直流电机的实时速度,与给定速度比较得速度偏差e ;速度偏差e ,通过PID 算法计算获得所要求的PWM 占空比,形成PWM 控制电压驱动直流电动机运转,直至偏差e 为0,实现普通直流电机的速度调节。
基于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
用STC12C5404AD的遥控直流电机PWM调速系统设计
用STC12C5404AD的遥控直流电机PWM调速系统设计摘要介绍了遥控比例航机专用集成电路的软件解码,围绕单片机的选择、硬件电路设计、STC12C5404AD的功能,对接收到的编码信号进行抗干扰处理和分析解码,通过单片机的PWM功能来控制直流电机的调速换向,并成功应用于遥控船上,探测所在位置河底的形态和深度等参数。
目录前言PWM(Pulse-Width Modulation)调速装置是利用大功率晶体管的开关特性[1,按一个固定的频率不同占空比接通和断开电源,改变直流电动机上电压的大小,从而控制电动机的转速。
PWM控制技术以其控制简单、灵活和动态响应好的优点而成为电力电子技术广泛应用的控制方式,也为高性能的直流电机数字化控制提供了基础。
本文介绍一种采用标准比例的遥控设备,远距离无线遥控直流电机的转速、方向。
由于采用了遥控比例航机专用集成电路,通过单片机软件解码,同时通过技术处理分析去除干扰数据,整个电路具有结构简单、调试容易、可靠性高和抗干扰能力强等特点,适用于视距范围内小型机器人的运动控制及野外设备的远距离控制。
1单片机选择考虑到软件解码,对指示灯的控制,采集电源的电压具有PWM输出功能,采用STC公司生产的STC12C5404AD[2],该单片机是高速、低功耗、超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051。
标准的8051每个机器周期为12时钟,增强型的STC12系列单片机为单时钟/机器周期,工作频率的范围是0~35MHz,平均指令运算速度比标准的8051快8~12倍,加上工作频率可到35 MHz,比12 MHz的标准8051综合要快接近30倍,2个定时/计数器,工作速度比标准8051计数快12倍,这些参数有利于提高解码的速度。
该单片机内部集成了4路PWM,只要设置好相关参数,它可以独立工作,不会影响到单片机的其它部分,对电机进行PWM控制,8路高速10位AD转换器,转换速度为100 KHz。
基于STC89C52单片机的步进电机控制系统设计说明
电气与电子信息工程学院《单片机》课程设计报告题目:基于STC89C52单片机的步进电机控制系统设计专业班级:电气工程及其自动化学号:姓名:指导教师:设计时间:设计地点:单片机课程设计成绩评定表指导教师签字:2013 年 12 月日课程设计任务书2013~2014 学年第 1 学期专业班级:指导教师:工作部门:一、课程设计题目单片机课程设计二、课程设计内容(含技术指标)1.设计目的及要求(1)根据具体设计课题的技术指标和给定条件,以单片机为核心器件,能独立而正确地进行方案论证和电路设计,完成仿真操作。
要求概念清楚、方案合理、方法正确、步骤完整;(2)熟悉、掌握各种外围接口电路芯片的工作原理和控制方法;(3)熟练使用单片机汇编语言或C51进行软件设计;(4)熟练使用Proteus、Keil软件进行仿真电路测试;(5)熟练使用Protel软件设计印刷电路板;(6)学会查阅有关参考资料和手册,并能正确选择有关元器件和参数;(7)编写设计说明书,参考毕业设计论文格式撰写设计报告。
2.设计内容(题目名称:基于STC89C52单片机的步进电机控制系统设计)步进电机是一种进行精确步进运动的机电执行元件,它广泛应用于工业机械的数字控制,为使系统的可靠性、通用性、可维护性以及性价比最优,根据控制系统功能要求及步进电机应用环境,确定了设计系统硬件和软件的功能划分,从而实现了基于8051单片机的四相步进电机的开环控制系统。
控制系统通过单片机存储器、I/O接口、中断、键盘、LED显示器的扩展、步进电机的环形分频器、驱动及保护电路、人机接口电路、中断系统及复位电路、单电压驱动电路等的设计,实现了四相步进电机的正反转,加速及减速等功能。
三、课程设计考核办法与成绩评定根据过程、报告、答辩等确定设计成绩,成绩分优、良、中、及格、不及格五等。
2013年11月一、方案论证1.1 设计任务及要求①以AT89C52芯片为核心,实现四线四相步进电机的正转、反转、加速以及减速功能。
基于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 公司等,特别是日本东方公司,无论是电动机性能和外观质量还是生产手段,都是世界上最好的。
使用STC12系列单片机把PWM控制芯片SG3525和保护电路进行线路连接能够输出SPWM波。
怎样使用STC12系列单片机,把PWM控制芯片SG3525、保护电路进行线路连接,能够输出SPWM波2010-12-16 14:51使用STC12系列单片机,把PWM控制芯片SG3525、保护电路进行线路连接,能够输出SPWM波。
4.22 STC系列单片机生成SPWM波原理以STCl2C5410AD为例,有四路可编程计数器阵列PCA/PWM。
PCA含有一个特殊的16位定时器,有4个16位的捕获/比较模块与之相连。
四个模块的公共时间基准由PCA定时器决定,可以通过PCA模式寄存器CMOD SFR的CPSl和CPS0位确定。
每个模块可编程工作在4种模式下:上升/下降沿捕获、软件定时器、高速输出或PWM脉冲输出。
文中SPWM生成功能主要靠PWM脉冲输出模式完成。
4.23SPWM波生成方法利用STC系列单片机产生SPWM波的基本原理是:将载波周期数值赋给PCA 模块l的16位捕获/比较模块寄存器CCAPlH(高8位)和CCAPlL(低8位),PCA定时器的值CH(高八位)、CL(低八位)与模块捕获寄存器的值相比较,当两者相等时,产生PCA中断。
在中断中,调用模块0的PWM脉宽调节模式,将下一个SPWM波的脉宽通过CCAP0H装载到CCAPOL中,这样就可以实现无干扰的更新PWM。
六、PWM控制芯片SG35256.1结构和原理框图:1.Inv.input(引脚1):误差放大器反向输入端。
在闭环系统中,该引脚接反馈信号。
在开环系统中,该端与补偿信号输入端(引脚9)相连,可构成跟随器。
2.Noninv.input(引脚2):误差放大器同向输入端。
在闭环系统和开环系统中,该端接给定信号。
根据需要,在该端与补偿信号输入端(引脚9)之间接入不同类型的反馈网络,可以构成比例、比例积分和积分等类型的调节器。
3.Sync(引脚3):振荡器外接同步信号输入端。
该端接外部同步脉冲信号可实现与外电路同步。
4.OSC.Output(引脚4):振荡器输出端。
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/脉冲。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机课程设计步进电机控专业班级:姓名:学号:指导教师:目录一.课程设计要求二.课程设计目的三.所用仪器及相关说明1.5 7步进电机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- :脱机使能复位信号输入负端脱机使能信号有效时复位驱动器故障,禁止任何有效的脉冲,驱动器的输出功率元件被关闭,电机无保持扭矩。
控制信号连接上位机的控制信号可以高电平有效,也可以低电平有效。
当高有效时,把所有控制信号的负端连在一起作为信号地,低有效时,把所有控制信号的正端连在一起作为信号公共端。
现在以集电极开路和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状OF OF OF OF OF OF OF OF 态ON ON ON ON ON ON ONF F F F F F F F SW7 状ON ON ON OF OF OF OF ON ON ON ON OF OF OF OF态 F F F F F F F F SW8状OF OF OF OF OF OF OF OF ON ON ON ON ON ON ON态 F F F F F F F F 步数400 800 160 320 640 128 256 100 200 400 500 800 100 200 2500 0 0 00 00 0 0 0 0 0 00 00 00 控制方式选择拨码开关SW4位可设置成两种控制方式:当设置成“OFF”时,为有半流功能。
当设置成“ON”时,为无半流功能。
设置输出相电流为了驱动不同扭矩的步进电机,用户可以通过驱动器面板上的拨码开关SW1、SW2、SW3位来设置驱动器的输出相电流(有效值)单位安培,各开关位置对应的输出电流,不同型号驱动器所对应的输出电流值不同。
具体见表2。
SW1 SW2 SW3 PEAK RMSON 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 无效调整脉冲宽度及信号的电平互换任意两相连线改变方向设定电机扭矩太小加速度太快减小加速度值驱动器与电机不匹配换合适的驱动器3. 单片机STC12C5A60S系2 列PWM CCAPMn.1当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 )脉宽调制(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 int sbit 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 = 0X8E;sfr CCON = 0xD8; //PCA 控制寄存器sfr CMOD = 0xD9; //PCA 模式寄存器sfr CCAPM0P1.3/CEX0/PCA = 0xDA; //PCA0/PWM0(STC12C5A60S2模块系列)0 模式寄存器// 模块0 对应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 模式辅助寄存器 1 sbit CF = 0xDF; //PCA 计数溢出标志位sbit CR = 0xDE; //PCA 计数器运行控制位sbit CCF1 = 0xD9; //PCA 模块 1 中断标志sbit CCF0 = 0xD8; //PCA模块0 中断标志//* 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);/***************************************************************************** 设置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 int sbit 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 = 0X8E; sfr CCON= 0xD8; //PCA 控制寄存器sfr CMOD = 0xD9; //PCA 模式寄存器 sfr CCAPM0 P1.3/CEX0/PCA = 0xDA; //PCA 0/PWM0(STC12C5A60S2 模块 系列 )0 模式 寄 存器 // 模 块 0 对 应 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 模式辅助寄存器 0 sfr PCA_PWM1 = 0xF3; //PCA PWM 模式辅助寄存器 1sbit 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);sbit CF = 0xDF; //PCA 计数溢出标志位 sbit CR = 0xDE;//PCA 计数器 运行控制位 sbit CCF1= 0xD9; //PCA模块 1 中断标志 sbit CCF0 = 0xD8; //PCA 模块 0 中断标志= 0xDA;sbit ECCF0 sbit ECF= 0xD9;void PWM_Clock(unsigned char clock) {if(clock==2){AUXR |= 0x80;// 定时器0时钟为Fosc,即1T TMOD|=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); // PCA/PWM 时钟源为 定时器 0 的溢出 PWM_Start(0,20,0); // 模块 0,设置为 PWM 输出,无中断 ,初始占空因素为 25% TR0=0; EA=1;}if(key2==0){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);while(1){if(key 1==0) {while(!key 1)TR0=1;CR=1;i=0;CH =0x9c;// 0x9c 100// 0x38 200步数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 输出。