文档库 最新最全的文档下载
当前位置:文档库 › PWM教程

PWM教程

PWM调速的C语言程序编写(非常简单)

PWM调速的C语言程序编写 关于PWM的原理在上一篇文章中已经说的很详细了,现在就细说一下pwm C语言程序的编写。 C语言中PWM的编写有这么几种方法;一、用普通的I/O 口输出的PWM ,二、使用定时计数器编写,三、就是使用片内PWM了。 1 先说使用普通的I\O口编写PWM程序了。 使用I/O口输出PWM波形你必须首先明白PWM他的实质是:调制占空比,占空比就是波形中高电平的长度与整个波长的比值。我们写C语言的目的是写PWM波形的一个周期。在这个周期内高低电平的比值是可以改变的。这也就符合了PWM的原意脉宽调制。即高电平的宽度的调制。当然了PWM他也可用于改变频率,我们这里只先说他改变脉宽。 一旦我们的C语言程序写完那么他产生的PWM波形的频率就一定了。(也可写频率变化的PWM,难度有点大)一般我们控制使用1K到10K的PWM波进行控制。当然了你也可在要求不是很高的地方使用频率更低的PWM波。比如在飞思卡尔智能车比赛中我们学校使用的PWM波频率只有600HZ. 我们要改变一个PWM波周期内的高电平的宽度显然需要

将一个PWM波的周期分成单片机可以控制的N个小的周期,N的取值越大你的调速等级越高,但产生的PWM频率就越低。我们下面以实现100级调速为例编写PWM程序。 先写出程序再慢慢给大家分析 void pwm (uchar x,uint y) //X 为占空比 Y为函数使用时间 { uint i,j,a,b; for(i=y;i>0;i--) //定时外函数 { for(j=7;j>0;j--) //定时内函数 { for(a=y;a>0;a--) / /PWM波高电平宽度 { PORTA=0X01;

PWM电机调速原理及51单片机PWM程序经典

Pwm电机调速原理 对于电机的转速调整,我们是采用脉宽调制(PWM)办法,控制电机的时候,电源并非连续地向电机供电,而是在一个特定的频率下以方波脉冲的形式提供电能。不同占空比的方波信号能对电机起到调速作用,这是因为电机实际上是一个大电感,它有阻碍输入电流和电压突变的能力,因此脉冲输入信号被平均分配到作用时间上,这样,改变在始能端PE2 和PD5 上输入方波的占空比就能改变加在电机两端的电压大小,从而改变了转速。 此电路中用微处理机来实现脉宽调制,通常的方法有两种: (1)用软件方式来实现,即通过执行软件延时循环程序交替改变端口某个二进制位输出逻 辑状态来产生脉宽调制信号,设置不同的延时时间得到不同的占空比。 (2)硬件实验自动产生PWM 信号,不占用CPU 处理的时间。 这就要用到ATMEGA8515L 的在PWM 模式下的计数器1,具体内容可参考相关书籍。 51单片机PWM程序 产生两个PWM,要求两个PWM波形占空都为80/256,两个波形之间要错开,不能同时为高电平!高电平之间相差48/256, PWM这个功能在PIC单片机上就有,但是如果你就要用51单片机的话,也是可以的,但是比较的麻烦.可以用定时器T0来控制频率,定时器T1来控制占空比:大致的的编程思路是这样的:T0定时器中断是让一个I0口输出高电平,在这个定时器T0的中断当中起动定时器T1,而这个T1是让IO口输出低电平,这样改变定时器T0的初值就可以改变频率,改变定时器T1的初值就可以改变占空比。 *程序思路说明: * * * *关于频率和占空比的确定,对于12M晶振,假定PWM输出频率为1KHZ,这样定时中断次数* *设定为C=10,即0.01MS中断一次,则TH0=FF,TL0=F6;由于设定中断时间为0.01ms,这样* *可以设定占空比可从1-100变化。即0.01ms*100=1ms * ******************************************************************************/ #include #define uchar unsigned char /*****************************************************************************

PWM调速程序

