单片机PWM控制C程序语言

合集下载

STC12C5A60S2单片机PWM程序

STC12C5A60S2单片机PWM程序

STC12C5A60S2PWM程序
由于STC12C5A60S2单片机内部自带两路PWM,所以可以利用自带的PWM进行负载电压调节。

电路图如上,该程序的功能是利用按键S1对LED的亮度进行调节。

程序如下:
#include"STC12C5A.h"//注意这个头文件,用reg52是不行的,如果你没有的话,可以去百// //度文档里搜索“STC12C5A系列单片机头文件”,有我共享的头文件。

void delay(unsigned int cnt)
{
unsigned char i;
for(;cnt>0;cnt--)
for(i=0;i<250;i++);
}
void main()
{
CCON=0; //禁止寄存器CCON中CF位的中断)
CL=0; //PCA的16位计数器低八位
CH=0; //PCA的16位计数器高八位
CMOD=0x00; //选择系统时钟/12 为计数脉冲,则PWM的频率f=sysclk/256/12;
CCAP0H=0x80; // 占空比控制
CCAP0L=0x80;
PCA_PWM0=0x00; //控制占空比的第九位为0
CCAPM0=0x42; //允许P13作为PWM输出
CR=1; //启动PCA计数器
while(1)
{
if(P10==0)
{
delay(200);
while(P10==0);
CCAP0H+=10; //占空比调节
CCAP0L+=10;
}
}
}
欢迎阅读。

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

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;}for(b=100-y;b>0;b--) //PWM低电平宽度{PORTA=0X00;}}}}这个程序够简单吧轻松的实现AVR单片机的PA.0口输出7KHZ左右的PWM脉冲你可以将PORTA=0X01;改为P1.0=0X01;就可以移植到51单片机上了为什么使用参数Y定时是因为用普通I/O口控制它的开关没有使用定时器编写的灵活。

基于C51单片机的温度闭环控制实验程序

基于C51单片机的温度闭环控制实验程序

#include <reg51.h>#include <absacc.h>#include <math.h>void pid(void) //PID算法子程序void init(void) //初始化子程序void display(void) //延时子程序void clear() //清零子程序int mmul(int x,int y) //16位乘法,溢出赋极值int madd(int x,int y) //16位加法,溢出赋极值int change32_16(int x,int t) //32——16char change16_8(int wd) //16——8#define C8255_A XBYTE[0x7F00]#define C8255_B XBYTE[0x7F01]#define C8255_C XBYTE[0x7F02]#define C8255_CON XBYTE[0x7F03]#define AD0809 XBYTE[0xFEFF] //定义AD0809的地址sbit P17=P1^7; //PWM的驱动char TS=0x64; //采样周期int X=0x80;char SPEC=0x28; //给定:要求达到的温度值char IBAND=0x60; //积分分离值:PID算法中积分分离值int KP=12; //比例系数:PID算法中比例项系数char KI=20; //积分系数char KD=32; //微分系数int CK; //控制量:PID算法产生用于控制的量int TC; //采样周期变量char FPWM; //PWM脉冲中间标识位int CK_1; //控制量变量,用于记录上次控制的值int AAAA; // PWM高电平脉冲时间计算int VAA; //AAAA变量int BBB; //PWM低电平脉冲时间计算int VBB; //BBB变量int TKMARK; //采样标志值int ADMARK; //AD转换结束标志位int ADV ALUE; //AD采样后保存int YK; //反馈:测量温度值int EK; //温度误差int EK_1;int AEK;int BEK;unsigned char dis; //BCD码显示unsigned char led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsigned char b[]={0x00,0x00,0x00,0x00}; //位选/********************温度表**************/unsigned char codea[0x100]={0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x15,0x16,0x17,0x18,0x19, 0x1a,0x1b,0x1c,0x1d,0x1e,0x1e,0x1f,0x20,0x21,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x31,0x32,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3 c,0x3d,0x3e,0x3f,0x40,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x4 f,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x61,0x6 2,0x63,0x64,0x64,0x65,0x65,0x66,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6e,0x6f,0 x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,0x80,0x81,0x82,0x83,0x84,0x84,0x85,0x86,0x87,0x88,0x89,0x8 a,0x8b,0x8c,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0x9b,0x9b,0 x9c,0x9c,0x9d,0x9d,0x9e,0x9e,0x9f,0x9f,0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0 xb0,0xb0,0xb1,0xb2,0xb3,0xb4,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xbb,0xbd,0xbe,0xbe,0xc1 ,0xc2,0xc3,0xc4,0xc5,0xc6,0xc8,0xca,0xcc,0xce,0xcf,0xd0,0xd1,0xd2,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xdd ,0xde,0xe3,0xe6,0xe9,0xec,0xf0,0xf2,0xf6,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0 xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,}/**************延时子程序*********************/void delay(unsigned int time){unsigned int i;for(i=0;i<time;i++)}/*************主程序*************************/void main(){init();while(1);{while(1){if(TRMARK==0x01)break; //采样周期到否}TRMARK==0x00;while(1){if(ADMARK==0x01)break; //AD转换是否结束}ADMARK=0x00;YK=a[ADV ALUE];dis=(char)YK; //查温度表pid(); //PID算法if(CK<=0x80) //根据CK产生PWMAAAA=0x00;elseAAAA=CK-0x80;BBB=0x7f-AAAA;}}/***********初始化函数*********************/void init(void){YK=0x00; //变量初始化EK=0x00;EK_1=0x00;AEK=0x00;BEK=0x00;CK=0x00;CK_1=0x00;BBB=0x00;VBB=0x00;ADV ALUE=0x00;TKMARK=0x00;ADMARK=0x00;TC=0x00; //采样周期变量FPWM=0x01;AAAA=0x7f;V AA=0x7f;C8255_CON=0x81;display();clear();TMOD=0x11; //T1 ,T0由外部控制中断控制信号,16位定时器,工作在方式一下IP=0x02; //设定T0中断优先级最高IT1=1; //外部中断请求信号方式为脉冲触发方式,外中断1为下降沿有效EX1=1; //允许INT1中断TH0=0xd8;TL0=0xef;TH1=0xd8;TL1=0xef;ET0=ET1=1; //允许T0,T1中断TR0=TR1=1; //启动T0,T1EA=1;AD0809=1; //启动AD转换}void myint3(void) interrupt 3 //定时器1 LED显示{TH1=0xd8;TL1=0xef;ET1=1;display();clear();}void myint1(void) interrupt 2 //外中断1 读AD转换结果{ADV ALUE=AD0809;ADMARK=0x01;}void myint2(void) interrupt 1 //定时器0 启动AD转换{TH0=0xd8;TL0=0xef;ET0=1; //启动定时器0AD0809=1; //启动ADif(TC<TS)TC++; //采样周期变量else{TKMARK=0x01;TC=0x00;}if(FPWM==0x01) //产生PWM ,0x01表示加热模块{if(V A!=0x00){V AA=V AA-1;P17=0; //输出为低加热else{FPWM=0x02;VBB=BBB/2;}}if(FPWM==0x02) //0x02表示停止加热模块{if(VBB!=0x00){VBB=VBB-1;P17=1; //输出为高停止加热}else{FPWM=0x01;V AA=AAAA/2;}}return;}/*****************PID子程序***********/void pid(void){int K,P,I,D;K=P=I=D=0;EK=SPEC-YK;//得到偏差BEK=EK-EK_1-AEK;//12EKAEK=EK-EK_1; //偏差变化量/*********UK=Kp*AEK+Ki*EK+Kd*BEK****/if(abs(EK)>abs(IBAND))I=0; //判积分分离elseI=(EK*TS)/KI; //计算积分项P=AEK;D=((KD/TS)*BEK)/10000; //计算微分项//与书上对照,忽略KP K=madd(I,P);K=madd(D,K);K=mmul(K,KP);CK=K+CK_1;CK=change16_8(CK);CK_1=CK;EK_1=EK;CK=CK+X;}int mmul(int x,int y){int t,z;long s;s=x*y;z=(int)(s&0x0ffff);t=(int)((s>>16)&0x0ffff);s=change32_16(z,t);return(s);}int change32_16(int z,int t) //t=高字节,z=低字节{int s;if(t==0){if((z&0x8000)==0) s=z;else s=0x7fff;}else if((t&0xffff)==0xffff){if((z&0x8000)==0) s=0x8000;else s=z;}else if((t&0x8000)==0) s=0x7fff;else s=0x8000;return(s);}int mmad(int x,int y){int t;t=x+y;if(x>=0&&y>=0) //同号相乘,符号位变反说明溢出{if((t&0x8000)!=0) t=0x7fff;}else if(x<=0&&y<=0){if((t&0x8000)==0) t=0x8000;}return(t);}char change16_8(int wd) //t=高字节,z=低字节{char z,t,s;z=(wd>>8)&0x0ff;if(t==0x00){if((z&0x80)==0) s=z;else s=0x7f;}else if((t&0xff)==0xff){if((z&0x80)==0) s=0x80;else s=z;}else if((t&0x80)==0) s=0x7f;else s=0x80;return(s);}void display() //数码管显示函数{unsigned char i,j=0xf7;b[3]=SPEC/10;b[2]=SPEC%10;b[1]=dis/10;b[0]=dis%10;for(i=0;i<4;i++){C8255_A=j;C8255_B=led[b[i]];delay(0x55);j>>=1;}}void clear(){C8255_B=0x00;}。

