/* 晶振采用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
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)