PWM调速程序 假设在硬件电路已经连接好后,要控制直流电机的转速可以通过在电机驱动电路的使能端输入一PWM波形。改变PWM波的脉宽(占空比)即可改变加在电机两端的有效电压,从而改变电机的转速。注意,此处的PWM波只是相当于电机供电电路开关的作用:高电平对应接通,低电平对应断开。 对于Atmega 16单片机,这里利用T/C1定时器中断来产生PWM波形。在ICC A VR 编译环境下,利用tool 菜单中的application builder生成一个简单的PWM波程序。这段程序以PA0作为PWM波的输出端口。利用T/C1定时器比较匹配和溢出产生两次中断来改变PA0的输出电平。具体过程为:计数器TCNT1从初始值开始不断计数,当发生比较匹配时,把PA0置为低电平,计数器继续计数,当发生溢出中断时,计数器回到初始设定值,并把PA0置为高电平。从而在PA0端口获得一稳定持续的PWM波形,在主程序中改变比较值,即可改变波形占空比,而频率不变。 //ICC-A VR application builder // Target : M16 // Crystal: 8.0000Mhz #include #include void port_init(void) { PORTA = 0x00; DDRA = 0x01;//set PA0 as PWM wave output port PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; //m103 output only DDRC = 0x00; PORTD = 0x00; DDRD = 0x00; } //note: even if you use the second function of PD4,PD5 as PWM wave output ports, you should //also set port’s direction. //TIMER1 initialize - prescale:256 // WGM: 5) PWM 8bit fast, TOP=0x00FF // desired value: 100Hz // actual value: 122.070Hz (18.1%) //note:there is no particular requirement for the frequency of PWM wave as long as it is not too //low. void timer1_init(void) { TCCR1B = 0x00; //stop //set initial value for counter

PWM波形产生程序

PWM波形产生流程图: 定义变量,定义状态指示量flag flag=0,渐亮,flag=1,渐暗 选择定时器T0中断, 给定时器T0装初值, 开启总中断, 开启定时器T0中断, 给定拓宽最大周期counter, 进入循环{ 判断状态变量flag的值 flag!=0,PWM_ON高电平右移,直到PWM_ON==最大周期CYCLE,flag=1 flag=1,PWM_ON左移,直到PWM_ON=0,flag=0, } 进入中断{ 给定时器T0装初值,判断中断次数counter的值 若counter=PWM_ON,则LED控制I/O口至高电平,即P1=0xFF,继续中断(counter++)若counter=CYCLE,则中断次数counter=0,此时当PWM_ON!=0,点亮LED } 程序如下: #include #include #define uchar unsigned char uchar CYCLE; uchar counter=0; uchar PWM_ON; void delay(void) //误差0us { unsigned char a,b,c; for(c=62;c>0;c--) for(b=251;b>0;b--) for(a=1;a>0;a--); _nop_; //if Keil,require use intrins.h } void main() { bit flag;// FLAG=0,渐亮,FLAG=1,渐暗 TMOD=0x01; TH0=(65536-100)/256; TL0=(65536-100)%256; EA=1; ET0=1; TR0=1; CYCLE=10; while(!flag) {

单片机PWM调光程序

单片机PWM调光程序 内容:通过PWM(脉宽调制)调节LED的亮度 ------------------------------------------------*/ #include<> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 sbit LED0=P1^0;// 用sbit 关键字定义LED到端口,LED是自己任意定义且容易记忆的符号 void Delay(unsigned int t); //函数声明 /*------------------------------------------------ 主函数 ------------------------------------------------*/ void main (void) { unsigned int CYCLE=600,PWM_LOW=0;//定义周期并赋值 while (1) //主循环 { LED0=1; Delay(60000); //特意加延时,可以看到熄灭的过程 for(PWM_LOW=1;PWM_LOW0;PWM_LOW--){ //与逐渐变亮相反的过程 LED0=0; Delay(PWM_LOW); LED0=1; Delay(CYCLE-PWM_LOW); } //主循环中添加其他需要一直工作的程序 } } /*------------------------------------------------ 延时函数,含有输入参数unsigned int t,无返回值

单片机PWM控制C程序语言