MSP430单片机PWM调制的说明及源代码

MSP430单片机PWM调制的说明及源代码
频率
用于产生直流电平的滤波器仅仅是用来储存电荷的而不像交流信号滤波器那样
用来滤波因此采用了一个简单的单极RC 滤波器
4.程序流程
用MSP430F449 的Timer_B 的PWM 来产生正弦波和直流电平的程序比较简单流
程如图4 所示MSP430F449 自身有FLL 可用它来实现DCO 的频率校准但是
实现低功耗尽量避免采用有
源器件
用于交流信号的滤波器是一个
双极点级联RC 滤波器如果滤
波器阶数过高可以采用提高
的抽样频率的办法来降低滤波
器阶数滤波器的截至频率fc
由下式来计算
当R2 ? R1 时滤波器的响应较
好但是如果截至频率很接近信号带宽边沿将会导致相当大的衰减因此为了
减小滤波器的衰减截至频率应该大于信号带宽边沿但是要远小于PWM 信号的
新的正弦波抽样值载入捕获/比较寄存器CCR1 中因此产生的PWM 信号的脉冲宽
度就决定了正弦波在每一个时刻的抽样值将这个PWM 信号经过低通滤波即得
所需的正弦波
3.2 直流电平的产生
直流电平产生比较简单因为它对应的PWM 占空比是一定的直流电平直接正比
于PWM 信号的占空比要产生0.5VCC 的直流电平PWM 的占空比显然是50% 考
FLL_CTL0 = XCAP18PF; // 设置XTAL1 的负载电容
SCFQCTL = 50-1; // 1.6384MHz/32768Hz = 50,fDCO=MCLK=1.6384MHz
for (i = 50000; i; i--); // 晶振初始化延时
//***设置Timer_B***//
TBCCR2=128; //PWM 的占空比为50%,产生0.5VCC 的直流电平

51单片机PWM呼吸灯源程序

51单片机PWM呼吸灯源程序

