版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、一、/*关于频率和占空比的确定,对于12M晶振,假定PWM输出频率为1KHZ,这样定时中断次数 * *设定为C=10,即0.01MS中断一次,则TH0=FF,TL0=F6;由于设定中断时间为0.01ms,这样* *可以设定占空比可从1-100变化。即0.01ms*100=1ms * */ #include #define uchar unsigned char /* * TH0和TL0是计数器0的高8位和低8位计数器,计算办法:TL0=(65536-C)%256; * * TH0=(65536-C)/256,其中C为所要计数的次数即多长时间产生一次中断;TMOD是计数器* * 工作模式选择,0
2、X01表示选用模式1,它有16位计数器,最大计数脉冲为65536,最长时 * * 间为1ms*65536=65.536ms * */ #define V_TH0 0XFF #define V_TL0 0XF6 #define V_TMOD 0X01 void init_sys(void); /*系统初始化函数*/ void Delay5Ms(void); unsigned char ZKB1,ZKB2; void main (void) init_sys(); ZKB1=40; /*占空比初始值设定*/ ZKB2=70; /*占空比初始值设定*/ while(1) if (!P1_1) /如果
3、按了+键,增加占空比 Delay5Ms(); if (!P1_1) ZKB1+; ZKB2=100-ZKB1; if (!P1_2) /如果按了-键,减少占空比 Delay5Ms(); if (!P1_2) ZKB1-; ZKB2=100-ZKB1; /*对占空比值限定范围*/ if (ZKB199) ZKB1=1; if (ZKB1=100) click=0; if (click=ZKB1) /*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/ P1_3=0; else P1_3=1; if (click=ZKB2) P1_4=0; else P1_4=1; 要不要考虑
4、定时太短,中断服务程序还没有执行完?二 、/#includeunsigned int a, b;/-void time0() interrupt TF0_VECTOR TL0 = (65536-50000)%256; TH0 = (65536-50000)/256; /50ms12MHz a+; if(a=20) a=0; /在这里调整周期. else if(ab) P2 = 0xff; /在这里调整占空比. else P2 = 0x00; P0 = (b / 10) 19) b = 19; /占空比等级最大为19/-void X1_INT() interrupt IE1_VECTOR b-;
5、 if(b 1) b = 1; /占空比等级最小为1./-void main() TMOD = 0x01; /T0定时方式1 TH0 = (65536-50000) / 256; /50ms12MHz TL0 = (65536-50000) % 256; TR0 = 1; ET0 = 1; EX0 = 1; EX1 = 1; IT0 = 1; IT1 = 1; EA = 1; a = 0; b = 10; while(1) ; 三、/*/* 程序名:PWM直流电机调速 */* 晶振:11.00592 MHz CPU型号:AT89C51 */* 直流电机的PWM波控制,可以直接的调速从0到20级
6、的调速 */*/ #include#define TH0_TL0 (65536-1000)/设定中断的间隔时长unsigned char count0 = 50;/低电平的占空比unsigned char count1 = 0;/高电平的占空比bit Flag = 1;/电机正反转标志位,1正转,0反转sbit Key_add=P2 0; /电机减速sbit Key_dec=P2 1; /电机加速sbit Key_turn=P2 2; /电机换向sbit PWM1=P26;/PWM 通道 1,反转脉冲sbit PWM2=P27;/PWM 通道 2,正转脉冲unsigned char Time_
7、delay;/*函数声明*/void Delay(unsigned char x);void Motor_speed_high(void);void Motor_speed_low(void);void Motor_turn(void);void Timer0_init(void);/*延时处理*/void Delay(unsigned char x)Time_delay = x;while(Time_delay != 0);/等待中断,可减少PWM输出时间间隔/*按键处理加pwm占空比,电机加速*/void Motor_speed_high(void)/if(Key_add=0) Delay
8、(10); if(Key_add=0) count0 += 5; if(count0 = 100) count0 = 100; while(!Key_add);/等待键松开/*按键处理减pwm占空比,电机减速*/void Motor_speed_low(void)if(Key_dec=0) Delay(10); if(Key_dec=0) count0 -= 5; if(count0 = 0) count0 = 0; while(!Key_dec ); /*电机正反向控制*/void Motor_turn(void)if(Key_turn = 0) Delay(10); if(Key_turn
9、 = 0) Flag = Flag; while(!Key_turn);/*定时器0初始化*/void Timer0_init(void)TMOD=0x01; /定时器0工作于方式1TH0=TH0_TL0/256;TL0=TH0_TL0%256;TR0=1;ET0=1;EA=1;/*主函数*/void main(void)Timer0_init();while(1) Motor_turn(); Motor_speed_high(); Motor_speed_low();/*定时0中断处理*/void Timer0_int(void) interrupt 1 using 1TR0 = 0;/设置
10、定时器初值期间,关闭定时器TL0 = TH0_TL0 % 256;TH0 = TH0_TL0 / 256 ;/定时器装初值TR0 = 1;if(Time_delay != 0)/延时函数用 Time_delay-; if(Flag = 1)/电机正转 PWM1 = 0; if(+count1 = 100) count1=0; else /电机反转 PWM2 = 0; if(+count1 = 100) count1=0; /四、/【转】 基于STC12C4052AD单片机电位器调节PWM控制微型直流电机无级调速实验2011-09-16 13:49转载自 分享最终编辑 wannenggong用S
11、TC单片机做完电压表演示后,很想做一做STC片内A/D转换与PWM的联用,此前曾用过它的PWM功能,是双键控制LED发光管调光的应用,此次决定搞一次电位器调光/调速的实验;器材如下:1.STC12C4052AD单片机最小系统。2.10K可调电阻。3.光驱出/进仓驱动微电机一只。电路图如下:实验程序如下:/*基于STC单片机的电位器调节微型直流电机无级调速演示程序-wannenggong程序根据杜洋的程序模板改编由电位器获得直流变量经片内ADC进行A/D转换,转换值控制片内PWM驱动微电机*/#include /单片机头文件#include /51基本运算(包括_nop_空函数)#define
12、uchar unsigned char#define uint unsigned intuint M;sbit ON=P30;/*函数名:毫秒级CPU延时函数调 用:DELAY_MS (?);参 数:165535(参数不可为0)返回值:无结 果:占用CPU方式延时与参数数值相同的毫秒时间备 注:应用于1T单片机时i600,应用于12T单片机时i125/*/void DELAY_MS (uint a)uint i;while( a- != 0)for(i = 0; i 600; i+);/*函数名:8位A/D转换函数调 用:? = Read ();参 数:无返回值:8位的ADC数据结 果:读出指
13、定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); /使输入电压达
14、到稳定(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 (v
15、oid)CMOD=0x02; /PCA工作模式设定 CL=0x00;/PCA计数器低8位置0 CH=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 m
16、ain (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区开始运行程序的软件复位设置elseM=Read(0);/P1.0口模拟量转换PWM1_set(M);/转换结果为PWM赋值结果与结论:经实验,调整KW,电机由停止到最高转速可以平滑过渡,若将电机换成LED则可均匀调光。用于电机调速时,由于电机的最小启动电压的限制,5V系统中只能在1.8V/4.8
17、V之间调节,由此看来,实际应用时,务必要选择具有减速机构的直流电机才有价值,另外,此实验只是在电机无负荷状态下进行的演示,实际应用时,有必要加入速度反馈系统,进行闭环控制,才能得到真实结果,至于反馈信号的获得,有磁电式、光电式、霍尔元件等等方法很多,在此就不细究了,至此,这片STC芯片的主要功能应用实验就告一段落了。程序发现问题,欢迎切磋。如若实验,粘贴/编译即可,若实际应用还应全面考量,如涉及实际应用系统设计及问题,恕本人爱莫能助。/五、/.PWM定义脉冲宽度调制(PWM)是英文“Pulse Width Modulation”的缩写,简称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控
18、制的一种非常有效的技术,广泛应用于测量,通信,功率控制与变换等许多领域。脉冲宽度调制(PWM)是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。2.PWM控制的基本原理理论基础:冲量相等而形状不同的窄脉冲加在具有惯性的环节上
19、时,其效果基本相同。冲量指窄脉冲的面积。效果基本相同,是指环节的输出响应波形基本相同。低频段非常接近,仅在高频段略有差异。图1形状不同而冲量相同的各种窄脉冲面积等效原理: 分别将如图1所示的电压窄脉冲加在一阶惯性环节(R-L电路)上,如图2a所示。其输出电流i(t)对不同窄脉冲时的响应波形如图2b所示。从波形可以看出,在i(t)的上升段,i(t)的形状也略有不同,但其下降段则几乎完全相同。脉冲越窄,各i(t)响应波形的差异也越小。如果周期性地施加上述脉冲,则响应i(t)也是周期性的。用傅里叶级数分解后将可看出,各i(t)在低频段的特性将非常接近,仅在高频段有所不同。图2冲量相同的各种窄脉冲的响
20、应波形3. PWM相关概念占空比:就是输出的PWM中,高电平保持的时间 与 该PWM的时钟周期的时间之比如,一PWM的频率是1000Hz,那么它的时钟周期就是1ms,如果高电平出现的时间是200us,那么低电平的时间肯定是800us,那么占空比就是200:1000,也就是说PWM的占空比就是1:5。分辨率:占空比最小能达到的值,如8位的PWM,理论的分辨率就是1:255(单斜率), 16位的的PWM理论就是1:65535(单斜率)。频率:如16位的PWM,它的分辨率达到了1:65535,要达到这个分辨率,T/C就必须从0计数到65535才能达到。相对于周期就是65535*计数脉冲时间。双斜率
21、/ 单斜率:假设一个PWM从0计数到80,之后又从0计数到80. 这个就是单斜率。假设一个PWM从0计数到80,之后是从80计数到0. 这个就是双斜率。可见,双斜率的计数时间多了一倍,所以输出的PWM频率就慢了一半,但是分辨率却是1:(80+80) 1:160,就是提高了一倍。假设PWM是单斜率,设定最高计数是80,我们再设定一个比较值是10,那么T/C从0计数到10时(这时计数器还是一直往上计数,直到计数到设定值80),单片机就会根据你的设定,控制某个IO口在这个时候是输出1还是输出0还是端口取反,这样,就是PWM的最基本的原理了。4.单片机产生PWM4.1:单片机控制开关电源方式单片机控制
22、开关电源,单从对电源输出的控制来说,可以有几种控制方式.其一是单片机输出一个电压(经DA芯片或PWM方式),用作电源的基准电压.这种方式仅仅是用单片机代替了原来的基准电压,可以用按键输入电源的输出电压值,单片机并没有加入电源的反馈环,电源电路并没有什么改动.这种方式最简单.其二是单片机扩展AD,不断检测电源的输出电压,根据电源输出电压与设定值之差,调整DA的输出,控制PWM芯片,间接控制电源的工作.这种方式单片机已加入到电源的反馈环中,代替原来的比较放大环节,单片机的程序要采用比较复杂的PID算法.其三是单片机扩展AD,不断检测电源的输出电压,根据电源输出电压与设定值之差,输出PWM波,直接控
23、制电源的工作.这种方式单片机介入电源工作最多.第三种方式是最彻底的单片机控制开关电源,但对单片机的要求也最高.要求单片机运算速度快,而且能够输出足够高频率的PWM波.这样的单片机显然价格也高.4.2:使用单片机产生PWMMCS51单片机假设51单片机晶振频率为12MHz。51单片机内部含有两个16位可编程定时器/计数器,可设置计数器位数16位,13位,8位计数器位数16,振荡周期12分频后脉冲计数,则计数一次为1us,每个PWM周期为65536us,频率为1*/65536=15Hz。频率太低,导致开关电源严格的电惯性。计数器位数13,振荡周期12分频后脉冲计数,则计数一次为1us,每个PWM周
24、期为8192us,频率为1*/8192=122Hz。音频范围之内,不可忍受。计数器位数8,振荡周期12分频后脉冲计数,则计数一次为1us,每个PWM周期为256us,频率为1*/256=3906Hz。音频范围之内,且频率远远低于现阶段开关电源的频率范围。AVR单片机AVR单片机采用精简指令集,时钟频率最高为16MHz。如果PWM分辨率为10位,那么PWM波的频率也就是开关电源的工作频率为/1024=15625(Hz)。在音频范围之内,且开关电源工作在这个频率下显然不够。取PWM分辨率为9位,这次开关电源的工作频率为/512=32768(Hz),在音频范围外,可以用,但距离现代开关电源的工作频率
25、还有一定距离.不过必须注意,9位分辨率是说功率管导通-关断这个周期中,可以分成512份,单就导通而言,假定占空比为0.5,则只能分成256份.考虑到脉冲宽度与电源的输出并非线性关系,需要至少再打个对折,也就是说,电源输出最多只能控制到1/128,无论负载变化还是网电源电压变化,控制的程度只能到此为止.还要注意,上面所述只有一个PWM波,是单端工作.如果要推挽工作(包括半桥),那就需要两个PWM波,上述控制精度还要减半,只能控制到约1/64.对要求不高的电源例如电池充电,可以满足使用要求,但对要求输出精度较高的电源,这就不够了.综上所述,AVR单片机只能很勉强地使用在直接控制PWM的方式中.综上
26、,使用单片机产生PWM波形是远远不够的,因此个人觉得单片机参与的开关电源完全可以胜任第二种工作方式,单片机一方面完成开关芯片的PID控制,一方面完成人机接口。/六、/其实用一个定时器就够了,外部中断接按键,一个用来频率加,一个用来频率减,即做调节频率用,8路频率从P0口输出,定时器产生中断,比如1us,那么我到1us时对P0.0取反,同时中断里在定义一个变量t1,那么t1计中断次数,假如计到5时我让P1.0取反,儿至于计到几有外部中断来定义,比如定义一个全局变量f,INT0按一次则f+,INT1S按一次f- -,如此频率得以控制,定时器处理如下: void TIME0_ISR(void) in
27、terrupt 2 t1+; if(t1=f) p00=p00; if(t1=f) p01=p01; if(t1=f) p02=p02; if(t1=f) p03=p03; if(t1=f) p04=p04; if(t1=f) p05=p05; if(t1=f) p06=p06; if(t1=f) p07=p07; f=0; 当然这只是简单的用51本身资源产生而已,还可以用专门的外围电路来实现,我给你一个四路频率产生程序,思想如上,已验证过/*四路频率产生器*/#include#define uchar unsigned char#define uint unsigned int/*常量定义*
28、/sbit pwm1=P10; /第一路频率 1s内产生5000个脉冲sbit pwm2=P11; /第二路频率 1s内产生1000个脉冲sbit pwm3=P12; /第三路频率 1s内产生2500个脉冲sbit pwm4=P13; /第四路频率 1s内产生500个脉冲uchar cout1,cout2; /分别用来定义时间宽度uchar t0_max=10,t1_max=100;/*定时器0初始化函数*/void time0_ini() /定时0初始化 TMOD=0X02; /采用定时器0,选择模式2TH0=0xA3; /0.1ms定时TL0=0Xa3;ET0=1; /允许定时器溢出中断 TR0=1; /启动定时器 /*外部中断0初始化*/void INT0_ini() EX0=1; /外部中断0允许 IT0=1; /选择边沿触发方式 /*定时器1初始化*/void time1_ini() TMOD=0X20; /采用定时器1,选择模式2 TH1=0XA3 ; /定时0.1ms TL1=0XA3; ET1=1; /允许定时器中断 TR1=1;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 校园环境卫生管理制度
- 外企招聘英文简历写作指南
- 组织团建面试题目及答案
- 前台考勤制度
- 四川事业单位考勤制度
- 2026届重庆市高三上学期康德高考模拟调研考试(二)化学试题(无答案)
- 小学选修课程考勤制度
- 局干部职工考勤制度
- 巡察工作人员考勤制度
- 工作队月考勤制度
- DZ∕T 0320-2018 有色金属行业绿色矿山建设规范(正式版)
- 通风安全学课件
- 消耗品管理制度培训课件
- 货车运用维修-站修作业场(铁道车辆管理)
- 家用小型心电监测系统
- 低压配电系统
- 培训供应链审核for baiyun施耐德电气供应商质量管理
- 煤矿顶板事故现场处置方案
- 体育教学“一体化”模式的探究课件
- 《中兽医学说》教学课件
- 水电站辅机设备及PLC控制(“系统”)课件
评论
0/150
提交评论