下面介绍一下单片机PWM控制C语言实例,单片机PWM可以应用在许多方面,如电机调速、温度控制、压力控制等。PWM—脉冲宽度调制,是一种周期一定而高低电平可调的方波信号。广泛使用电机调速的项目中,用了S52单片机的T2定时器产生PWM波信号,用于控制直流电机的转速,虽然电机的平均速度与占空比不是严格的线性关系,但是在调节占空比可以明显的看出电机转速发生了改变,也算是满足了课题的要求。下面复习一下PWM的知识吧: PWM—脉冲宽度调制,当输出脉冲的频率一定时,输出脉冲的占空比越大,相对应的输出有效电压越大。PWM可以应用在许多方面,如电机调速、温度控制、压力控制等。T1为脉冲宽度(就是导通时间),周期为T,则输出电压的平均值为U=VCC*T1/T=a*VCC,a是占空比,变化范围为0≤a≤1。VCC 为电源电压。所以当电源电压不变的情况下,输出电压的平均值U取决于占空比a的大小,改变a的大小就可以改变输出电压的平均值,这就是PWM的工作原理。采用T2定时器产生PWM脉冲极其精确,误差只在几个us。 // 单片机PWM控制C语言实例文件名: T2PWM.c // 单片机PWM控制C语言实例功能: 用T2定时器产生PWM波,频率实调1khz // 单片机PWM控制C语言实例说明: 单片机AT89S52,晶振12MHZ; #include "reg52.h" #define uint unsigned int #define uchar unsigned char sbit PWM = P1^1; uchar pluse; //占空比寄存器 void Timer2() interrupt 5

PWM调速+循迹--智能小车程序

//T0产生双路PWM信号,L298N为直流电机调速,接L298N时相应的管脚上最好接上10K的上拉电阻。 /* 晶振采用12M,产生的PWM的频率约为100Hz */ #include #include #define uchar unsigned char #define uint unsigned int sbit en1=P3^4; /* L298的Enable A */ sbit en2=P3^5; /* L298的Enable B */ sbit s1=P1^0; /* L298的Input 1 */ sbit s2=P1^1; /* L298的Input 2 */ sbit s3=P1^3; /* L298的Input 3 */ sbit s4=P1^2; /* L298的Input 4 */ sbit R=P2^0; sbit C=P2^1; sbit L=P2^2; sbit key=P1^4; uchar t=0; /* 中断计数器*/ uchar m1=0; /* 电机1速度值*/ uchar m2=0; /* 电机2速度值*/ uchar tmp1,tmp2; /* 电机当前速度值*/ /* 电机控制函数index-电机号(1,2); speed-电机速度(0-100) */ void motor(uchar index, char speed) { if(speed<=100) { if(index==1) /* 电机1的处理*/ { m1=abs(speed); /* 取速度的绝对值*/ s1=1; s2=0; } if(index==2) /* 电机2的处理*/ { m2=abs(speed); /* 电机2的速度控制*/ s3=1; s4=0; } } } void Back(void)

PWM控制舵机 C程序

#include "reg52.h" sbit control_signal=P0^0; sbit turn_left=P3^0; sbit turn_right=P3^1; unsigned char PWM_ON=15 ;//定义高电平时间 /******************************************************************/ /* 延时函数 */ /******************************************************************/ void delay(unsigned int cnt) { while(--cnt); } void display() { if(PWM_ON>=5&&PWM_ON<=7) P1=0xFD; //1灯亮,舵机接近或到达右转极限位置if(PWM_ON>7&&PWM_ON<=10) P1=0xFB; //2灯亮 if(PWM_ON>10&&PWM_ON<=13) P1=0xF7; //3灯亮 if(PWM_ON>13&&PWM_ON<=16) P1=0xEF; //4灯亮,舵机到达中间位置 if(PWM_ON>16&&PWM_ON<=19) P1=0xDF; //5灯亮 if(PWM_ON>19&&PWM_ON<=22) P1=0xBF; //6灯亮 if(PWM_ON>22&&PWM_ON<=25) P1=0x7F; //7灯亮,舵机接近或到达左转极限位置} /******************************************************************/ /* 主函数 */ /******************************************************************/ void main() { //bit Flag; TMOD |=0x01; //定时器设置 0.1ms in 11.0592M crystal TH0=(65536-78)/256; TL0=(65536-78)%256; //定时0.1mS ET0=1;//定时器中断打开 EA=1;//总中断 //IE= 0x82; //打开中断 TR0=1; // PWM_ON=15 //的取值范围是6-25 while(1) { if(turn_left==0) { delay(1000); if(turn_left==0) { while(!turn_left){}

PWM程序