51单片机PWM-呼吸灯源程序/*************************************************** **************** @file : main.c* @xu ran* @date : 2014年5月23日20:55:19 - 2014年5月23日22:32:12* @version : V2.0* @brief : PWM脉冲宽度调制技术实现呼吸灯************************************************* **************** @attention* 实验平台 : 51hei开发板* 单片机 : STC89C52RC MCU 晶振 : 11.0592 MHZ************************************************* ****************/#include //使用STC89C52库/* 三八译码器74HC138 */sbit ADDR3 = P1^3;sbit ENLED = P1^4;sbit PWMOUT = P0^0; //LED0/* PWM占空比 */unsigned char code pwmTable[] = {3, 5, 8, 11, 13, 16, 21, 24, 27, 30, 33, 36, 40, 45, 49,53, 55, 57, 61, 65, 67, 69, 72, 75, 79, 82, 86, 89, 91,93, 96, 99}; // dc%/* PWM的高电平和低电平的定时器的重载值 */ unsigned char Highthr0, Hightlr0;unsigned char Lowthr0, Lowtlr0;/* 定时器T1计数装载值 */unsigned char thr1, tlr1;/* PWM 频率计数值 */unsigned long tmp = 0;/******************local functiondefines**************************/void ConfigPWM(unsigned int fr, unsigned char dc); void ConfigTimer1(unsigned int xms);/******************************************************************//*** @brief : 主函数* @param : 无* @retval : 无*/void main(void){P0 = 0xFF; //初始化P0数据口ADDR3 = 1;ENLED = 0; //选择LEDP1 = (P1 & 0xF8) | 0x06; //LEDS6PWMOUT = 1; //初始化为熄灭ConfigPWM(100, 2); //PWM频率为100HZ, 占空比为2% ConfigTimer1(50); //50ms调整一次占空比EA = 1; //开启总中断!while (1); //wait interrupt happen!}/*** @brief : 配置PWM 调制PWM脉冲宽度* @param : PWM的脉冲宽度 PWM的占空比* @retval : 无*/void ConfigPWM(unsigned int fr, unsigned char dc) {unsigned int high = 0, low = 0;tmp = (11059200/12/fr); //fr频率的计数值high = (tmp * dc) / 100; //高电平计数值low = tmp - high; //低电平计数值high = 65536 - high; //高电平的计数定时器装载初值low = 65536 - low; //低电平的计数定时器装载初值Highthr0 = (unsigned char)(high >;>; 8);Hightlr0 = (unsigned char)high; //高电平Lowthr0 = (unsigned char)(low >;>; 8);Lowtlr0 = (unsigned char)low; //低电平/* 配置Timer0 方式1 */TMOD &= 0xF0; //清零T0控制位TMOD |= 0x01; //方式1TH0 = Highthr0;TL0 = Hightlr0; //先装高电平TR0 = 1;ET0 = 1; //开启定时器T0中断}/*** @brief : 配置Timer1,用来调整PWM占空比* @param : 待定时的时间* @retval : 无*/void ConfigTimer1(unsigned int xms){unsigned long tmp;tmp = 11059200/12;tmp = (tmp * xms) / 1000; //定时xms时间需要的计数值tmp = 65536 - tmp; //需要装载的计数初值thr1 = (unsigned char)(tmp >;>; 8);tlr1 = (unsigned char)tmp;TMOD &= 0x0F; //清零T1控制位TMOD |= 0x10; //T1方式1TH1 = thr1;TL1 = tlr1; //装载初值TR1 = 1;ET1 = 1;}/*** @brief : 调整PWM的占空比 (高电平的脉冲宽度)* @param : 占空比 dc* @retval : 无*/void tiaoZhengPWM(unsigned char dc){unsigned int high = 0, low = 0;high = (tmp * dc) / 100; //高电平计数值low = tmp - high; //低电平计数值high = 65536 - high;low = 65536 - low; //计数装载初值Highthr0 = (unsigned char)(high >;>; 8);Hightlr0 = (unsigned char)high; //取高电平计数装载初值Lowthr0 = (unsigned char)(low >;>; 8);Lowtlr0 = (unsigned char)low; //取低电平计数装载初值}/*** @brief : 定时器T0中断服务改变PWM的状态* @param : 无* @retval : 无*/void Timer0_ISP() interrupt 1{if (PWMOUT) //由高电平切换到低电平{TH0 = Lowthr0;TL0 = Lowtlr0; //装载低电平计数初值PWMOUT = 0; //点亮LED}else{TH0 = Highthr0;TL0 = Hightlr0; //装载高电平计数值PWMOUT = 1; //熄灭LED}}/*** @brief : 定时器T1中断服务调整PWM的占空比* @param : 无* @retval : 无*/void Timer1_ISP() interrupt 3{static unsigned char index = 0;static bit bir = 0; //方向标志 (0 小->;大 1 大->;小)TH1 = thr1;TL1 = tlr1;tiaoZhengPWM(pwmTable[index]); //调整PWM占空比if (bir == 0){index++;//递增if (index >;= 31) //到31立刻改变PWM的控制方向,即占空比由大到小变化(LED 暗->;亮){bir = 1; //改变方向}}else{index--;if (index == 0) //到0时立刻改变PWM的方向,即占空比由小到大变化(LED 亮->;暗){bir = 0; //改变方向}}}/**********************************END OF FILE*************new line****************/。

STC单片机C语言程序设计第25章STC单片机增强型PWM原理及实现

STC单片机C语言程序设计第25章STC单片机增强型PWM原理及实现

