用C51编写由T0T1口输出PWM波,占空比在19,频率可调的的程序,急

用C51编写由T0T1口输出PWM波,占空比在19,频率可调的的程序,急,第1张

调其中的speed,即时调整占空比,调t即是调周期的长短

/* 晶振采用11.0592M,产生的PWM的频率约为91Hz */

#include<reg51.h>

#include<math.h>

#define uchar unsigned char

#define uint unsigned int

sbit en1=P1^0/* L298的Enable A */

sbit s1=P1^2/* L298的Input 1 */

sbit s2=P1^3/* L298的Input 2 */

uchar t=0/* 中断计数器 */

uchar m1=0/* 电机1速度值 */

uchar tmp1,tmp2/* 电机当前速度值 */

/* 电机控制函数 index-电机号(1,2)speed-电机速度(-100—100) */

void motor(uchar index, char speed)

{

if(speed>=-100 &&speed<=100)

{

if(index==1) /* 电机1的处理 */

{

m1=abs(speed)/* 取速度的绝对值 */

if(speed<0) /* 速度值为负则反转 */

{

s1=0

s2=1

}

else /* 不为负数则正转 */

{

s1=1

s2=0

}

}

}

}

void delay(uint j) /* 简易延时函数 */

{

for(jj>0j--)

}

void main()

{

uchar i

TMOD=0x02/* 设定T0的工作模式为2 */

TH0=0x9B/* 装入定时器的初值 */ 定时101us

TL0=0x9B

EA=1/* 开中断 */

ET0=1/* 定时器0允许中断 */

TR0=1/* 启动定时器0 */

while(1) /* 电机实际控制演示 */

{

for(i=0i<=100i++) /* 正转加速 */

{

motor(1,i)

delay(5000)

}

for(i=100i>0i--) /* 正转减速 */

{

motor(1,i)

delay(5000)

}

for(i=0i<=100i++) /* 反转加速 */

{

motor(1,-i)

delay(5000)

}

for(i=100i>0i--) /* 反转减速 */

{

motor(1,-i)

delay(5000)

}

}

}

void timer0() interrupt 1 /* T0中断服务程序 */

{

if(t==0) /* 1个PWM周期完成后才会接受新数值 */

{

tmp1=m1

tmp2=m2

}

if(t<tmp1) en1=1else en1=0/* 产生电机1的PWM信号 */

t++

if(t>=100) t=0/* 1个PWM信号由100次中断产生 */

}

这个问题不是在这个篇幅内能说清楚的。简短地说,交流电机调速有交流电机的pwm驱动方式,直流电机调速有直流电机的pwm驱动方式。

交流电机的pwm调速原理,主要通过一个频率可变的交流低频信号,去调制一个高频方波驱动电压,从而在电机电枢中得到一个随调制信号频率变化的驱动电流。于是交流电机电枢就在这个电流驱动下,产生与调制信号频率一致的旋转磁场,使得电机转子旋转速度发生改变。它的调制方式是调频。

直流电机的pwm调速原理与交流电机调速原理不同,它不是通过调频方式去调节电机的转速,而是通过调节驱动电压脉冲宽度的方式,并与电路中一些相应的储能元件配合,改变了输送到电枢电压的幅值,从而达到改变直流电机转速的目的。它的调制方式是调幅。

下面这个程序是应用在stc上的pwm程序,测试成功

#includesfr CCON =0xD8 //PCA control register

sfr CMOD =0xD9

sfr CL =0xe9

sfr CH =0xF9

sfr CCAP0L=0xea

sfr CCAP1L=0xeb

sfr CCAP0H=0xfa

sfr CCAP1H=0xfb

sfr CCAPM0=0xda

sfr CCAPM1=0xdb

sbit CR=0xde//位寻址

void main(void)

{

CMOD=0x02 //使用系统时钟,时钟输入源频率fosc/2。PWM频率=fosc/2/256

/************************************

7 6 5 4 3 21 0

CIDL- - - cps2CPS1 CPS0 ECF

CIDL: =0时,空闲模式下PCA计数器继续工作;=1时,空闲模式下PCA计数器停止工作。

CPS2,CPS1,CPS0:PCA计数脉冲选择。010,定时器0的溢出,可以实现可调频率的PWM输出。

ECF: =1时,使能寄存器CCON CF位的中断;=0时,禁止该功能。

***************************************/

CL=0x00

CH=0x00

CCAP0L=0xc0//当CL小于CCAP0L时,输出为低大于时,输出为高。

CCAP0H=0x7f//当CL由ff变为00溢出时,CCAP0H装载到CCAP0L中,实现无干扰的更新PWM。

CCAP1L=0xc0//当CL小于CCAP1L时,输出为低大于时,输出为高。

CCAP1H=0xc0//当CL由ff变为00溢出时,CCAP1H装载到CCAP1L中,实现无干扰的更新PWM。

CCAPM0=0X42//使能PWM模式,PWM0=1,ECOM0=1

CCAPM1=0X42//使能PWM模式,PWM1=1,ECOM1=1

CR=1 //启动PCA计数器

while(1)

{

CCAP0H=RF4432_TxRxBuf[4] //此处改变占空比

CCAP1H=RF4432_TxRxBuf[5]

CCAP2H=RF4432_TxRxBuf[6]/2.5

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12008447.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存