| EzDSP Alpha Release | No change Include required header files definition files. #include "" unsigned int flag=0; interrupt void eva_CMP1_isr(void); interrupt void eva_T1UF_isr(void); void main(void) { /*初始化系统*/ InitSysCtrl(); /*关中断*/ DINT; IER = 0x0000; IFR = 0x0000; /*初始化PIE控制寄存器*/ InitPieCtrl(); /*初始化PIE矢量表*/

InitPieVectTable(); EALLOW; =&eva_T1UF_isr; =&eva_CMP1_isr; EDIS; /*初始化EV*/ InitEv(); IER |=M_INT2; EINT; ERTM; for(;;) { KickDog(); } } interrupt void eva_T1UF_isr(void) { = *3; =; =*2; EINT;

} interrupt void eva_CMP1_isr(void) { if(flag==0) { = *2; =*4; =; flag=flag+1; } else { flag=flag-1; } EINT; } //============================================================= ==============

51单片机两路或多路pwm波输出程序[1]1

51单片机两路pwm波输出程序(可根据情况设置多路) #include unsigned char count; sbit pwm1=P1^0; sbit pwm2=P3^1; sbit jia=P2^2; sbit jan=P2^3; sbit zuo=P2^4; sbit you=P2^5; unsigned char jd1,jd2,m1,m2; //延时程序 void delay(unsigned int x) { unsigned char i,j; for(i=x;i>0;i--) for(j=125;j>0;j--); }

//定时0.1ms, void Timer0_Init() { TMOD=0x01; IE=0x82; TH0=0xff;//65436/256; TL0=0x9c;//65436%256 TR0=1; } void Timer0_Int() interrupt 1//中断程序{ TH0=0xff; TL0=0x9c; //m1=count; //m2=count; if(m1

pwm1=1; else pwm1=0; if(m2

温控及pwm的程序

ORG 00H LJMP START ORG 100H START: ;;-----初始化 MOV SP,#60H ;;初始化堆栈指针 Set18B20:;;-----DS18B20初始化 ;;DS18B20复位 ACALL Reset JB RFail,LOOP ;;复位失败则直接跳至显示部分 ;;对DS18B20发出Skip ROM命令 MOV A,#0CCH ACALL Write ;;对DS18B20发出温度转换命令 MOV A,#44H ACALL Write SetDisT:MOV DisTime,#3 ;;设置下一个循环体的循环8次 LOOP: ACALL Display ;;显示 JB RFail,Set18B20 ;;DS18B20复位失败时,在显示完一次后重新复位DJNZ DisTime,LOOP JNB DS18B20,$ ;;判断DS18B20是否已完成温度转换 ACALL GetTemp ;;从DS18B20读出温度值 ACALL DealTemp ;;温度值处理 ACALL SendDisDT ;;根据当前系统状态设置显示内容 SJMP SetDisT ;;;;;;; ;;根据当前状态给显示模块设置显示参数 SendDisDT: MOV Dian,#7FH ;;最高位为0代表显示小数点 ;;传送温度值 MOV A,TempH ;;送高位数据 MOV VAR,TempL ;;送低位数据 ACALL TransData RET ;;A中保存高位值,Var中保存低位值 TransData: ;;取个位值 MOV B,#10 DIV AB MOV DisData2,B ;;取十位值 JZ HavNot1 ;;判断商是否为0

PWM控制LED灯渐亮渐灭源程序-C51

本文转载自:https://www.wendangku.net/doc/4414393141.html,转载请著名出处 /*******************************************************************/ /* */ /* ME300B单片机开发系统演示程序- PWM控制LED灯渐亮渐 灭 */ /* */ /* LED显 示*/ /* */ /* 邮 箱: gguoqing@https://www.wendangku.net/doc/4414393141.html, */ /* 网站: https://www.wendangku.net/doc/4414393141.html, */ /* 作者: gguoqing */ /* 时间:

2005/11/30 */ /* */ /*【版权】Copyright(C)伟纳电子https://www.wendangku.net/doc/4414393141.html, All Rights Reserved */ /*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息! */ /* */ /*******************************************************************/ // PWM 控制LED 灯渐亮渐灭程序 // 适用ME300B 开发系统 // 晶振为11.0592M // 利用定时器控制产生占空比可变的PWM 波 // 按K1,PWM值增加,则占空比减小,LED 灯渐暗。 // 按K2,PWM值减小,则占空比增加,LED 灯渐亮。 // 当PWM值增加到最大值或减小到最小值时,蜂鸣器将报警。 /*********************************************************/ #include < reg51.h > #include < intrins.h > sbit K1 =P1^4 ; //增加键 sbit K2 =P1^5 ; //减少键

PWM控制的调速方法

设计报告书 4.1.3、采用PWM 控制的调速方法 图1为PWM 降压斩波器的原理电路及输出电压波形。在图1a 中,假定晶体 管V 1先导通T 1,秒(忽略V 1的管压降,这期间电源电压Ud 全部加到电枢上),然后关断T 2秒(这期间电枢端电压为零)。如此反复,则电枢端电压波形如图1b 中所示。电动机电枢端电压Ua 为其平均值。

图1 PWM 降压斩波器原理电路及输出电压波形 a) 原理图 b)输出电压波形 1112a d d d T T U U U U T T T α= ==+ (3) 式(3)中 1112T T T T T α= =+ (4) α为一个周期T 中,晶体管V1导通时间的比率,称为负载率或占空比。使用下面三种方法中的任何一种,都可以改变α的值,从而达到调压的目的: (1)定宽调频法:T1保持一定,使T2在0~∞范围内变化; (2)调宽调频法:T2保持一定,使T1在0~∞范围内变化 (3)定频调宽法:T1+T2=T 保持一定,使T ,在0~T 范围内变化。 不管哪种方法,α的变化范围均为0≤α≤l ,因而电枢电压平均值Ua 的调节范围为0~Ud ,均为正值,即电动机只能在某一方向调速,称为不可逆调速。当需要电动机在正、反向两个方向调速运转,即可逆调速时,就要使用图1—2a 所示的桥式(或称H 型)降压斩波电路。 在图2a 中,晶体管V 1、V 4是同时导通同时关断的,V 2、V 3也是同时导通同时关断的,但V 1与V 2、V 3与V 4都不允许同时导通,否则电源Ud 直通短路。设V 1、V 4先同时导通T1秒后同时关断,间隔一定时间(为避免电源直通短路。该间隔时间称为死区时问)之后,再使V 2、V 3同时导通T2秒后同时关断,如此反复,则电动机电枢端电压波形如图2b 所示。 图2 桥式PWM 降压斩波器原理电路及输出电压波形 a)原理图 b)输出电压波形 电动机电枢端电压的平均值为 12112(21)(21)a d d d T T T U U U U T T T α-= =-=-+ (4) 由于0≤α≤1,Ua 值的范围是 -Ud ~+Ud ,因而电动机可以在正、反两个