为0xBA 的位置。当复位后,该寄存器的值为0000x000。
比特位
B7
B6
B5
B4
B3
B2
B1
B0
名字
EAXSF R
0
0
0
-
S4_S
S3_S
S2_S
增强型PWM发生器相关寄存器组
-- 端口配置寄存器
其中,EAXSFR为访问扩展SFR使能控制位。 当该位为0时,指令: MOVX A, @DPTR 或者 MOVX @DPTR, A 操作对象为扩展RAM(XRAM)。 当该位为1时,命令 MOVX A, @DPTR 或者: MOVX @DPTR, A 操作对象为扩展SFR(XSFR)。
增强型PWM发生器相关寄存器组
-- PWM控制寄存器
本节介绍PWM控制寄存器PWMCR。该寄存器位于STC单片机特殊 功能寄存器地址为0xF5的位置。当复位后,该寄存器的值为
00000000。
比特位 B7 B6 B5 B4 B3 B2 B1 B0
名字
ENPW M
ECBI
ENC7O ENC6O ENC5O ENC4O ENC3O ENC2O
注:前提条件是必须使能PWM和ADC,即ENPWM=1,且ADCON=1。
B6 CBTAD C
B5
B4
B3
B2
B1
B0
C7INI
C6INI
C5INI
C4INI
C3INI
C2INI
增强型PWM发生器相关寄存器组
--PWM配置寄存器
C7INI 设置PWM7输出端口的初始电平。当该位为0时,PWM7输出端口 的初始电平为低电平;当该位为 1 时, PWM7 输出端口的初始电平 为高电平。 C6INI 设置 PWM6 输出端口的初始电平。当该位为 0 时, PWM6 输出端口 的初始电平为低电平;当该位为 1 时, PWM6 输出端口的初始电平 为高电平。 C5INI 设置 PWM5 输出端口的初始电平。当该位为 0 时, PWM5 输出端口 的初始电平为低电平;当该位为 1 时, PWM5 输出端口的初始电平 为高电平。

单片机PWM调光程序

单片机PWM调光程序

单片机PWM调光程序一、概述PWM(Pulse Width Modulation,脉宽调制)是一种常用的调光技术,通过控制信号的脉冲宽度来调节输出电平的平均值,从而实现对光源亮度的调节。

本文将介绍如何编写单片机PWM调光程序,并提供一个基于XX单片机的示例代码。

二、硬件准备1. 单片机:XX单片机(型号)2. 光源:LED灯(型号)3. 光敏电阻:用于实时检测环境光强度的元件4. 电路连接:将单片机的PWM输出引脚连接到LED灯的控制引脚,将光敏电阻连接到单片机的模拟输入引脚三、软件设计1. 引入头文件:根据单片机型号,引入相应的头文件,例如"xx.h"。

2. 定义宏:定义LED灯的控制引脚和光敏电阻的模拟输入引脚。

3. 初始化:设置单片机的引脚模式和PWM参数,例如设置PWM频率、占空比等。

4. 光敏检测:通过模拟输入引脚读取光敏电阻的电压值,将其转换为环境光强度的数值。

5. PWM调光:根据光敏检测到的环境光强度数值,计算对应的PWM占空比,并将其输出到LED灯的控制引脚。

四、示例代码```c#include <xx.h> // 引入相应的头文件#define LED_PIN 1 // 定义LED灯的控制引脚#define LDR_PIN 2 // 定义光敏电阻的模拟输入引脚void init_pwm() {// 设置引脚模式为PWM输出pinMode(LED_PIN, PWM_OUTPUT);// 设置PWM参数pwmSetMode(PWM_MODE_MS);pwmSetClock(100); // 设置PWM频率为100HzpwmSetRange(1024); // 设置PWM占空比范围为0-1024 }int read_ldr() {// 读取光敏电阻的电压值int ldr_value = analogRead(LDR_PIN);// 根据电压值转换为环境光强度数值int light_intensity = map(ldr_value, 0, 1023, 0, 100);return light_intensity;}void adjust_brightness(int light_intensity) {// 根据环境光强度计算PWM占空比int pwm_duty_cycle = map(light_intensity, 0, 100, 0, 1023);// 输出PWM占空比到LED灯的控制引脚pwmWrite(LED_PIN, pwm_duty_cycle);}int main() {init_pwm(); // 初始化PWMwhile (1) {int light_intensity = read_ldr(); // 光敏检测adjust_brightness(light_intensity); // PWM调光}return 0;}```五、使用方法1. 将示例代码中的XX单片机型号替换为实际使用的单片机型号。

基于C51单片机的直流电机PWM调速控制(包含原理图及C源代码)

基于C51单片机的直流电机PWM调速控制(包含原理图及C源代码)

基于C51单片机的直流电机PWM调速控制--SQ这是最近一阶段自己学习所获,现分享与大家。