固定占空比PWM波形输出程序

程序一:系统初试化程序 #include "DSP28_Device.h" void InitSysCtrl(void) { Uint16 i; EALLOW; DevEmuRegs.M0RAMDFT = 0x0300; DevEmuRegs.M1RAMDFT = 0x0300; DevEmuRegs.L0RAMDFT = 0x0300; DevEmuRegs.L1RAMDFT = 0x0300; DevEmuRegs.H0RAMDFT = 0x0300; SysCtrlRegs.WDCR= 0x0068; SysCtrlRegs.PLLCR = 0xA; for(i= 0; i< 5000; i++){} SysCtrlRegs.HISPCP.all = 0x0001; SysCtrlRegs.LOSPCP.all = 0x0002; SysCtrlRegs.PCLKCR.bit.EV AENCLK=1; SysCtrlRegs.PCLKCR.bit.EVBENCLK=1; EDIS; } void KickDog(void) { EALLOW; SysCtrlRegs.WDKEY = 0x0055; SysCtrlRegs.WDKEY = 0x00AA; EDIS; } 程序二:Gpio 口初始化#include "DSP28_Device.h" void InitGpio(void) { EALLOW GpioMuxRegs.GPAMUX.bit.T1PWM_GPIOA6=1; GpioMuxRegs.GPAMUX.bit.T2PWM_GPIOA7=1; GpioMuxRegs.GPAMUX.bit.PWM1_GPIOA0=1; GpioMuxRegs.GPAMUX.bit.PWM2_GPIOA1=1; GpioMuxRegs.GPAMUX.bit.PWM3_GPIOA2=1; GpioMuxRegs.GPAMUX.bit.PWM4_GPIOA3=1; GpioMuxRegs.GPAMUX.bit.PWM5_GPIOA4=1; GpioMuxRegs.GPBMUX.bit.T3PWM_GPIOB6=1; GpioMuxRegs.GPBMUX.bit.T4PWM_GPIOB7=1; GpioMuxRegs.GPBMUX.bit.PWM7_GPIOB0=1; GpioMuxRegs.GPBMUX.bit.PWM8_GPIOB1=1; GpioMuxRegs.GPBMUX.bit.PWM9_GPIOB2=1; GpioMuxRegs.GPBMUX.bit.PWM10_GPIOB3=1; GpioMuxRegs.GPBMUX.bit.PWM11_GPIOB4=1; GpioMuxRegs.GPBMUX.bit.PWM12_GPIOB5=1; EDIS; }程序四:主程序 #include "DSP28_Device.h" #include "DSP28_Globalprototypes.h" void main(void) { InitSysCtrl(); DINT; IER = 0x0000; IFR = 0x0000; InitPieCtrl(); InitPieVectTable(); InitGpio(); InitEv(); EvaRegs.T1CON.bit.TENABLE=1; EvaRegs.T2CON.bit.TENABLE=1; EvbRegs.T3CON.bit.TENABLE=1; EvbRegs.T4CON.bit.TENABLE=1; while(1){ } } 程序说明 本程序实现的是在PWM1 , PWM3 , PWM 5三个口输出占空比为5 0%,频率为5KHZ的对称方波。本程序参照书上固定占空比PWM波形产生程序改写而成。

单片机51PWM占空比程序

51单片机PWM占空比调整演示程序 /******************************************************************** ********* * 程序名称:PWM占空比调整演示程序 * *程序思路说明: * * 只需要4个按键。 * *关于频率和占空比的确定,对于12M晶振,输出频率为1KHZ,这样定时中断次数设定为 * *10,即0.01MS中断一次,则TH0=FF,TL0=F6;由于设定中断时间为0.01ms,这样可以设 * *定占空比可从1-99%变化。即0.01ms*100=1ms * ********************************************************************* *********/ #include #define uchar unsigned char #define uint unsigned int uchar timer0_tick,ZKB=1;//timer0_tick计数,ZKB占空比 uchar i=0,n=0,temp=0; code seven_seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//1,2,3, 4, 5, 6, 7, 8, 9 code scan[2]={0xfd,0xfe}; uchar counter[2]={0,0}; sbit AN1=P3^2;//调整个位 sbit AN2=P3^3;//调整十位 sbit AN3=P3^4;//启动按键 sbit AN4=P3^5;//确认按键

PWM电机调速原理及单片机PWM程序经典

P w m电机调速原理 对于电机的转速调整,我们是采用脉宽调制(PWM)办法,控制电机的时候,电源并非连续地向电机供电,而是在一个特定的频率下以方波脉冲的形式提供电能。不同占空比的方波信号能对电机起到调速作用,这是因为电机实际上是一个大电感,它有阻碍输入电流和电压突变的能力,因此脉冲输入信号被平均分配到作用时间上,这样,改变在始能端PE2和PD5上输入方波的占空比就能改变加在电机两端的电压大小,从而改变了转速。 此电路中用微处理机来实现脉宽调制,通常的方法有两种: (1)用软件方式来实现,即通过执行软件延时循环程序交替改变端口某个二进制位输出逻 辑状态来产生脉宽调制信号,设置不同的延时时间得到不同的占空比。 (2)硬件实验自动产生PWM信号,不占用CPU处理的时间。 这就要用到ATMEGA8515L的在PWM模式下的计数器1,具体内容可参考相关书籍。 51单片机PWM程序 产生两个PWM,要求两个PWM波形占空都为80/256,两个波形之间要错开,不能同时为高电平!高电平之间相差48/256, PWM这个功能在PIC单片机上就有,但是如果你就要用51单片机的话,也是可以的,但是比较的麻烦.可以用定时器T0来控制频率,定时器T1来控制占空比:大致的的编程思路是这样的:T0定时器中断是让一个I0口输出高电平,在这个定时器T0的中断当中起动定时器T1,而这个T1是让IO口输出低电平,这样改变定时器T0的初值就可以改变频率,改变定时器T1的初值就可以改变占空比。 *程序思路说明:* ** *关于频率和占空比的确定,对于12M晶振,假定PWM输出频率为1KHZ,这样定时中断次数* *设定为C=10,即0.01MS中断一次,则TH0=FF,TL0=F6;由于设定中断时间为0.01ms,这样* *可以设定占空比可从1-100变化。即0.01ms*100=1ms* ******************************************************************************/ #include #defineucharunsignedchar /***************************************************************************** *TH0和TL0是计数器0的高8位和低8位计数器,计算办 法:TL0=(65536-C)%256;* *TH0=(65536-C)/256,其中C为所要计数的次数即多长时间产生一次中断;TMOD是计数器* *工作模式选择,0X01表示选用模式1,它有16位计数器,最大计数脉冲为65536,最长时*