这里采用A T89C52单片机做主控制芯片,实现两路直流电机的PWM调速控制,另外还可以实现转向、显示运行时间、显示档位等注:考虑小直流电机自身因素,调速范围仅设有四级电路原理图:C语言程序源代码:/******************** 硬件资源分配*********************/数码管:显示电机状态(启停、正反、速度)、运行时间、是否转弯按键:K4 启动/暂停K3 正反转/转弯允许K2 加速/左转/运行时间清零K1 减速/右转/停止定时器:T0 数码管动态显示,输出PWMT1 运行时间记录********************************************************//*******主程序文件PWM.c******/#include <reg52.h>#include "Afx.h"#include "Config.c"#define CIRCLE 5 //脉冲周期//按键定义uchar key,key_tmp=0, _key_tmp=0;//显示定义uchar LedState=0xF0; //LED显示标志,0xF0不显示,Ox00显示uchar code LED_code_d[4]={0xe0,0xd0,0xb0,0x70}; //分别选通1、2、3、4位uchar dispbuf[4]={0,0,0,0}; //待显示数组uchar dispbitcnt=0; //选通、显示的位uchar mstcnt=0;uchar Centi_s=0,Sec=0,Min=0; //分、秒、1%秒//程序运行状态标志bit MotState=0; //电机启停标志bit DirState=0; //方向标志0前,1后uchar State1=-1;uchar State2=-1;uchar State3=0;uchar State4=-1;uchar LSpeed=0;uchar RSpeed=0;//其他uint RunTime=0;uint RTime_cnt=0;uint LWidth;uint RWidth; //脉宽uint Widcnt=1;uint Dispcnt;//函数声明void key_scan(void);void DisBuf(void);void K4(void);void K3(void);void K2(void);void K1(void);void disp( uchar H, uchar n );void main(void){P1|=0xF0;EA=1;ET0=1;ET1=1;TMOD=0x11;TH0=0xFC;TL0=0x66; //T0,1ms定时初值TH1=0xDB;TL1=0xFF; //T1,10ms定时初值TR0=1;Widcnt=1;while(1){key_scan();switch(key){case 0x80: K1(); break;case 0x40: K2(); break;case 0x20: K3(); break;case 0x10: K4(); break;default:break;}key=0;DisBuf();LWidth=LSpeed;RWidth=RSpeed;}}//按键扫描**模拟触发器防抖void key_scan(void){key_tmp=(~P3)&0xf0;if(key_tmp&&!_key_tmp) //有键按下{key=(~P3)&0xf0;}_key_tmp=key_tmp ;}//按键功能处理/逻辑控制void K4(void){if(State4==-1){State4=1;TR1=1;dispbuf[3]=1;LedState=0x00; //打开LEDMotState=1; //打开电机LSpeed=1;RSpeed=1; //初速设为1}else if(State4==1){State4=0;TR1=0;MotState=0; //关闭电机}else if(State4==0){MotState=1;if(State3==0){State4=1;TR1=1;}else if(State3==1){LSpeed=2;RSpeed=2;}}}void K3(void){if(State4==1)DirState=!DirState;if(State4==0){if(State3==0){State3=1; //可以转向标志1可以,0不可以TR1=1;dispbuf[3]=9;MotState=1;LSpeed=2;RSpeed=2;}else if(State3==1){State3=0;TR1=0;dispbuf[3]=0;MotState=0;}}}void K2(void){if(State4==1&&LSpeed<4&&RSpeed<4){LSpeed++;RSpeed++;}else if(State4==0){if(State3==0){//State4=-1;//LedState=0xF0;MotState=0;Sec=0;Min=0;}else if(State3==1&&LSpeed<4&&RSpeed<4){//TurnState=0;LSpeed=2;RSpeed++;}}}void K1(void){if(State4==1&&LSpeed>1&&RSpeed>1){LSpeed--;RSpeed--;}else if(State4==0){if(State3==0){State4=-1;LedState=0xF0;MotState=0;}else if(State3==1&&LSpeed<4&&RSpeed<4){//TurnState=1;LSpeed++;RSpeed=2;}}}//显示预处理void DisBuf(void){if(RTime_cnt==100){Sec++;RTime_cnt=0;}if(Sec==60){Min++;Sec=0;}if(State4==1){dispbuf[0]=Sec%10;dispbuf[1]=Sec/10;dispbuf[2]=Min;if(!DirState) //正转dispbuf[3]=LSpeed;if(DirState) //反转dispbuf[3]=LSpeed+4;}if(State4==0){if(State3==0){dispbuf[0]=Sec%10;dispbuf[1]=Sec/10;dispbuf[2]=Min;dispbuf[3]=0;}if(State3==1){dispbuf[0]=RSpeed;dispbuf[1]=LSpeed;dispbuf[2]=Min;dispbuf[3]=9;}}}//LED驱动void disp( uchar H, uchar n ){P1=n;P1|=LedState ;P1|=LED_code_d[H];}//T0中断**显示/方波输出void Time_0() interrupt 1{TH0=0xFC;TL0=0x66;Widcnt++;Dispcnt++;//电机驱动/方波输出if(Widcnt>CIRCLE){Widcnt=1;}if(Widcnt<=LWidth)LMot_P=!DirState&&MotState;elseLMot_P=DirState&&MotState;LMot_M=DirState&&MotState;if(Widcnt<=RWidth)RMot_P=!DirState&&MotState;elseRMot_P=DirState&&MotState;RMot_M=DirState&&MotState;//显示if(Dispcnt==5){disp(dispbitcnt,dispbuf[dispbitcnt]);dispbitcnt++;if(dispbitcnt==4){dispbitcnt=0;}Dispcnt=0;}}//T1中断**运行时间void Time_1() interrupt 3{TH1=0xDB;TL1=0xFF;RTime_cnt++;}/******配置文件Afx.h******/#ifndef _AFX_#define _AFX_typedef unsigned char uchar;typedef unsigned int uint;typedef unsigned long ulong;#endif/******IO配置文件Config.c******/#ifndef _Config_#define _Config_#include "Afx.h"#include <reg52.h>//显示定义sbit led=P3^2;//电机引脚定义sbit LMot_P=P2^2; sbit LMot_M=P2^3; sbit RMot_P=P2^0; sbit RMot_M=P2^1;#endif。

51单片机pwm占空比程序

51单片机pwm占空比程序

51单片机pwm占空比程序摘要:1.51单片机简介2.PWM技术概述3.51单片机PWM占空比程序设计4.程序实现与结果分析正文:1.51单片机简介51单片机是一种经典的8位微控制器,由Intel公司于1981年推出,广泛应用于嵌入式系统领域。

其具有成本低、资源丰富、开发工具成熟等优点,成为众多学习者和工程师的首选。

2.PWM技术概述脉冲宽度调制(PWM)是一种在模拟世界中实现数字控制的方法。

通过改变脉冲的宽度,可以控制输出电压或电流的大小,从而实现对电机、LED亮度等设备的控制。

在51单片机中,可以通过定时器实现PWM信号的生成。

3.51单片机PWM占空比程序设计为了实现51单片机PWM占空比控制,我们需要编写相应的程序。