单片机PWM调光程序

#include #include "DZ10.h" //定义变量//////// //unsigned char dummyp3; //unsigned char dimvertion; unsigned char sp0[15]; //unsigned char sp2[15]; //unsigned char stop; unsigned char numor; unsigned char hdyth0,hdytl0; unsigned char ldyth0,ldytl0; unsigned char pltag,aa; unsigned int re_i,re_j; //继电器延时计数 unsigned int dyhz; unsigned int dyduty[3]; unsigned int j; void relay_check(void); //监测大继电器输出电压24V void shutdown(void); //shutdown 函数 void DET_check(void); //DET检测函数 //keyDelay(),消抖动实现/////////////// void keyDelay(void) { unsigned int i; for(i=0;i<500;i++) { WDTRST=0X1E; WDTRST=0XE1; } } //timer0,频率实现//..... void pinlv(unsigned char hz,unsigned char duty) { TR0=0; if(duty==0)

return; hdyth0=(char)((65536-(int)((10000/hz/2)*duty))/256); hdytl0=(char)((65536-(int)((10000/hz/2)*duty))%256); ldyth0=(char)((65536-(int)((10000/hz/2)*(100-duty)))/256); ldytl0=(char)((65536-(int)((10000/hz/2)*(100-duty)))%256); TMOD=0x11; //定时器0,工作方式1 TH0=hdyth0; TL0=hdytl0; ET0=1; //开定时中断允许 EA=1; //开总中断 // P0=P0|numor; LED3 = LED3|0; LED2 = LED2|0; LED1 = LED1|0; P14_MOSL = P14_MOSL|1; P13_MOSL = P13_MOSL|0; P13_MOSH = P13_MOSH|0; P11_MOSL = P11_MOSL|0; P11_MOSH = P11_MOSH|0; pltag=1; TR0=1; return; } //.... void timer0(void) interrupt 1 using 2 { TR0=0; if(pltag==1) { TH0=hdyth0; TL0=hdytl0; pltag=0; } else { TH0=ldyth0; TL0=ldytl0; pltag=1; } // P0=P0^numor;

PWM控制技术的原理和程序设计

PWM控制技术的原理和程序设计 理论篇(一)原理介绍 PWM(Pulse Width Modulation)控制——脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值)。 PWM控制技术在逆变电路中应用最广,应用的逆变电路绝大部分是PWM型,PWM控制技术正是有赖于在逆变电路中的应用,才确定了它在电力电子技术中的重要地位。 1 PWM控制的基本原理 理论基础: 冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。冲量指窄脉冲的面积。效果基本相同,是指环节的输出响应波形基本相同。低频段非常接近,仅在高频段略有差异。 SPWM波形——脉冲宽度按正弦规律变化而和正弦波等效的PWM波形。 PWM电流波:电流型逆变电路进行PWM控制,得到的就是PWM电流波。 PWM波形可等效的各种波形: 直流斩波电路:等效直流波形 SPWM波:等效正弦波形,还可以等效成其他所需波形,如等效所需非正弦交流波形等,其基本原理和SPWM控制相同,也基于等效面积原理。 2. PWM相关概念 占空比:就是输出的PWM中,高电平保持的时间与该PWM的时钟周期的时间之比 如,一个PWM的频率是1000Hz,那么它的时钟周期就是1ms,就是1000us,如果高电平出现的时间是200us,那么低电平的时间肯定是800us,那么占空比就是200:1000,也就是说PWM的占空比就是1:5。分辨率也就是占空比最小能达到多少,如8位的PWM,理论的分辨率就是1:255(单斜率),16位的的PWM理论就是1:65535(单斜率)。 频率就是这样的,如16位的PWM,它的分辨率达到了1:65535,要达到这个分辨率,T/C就必须从0计数到65535才能达到,如果计数从0计到80之后又从0开始计到80.......,那么它的分辨率最小就是1:80了,但是,它也快了,也就是说PWM的输出频率高了。 双斜率/ 单斜率 假设一个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的最基本的原理了。