以下是一个简单的例子:```c#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit PWM_OUT = P1^0; // 定义PWM输出引脚void Init_PWM(void) // 初始化PWM{TMOD = 0x01; // 定时器0工作在方式1TH0 = (65536 - 45872) / 256; // 计算占空比TL0 = (65536 - 45872) % 256;TR0 = 1; // 启动定时器0}void main(void){Init_PWM(); // 初始化PWMwhile (1){PWM_OUT = 0; // 占空比为1,点亮LED_nop_(); _nop_(); _nop_(); _nop_(); // 消隐期,延时PWM_OUT = 1; // 占空比为0,熄灭LED_nop_(); _nop_(); _nop_(); _nop_(); // 消隐期,延时}}```4.程序实现与结果分析上述程序通过初始化定时器0,设置其工作在方式1,即定时器0的计数值达到TH0和TL0的值时,会触发中断。

根据proteus仿真的pwm电机调速

根据proteus仿真的pwm电机调速
2、通过公式及键控实现其直流电机启动、加速、减速和停止等四种形态。
目标:
(1) CPU为8051芯片;
(2) 实验需要4个LED,分别显示启动、加速、减速和停止。
(3) 通过按键开关输入不同的值改变脉冲占空比的控制值从而得到不同的频率脉冲,实现脉冲转变为点评,实现调速功能。
PWM EQU 7FH ;PWM赋初始值
RET
;----
;蜂鸣器响一声子程序
;---
BEEP_BL:
MOV R6,#100
BL1: CALL BL2
CPL BEEP
DJNZ R6,BL1
MOV R5,#25
CALL DELAY2
RET
BL2: MOV R7,#180
BL3: NOP
DJNZ R7,BL3
RET
DELAY2: ;延时R5×10MS
if (!P1_5)
{
ZKB1--;
ZKB2=100-ZKB1;
}
}
/*对占空比值限定范围*/
if (ZKB1>99) ZKB1=1;
if (ZKB1<1) ZKB1=99;
}
}
/******************************************************
*函数功能:对系统进行初始化,包括定时器初始化和变量初始化*/
P1_0=0;
else
P1_0=1;
if (click<=ZKB2)
P1_1=0;
else
P1_1=1;
}
三、proteus仿真图
ORG 0030H
;----
;主程序
;定时器0工作在模式1,定时器1工作在模式2。

单片机PWM调光程序

单片机PWM调光程序

单片机PWM调光程序随着科技的不断发展,单片机作为一种重要的电子元器件,被广泛应用于各个领域。

其中,PWM调光程序是单片机应用中的一个重要方面。

本文将探讨单片机PWM调光程序的原理和实现方法。

一、PWM调光的原理PWM调光是通过改变信号的占空比来控制电源输出的电压或者电流,从而实现对光源亮度的调节。

在PWM调光中,通过快速的开关操作,使电源以高频率的脉冲信号供电,通过改变脉冲信号的占空比来控制电源输出的平均电压或者电流。

当脉冲信号的占空比为100%时,电源输出的电压或者电流为最大值;当占空比为0%时,电源输出的电压或者电流为最小值。

二、单片机PWM调光的实现方法1. 硬件实现方法单片机PWM调光的硬件实现方法主要涉及到三个方面的元器件:单片机、脉冲宽度调制模块和光源。

首先,需要选择一款支持PWM输出的单片机,如常见的51系列单片机或者STM32系列单片机。

其次,需要使用脉冲宽度调制模块来生成PWM信号。

脉冲宽度调制模块可以是单片机内部的硬件模块,也可以是外部的PWM芯片。

最后,需要将PWM信号输出到光源,通过光源的亮度调节来实现PWM调光。

2. 软件实现方法单片机PWM调光的软件实现方法主要是通过编写程序来控制单片机输出的PWM信号。

首先,需要初始化单片机的定时器和IO口,设置PWM输出的频率和占空比。

然后,在主程序中,通过改变占空比的值来实现对光源亮度的调节。

具体的实现方法可以根据不同的单片机型号和开辟环境进行调整。

三、单片机PWM调光的应用单片机PWM调光广泛应用于各个领域,如照明、舞台灯光、电子显示屏等。

在照明领域,通过PWM调光可以实现对灯具亮度的精确控制,满足不同场景下的照明需求。

在舞台灯光中,通过PWM调光可以实现灯光的渐变效果,增强舞台效果。

在电子显示屏中,通过PWM调光可以实现对显示屏亮度的调节,提高显示效果。

四、单片机PWM调光的优势相比于传统的调光方法,单片机PWM调光具有以下几个优势。

基于51单片机的PWM直流电机调速系统

基于51单片机的PWM直流电机调速系统

基于51单片机的PWM直流电机调速系统一、本文概述随着现代工业技术的飞速发展,直流电机调速系统在众多领域如工业自动化、智能家居、航空航天等得到了广泛应用。

在众多调速方案中,基于脉冲宽度调制(PWM)的调速方式以其高效、稳定、易于实现等优点脱颖而出。

本文旨在探讨基于51单片机的PWM直流电机调速系统的设计与实现,以期为相关领域的技术人员提供一种可靠且实用的电机调速方案。

本文将简要介绍PWM调速的基本原理及其在直流电机控制中的应用。

随后,将详细介绍基于51单片机的PWM直流电机调速系统的硬件设计,包括电机选型、驱动电路设计、单片机选型及外围电路设计等。

在软件设计部分,本文将阐述PWM信号的生成方法、电机转速的检测与控制算法的实现。

还将对系统的性能进行测试与分析,以验证其调速效果及稳定性。

本文将总结基于51单片机的PWM直流电机调速系统的优点与不足,并提出改进建议。

希望通过本文的阐述,能为相关领域的研究与应用提供有益参考。