PWM调光程序

用S TC12C5624AD写的P W M 可调C 程序 //本程序用占空比可调节的PWM方波来控制大功率LED的亮度,PWM波占空比可从0到100 // PWM 控制LED 灯渐亮渐灭程序 // 晶振为12M // 利用STC12C5624AD单片机的PWM功能产生占空比可变的PWM 方波 // 按K1,PWM值增加,则占空比减小,LED 灯渐暗。 // 按K2,PWM值减小,则占空比增加,LED 灯渐亮。 // 当PWM值增加到最大值或减小到最小值时,蜂鸣器将报警。 #include sfr CCON=0xD8; sfr CMOD=0xD9; sfr CL=0xE9; sfr CH=0xD8; sfr CCAP0L=0xEA; sfr CCAP0H=0xFA; sfr CCAPM0=0xDA; unsigned char PWM=0x7f; //PWM初值 unsigned char flag=0; sbit K1 =P3^0; //增加键 sbit K2 =P3^1 ; //减少键 sbit BEEP=P2^5; //蜂鸣器

sbit CR=0xDE; void Beep(); void delayms(unsigned char ms); void delay(unsigned char t); void main(void) { CMOD=0x02; //PCA计数脉冲选择为fos/2 CL=0x00; CH=0x00; CCAP0L=0xC0; CCAP0H=PWM; CCAPM0=0x42; CR=1; while(1) { if(K1==1&&K2==1) flag=0; if(K1==0) { delay(50); if(K1==0&&flag==0)

PWM电机调速原理及单片机PWM程序经典

P W M电机调速原理及单片机P W M程序经典集团企业公司编码:(LL3698-KKI1269-TM2483-LUI12689-ITT289-

P w m电机调速原理对于电机的转速调整,我们是采用脉宽调制(PWM)办法,控制电机的时候,电源并非连续地向电机供电,而是在一个特定的频率下以方波脉冲的形式提供电能。不同占空比的方波信号能对电机起到调速作用,这是因为电机实际上是一个大电感,它有阻碍输入电流和电压突变的能力,因此脉冲输入信号被平均分配到作用时间上,这样,改变在始能端PE2 和PD5上输入方波的占空比就能改变加在电机两端的电压大小,从而改变了转速。 此电路中用微处理机来实现脉宽调制,通常的方法有两种: (1)用软件方式来实现,即通过执行软件延时循环程序交替改变端口某个二进制位输出逻 辑状态来产生脉宽调制信号,设置不同的延时时间得到不同的占空比。(2)硬件实验自动产生PWM信号,不占用CPU处理的时间。 这就要用到ATMEGA8515L的在PWM模式下的计数器1,具体内容可参考相关书籍。 51单片机PWM程序 产生两个PWM,要求两个PWM波形占空都为80/256,两个波形之间要错开,不能同时为高电平!高电平之间相差48/256, PWM这个功能在PIC单片机上就有,但是如果你就要用51单片机的话,也是可以的,但是比较的麻烦.可以用定时器T0来控制频率,定时器T1来控制占空比:大致的的编程思路是这样的:T0定时器中断是让一个I0

口输出高电平,在这个定时器T0的中断当中起动定时器T1,而这个T1是让IO口输出低电平,这样改变定时器T0的初值就可以改变频率,改变定时器T1的初值就可以改变占空比。 *程序思路说明:* ** *关于频率和占空比的确定,对于12M晶振,假定PWM输出频率为1KHZ,这样定时中断次数* *设定为C=10,即0.01MS中断一次,则TH0=FF,TL0=F6;由于设定中断时间为0.01ms,这样* *可以设定占空比可从1-100变化。即0.01ms*100=1ms* *************************************************************** ***************/ #include #defineucharunsignedchar /************************************************************** *************** *TH0和TL0是计数器0的高8位和低8位计数器,计算办 法:TL0=(65536-C)%256;* *TH0=(65536-C)/256,其中C为所要计数的次数即多长时间产生一次中断;TMOD是计数器* *工作模式选择,0X01表示选用模式1,它有16位计数器,最大计数脉冲为65536,最长时*

相关文档