二、51单片机基础知识51单片机,也被称为8051微控制器,是Intel公司在1980年代初推出的一种8位CISC(复杂指令集计算机)单片机。

尽管Intel公司已经停止生产这种芯片,但由于其架构的通用性和广泛的应用,许多其他公司如Atmel、STC等仍然在生产与8051兼容的单片机。

51单片机的核心部分包括一个8位的CPU,以及4KB的ROM、低128B 的RAM和高位的SFR(特殊功能寄存器)等。

它还包括两个16位的定时/计数器,四个8位的I/O端口,一个全双工的串行通信口,以及一个中断系统。

这些功能使得51单片机在多种嵌入式系统中得到了广泛的应用。

在PWM(脉冲宽度调制)直流电机调速系统中,51单片机的主要作用是生成PWM信号以控制电机的速度。

这通常是通过定时/计数器来实现的。

定时/计数器可以设置一定的时间间隔,然后在这个时间间隔内,CPU可以控制I/O端口产生高电平或低电平,从而形成PWM信号。

stc8g1k08pwm程序范例

stc8g1k08pwm程序范例

STC8G1K08PWM程序范例1. 背景介绍STC8G1K08是一款由汇顶科技推出的单片机芯片,拥有多种功能和丰富的外设资源。

作为一款8位微控制器,STC8G1K08在嵌入式系统领域有着广泛的应用。

其中,PWM(Pulse Width Modulation)是其重要的特性之一,可以用来控制电机、LED等外围设备。

2. PWM原理PWM是一种调整脉冲信号的占空比来控制电压的技术。

在STC8G1K08中,PWM信号可以通过定时器和捕获/比较单元(TCCU)来生成。

通过调整PWM信号的占空比,可以实现对外围设备的精确控制。

3. STC8G1K08PWM程序设计下面以LED亮度调节为例,介绍如何在STC8G1K08上设计PWM程序。

3.1 硬件连接将LED连接到STC8G1K08的IO口上,通过电阻限流,确保LED电流在安全范围内。

3.2 软件设计在STC-ISP芯片编程软件评台上,新建一个工程,选择STC8G1K08芯片类型,并进行初始化设置。

3.3 编写PWM程序在主函数中,编写如下的PWM程序代码:```c#include <STC8G1K08S2.H>#define LED_PIN P1_4void m本人n(){TMOD = 0x01; // 使用定时器0模式1TH0 = 0xFA; // 设置定时器初值TL0 = 0xFA; // 设置定时器初值TR0 = 1; // 启动定时器ET0 = 1; // 开定时器0中断EA = 1; // 总中断打开while (1){// 业务代码}}void timer0() interrupt 1 // 定时器0中断服务程序{static unsigned chart = 0;t++;if t <= 50) // 50个计数形成一个脉冲周期{LED_PIN = 1; // 点亮LED}else{LED_PIN = 0; // 熄灭LEDif t >= 100) // 脉冲周期结束{t = 0; // 重新计数}}}```4. 程序原理解析上述程序使用定时器0中断来产生PWM信号。

c单片机C语言编写的PWM程序

c单片机C语言编写的PWM程序

89c51单片机C语言编写的PWM程序PWM, 单片机, C语言, 程序, 编写分享到:新浪微博 QQ空间开心网人人网说明:本程序使用STC89C52RC单片机,22.1184MHz晶振,要使用本程序需要自己修改,我是用来控制直流电机的,外接了L298驱动电路,有问题或意见请回复,谢谢^_^#include "reg52.H"#include "MyType.h"//=============L298端口定义===============sbit ENA = P3^6;?//左轮驱动使能sbit IN1 = P0^3;?//左轮黑线(-)sbit IN2 = P0^4;?//左轮红线(+)sbit IN3 = P0^5;?//右轮红线(-)sbit IN4 = P0^6;?//右轮黑线(+)sbit ENB = P3^7;?//右轮驱动使能//=============PWM================#define PWM_COUST 100?//PWM细分等份uchar MOTO_speed1;??//左边电机转速uchar MOTO_speed2; ??//右边电机转速uchar PWM_abs1;???//左边电机取绝对值后占空比uchar PWM_abs2;???//左边电机取绝对值后占空比?uchar PWM_var1=20;??//左边电机直走速度(不同的电机,此参数不同)uchar PWM_var2=20;??//右边电机直走速度uchar PWMAnd = 0;??//PWM自增变量/****************************************************************** 名称:motor(char speed1,char speed2);功能:同时调节电机的转速参数:speed1:电机1的PWM值;speed2:电机2的PWM值?? speed>0.正转;speed<0.反转(-100~100)调用:extern int abs(int val); 取绝对值返回:/******************************************************************/ void motor(char speed1,char speed2){??//==============左边电机=============?if (speed1>0)??{??IN1 =0;IN2 =1;//正转??}???else if (speed1<0)??{??IN1 =1;IN2 =0;//反转??}?//==============右边电机=============?if (speed2>0)??{??IN3 =1;IN4 =0;//正转??}?else if (speed2<0)??{??IN3 =0;IN4 =1;//反转??}}/******************************************************************名称:motor_PWM();功能:PWM占空比输出参数:无调用:无返回:无/******************************************************************/void motor_PWM (){?uchar PWM_abs1;?uchar PWM_abs2;?PWM_abs1=MOTO_speed1;?PWM_abs2=MOTO_speed2;?if (PWM_abs1>PWMAnd) ENA=1;??? //左边电机占空比输出??else ENA=0;?if (PWM_abs2>PWMAnd) ENB=1;??? //右边电机占空比输出??else ENB=0;?if (PWMAnd>=PWM_COUST) PWMAnd=0;? //PWM计数清零??else PWMAnd+=1;}???/******************************************************************名称:void TIME_Init ();功能:定时器初始化指令:调用:无返回:无/******************************************************************/void TIME_Init ()?{//=========定时器T2初始化 PWM==================?T2CON = 0x00;? ?T2MOD = 0x00;? ?RCAP2H = 0xff;?//定时0.1ms? ?RCAP2L = 0x47;? ?TH2 = 0xff;? ?TL2 = 0x47;?ET2 = 1;??//定时器2中断开?TR2 = 1;??//PWM定时器关,PWM周期为10ms?}/******************************************************************名称:void PWM_Time2 () interrupt 5功能:T2中断,PWM控制参数:调用:motor_PWM();//PWM占空比输出返回:/******************************************************************/?void PWM_Time2 () interrupt 5{? ?TR2 = 0;?TF2 = 0;?ET2 = 0;?//定时器0中断禁止?motor_PWM();//PWM占空比输出?ET2 = 1;?//定时中断0开启?TR2 = 1;}main(){TIME_Init ()?;motor(50,50);//左右电机的转速都是50}。

STM8的C语言编程(14) PWM

STM8的C语言编程(14)   PWM
TIM2_CCMR2 = TIM2_CCMR2 | 0x70;// Output mode PWM2. // 通道 2 被设置成比较输出方式 // OC2M = 111,为 PWM 模式 2, // 向上计数时,若计数器小于比较值,为无效电平 // 即当计数器在 0 到比较值时,输出为 1,否则为 0
// 程序描述:用 PWM 输出驱动 LED
#include "STM8S207C_S.h"
void CLK_Init(void); void TIM_Init(void);
// 函数功能:延时函数 // 输入参数:ms -- 要延时的毫秒数,这里假设 CPU 的主频为 2MHZ // 输出参数:无 // 返 回 值:无 // 备 注:无 void DelayMS(unsigned int ms)
DelayMS(5);
}
// 下面的循环将占空比逐渐从 50%递减到 0
for(i=128;i>0;i--) {
TIM2_CCR2H = 0; TIM2_CCR2L = i; DelayMS(5); } } }
TIM2_ARRH = 0; TIM2_ARRL = 0xFF;
//初始化比较寄存器,决定 PWM 方波的占空比 TIM2_CCR2H = 0; TIM2_CCR2L = 0;
// 初始化时钟分频器为 1,即计数器的时钟频率为 Fmaster=4MHZ TIM2_PSCR = 0;
// 启动计数 TIM2_CR1 = TIM2_CR1 | 0x01;
{
CLK_CKDIVR = 0x11;
// 10: fHSI = fHSI RC output/ 4
//
= 16MHZ / 4 =4MHZ

单片机-占空比可调的PWM波形发生器讲解

单片机-占空比可调的PWM波形发生器讲解

微控制器技术课程设计报告设计题目:占空比可调的PWM波形发生器微控制器技术课程设计任务书设计题目:占空比可调的PWM波形发生器设计时间:——设计任务:在Proteus中画出原理图或使用实物,编制程序,实现以下功能:1、理解PWM的工作原理。

2、编制PWM程序,使用八段发光字符管显示占空比。

3、可与电机连接,驱动电机以不同的转速旋转。

背景资料:1、单片机原理与应用2、检测技术3、计算机原理与接口技术进度安排:1、第一天,领取题目,熟悉设计内容,分解设计步骤和任务;2、第2天,规划设计软硬件,编制程序流程、绘制硬件电路。

3、第3天,动手制作硬件电路,或编写软件,并调试。

4、第4天,中期检查,书写设计报告。

5、第5天,提交设计报告,整理设计实物,等待答辩。

6、第6天,设计答辩。

题目:占空比可调的PWM波形发生器一、设计目的掌握PWM的工作原理;学会编制PWM程序,使用八段发光字符管显示占空比;并与电机连接,驱动电机以不同的转速旋转。

二、设计思路直流电机PWM控制系统的主要功能包括:实现对直流电机转速的调整,能够很方便的实现电机的智能控制。

主体电路:即直流电机PWM控制模块。

这部分电路主要由AT89C51单片机的I/O端口、定时计数器、外部中断扩展等调整直流电机的转速,能够很方便的实现电机的智能控制。

其间是通过AT89C51单片机产生脉宽可调的脉冲信号并输入到L298驱动芯片来控制直流电机工作的。

该直流电机PWM控制系统由以下电路模块组成:设计输入部分:这一模块主要是利用带中断的独立式键盘来实现对直流电机的加速、减速控制。

设计控制部分:主要由AT89C51单片机的外部中断扩展电路组成。

直流电机PWM控制实现部分主要由一些二极管、电机和L298直流电机驱动模块组成。

设计显示部分: LED数码显示部分,实现对PWM脉宽调制占空比的实时显示。

三、方案设计系统框架设计总体设计方案的硬件部分详细框图如图一所示。

入模块、LED显示模块及电机驱动模块组成。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

下面介绍一下单片机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
static uchar time;
TF2=0;
if(++time==pluse) PWM=0; //达到脉宽设定值时,输出PWM低电平 else if(time==40) //PWM的频率为1khz左右
{
time=0;
PWM=1;
}
}
void InitTimer2(void) //初始化函数
{
RCAP2H = 0xff ;//定时25us初值
RCAP2L = 0x0e7;//
ET2=1;
EA=1;
TR2=1;
}
void main(void)
{
InitTimer2();
while(1)
pluse=20;
}
}
把PWM波的周期定为1ms,占空比分40级可调(即每级差2.5%),这样定时器T2每25us产生一个定时中断,每40次中断后进入下一个PWM波的周期。

在程序中,pluse=20,即占空比为50%,输出的平均电压为12*50%=6V。

PWM 产生的过程是这样的,开始时PWM为1,当计时到达pluse时(即到达了设定的脉宽宽度时间)PWM=0,随后到达PWM周期时间后PWM=1,此时下一个PWM 周期重新开始。

相关文档
最新文档