173 2438 5004
KEROS加密芯片——品牌直销 | 免费样品 | 技术支持
当前位置:网站首页 > 资讯中心 正文 资讯中心

pwm电机单片机

htxw 2023-03-14 资讯中心 12 ℃

51单片机实现pwm对电机调速

可以用一个定时器实现,也可以用两个定时器实现

一个定时器实现办法,如定时器定时50US中断一次,中断100次是5ms,即PWM的周期

每次中断,变量a加1,并且a与另一变量b比较,如果ab,让某一管脚输出高电平,如果a=b,则让其输出低电平,a等于100时清0,这样占空比是b/100,改变b的值,就可以改变占空比

缺点定时器定时时间不能太短,例如10us中断程序根本执行不完,若占空比调节精度要求较高,如要求百分之一,则a需大于100,这样PWM波的周期就比较大,频率比较低

两个定时器,如一个定时器0定时100us,另外一个定时器1定时小于100us,如b

us

定时器0中断时输出高电平,并打开定时器1,定时器1负责置低电平

这样,就可以产生周期100us,占空比是b/100的方波

频率可以比用一个定时器高一些

单片机输出地PWM信号的“占空比”和“电机转速”有什么对应的关系?

一种情况,对于电阻,直流电机来说,有占空比虽然从微观来说是波,但从宏观来说,就相当于将输入电压打个折扣再输出,输入5伏,占空比是50%,那么输出就是2。5伏,一般来说,直流电机的转速是和其输入电压成正比的。

还有种情况,就是通过连续改变PWM的占空比,将直流电切成大小不一,有规律的波形,宏观上形成不同频率的正弦波,这就叫斩波。通过斩波可以产生任意频率的交流电,而交流电机的转速只跟交流电的频率相关,如果是同步电机是严格相关的,异步电机则要根据其设计特性和负载的不同略有差别。

简单理解的说:占空比越大,电机转速越快,但是他们之间并不是正比关系,比较复杂吧,只能说是:正相关 的关系。

没有公式,如果你想得知你的电机转速,不是通过公式计算出来的,而是应该利用测速装置检测出来的。

转速与PWM信号之间没有公式,因为关系非常复杂。

基于单片机的pwm小功率直流电机调速

直流调速器就是调节直流电动机速度的设备,上端和交流电源连接,下端和直流电动机连接,直流调速器将交流电转化成两路输出直流电源,一路输入给直流电机砺磁(定子),一路输入给直流电机电枢(转子),直流调速器通过控制电枢直流电压来调节直流电动机转速。同时直流电动机给调速器一个反馈电流,调速器根据反馈电流来判断直流电机的转速情况,必要时修正电枢电压输出,以此来再次调节电机的转速。

直流电机的调速方案一般有下列3种方式:

1、改变电枢电压;

2、改变激磁绕组电压;

3、改变电枢回路电阻。

使用单片机来控制直流电机的变速,一般采用调节电枢电压的方式,通过单片机控制PWM1,PWM2,产生可变的脉冲,这样电机上的电压也为宽度可变的脉冲电压。根据公式

U=aVCC

其中:U为电枢电压;a为脉冲的占空比(0a1);VCC直流电压源,这里为5V。

电动机的电枢电压受单片机输出脉冲控制,实现了利用脉冲宽度调制技术(PWM)进行直流电机的变速。

因为在H桥电路中,只有PWM1与PWM2电平互为相反时电机才能驱动,也就是PWM1与PWM2同为高电平或同为低电平时,都不能工作,所以上图中的实际脉冲宽度为B,

我们把PWM波的周期定为1ms,占空比分100级可调(每级级差为10%),这样定时器T0每0.01ms产生一次定时中断,每100次后进入下一个PWM波的周期。上图中,占空比是60%,即输出脉冲的为0.6ms,断开脉冲为0.4ms,这样电枢电压为5*60%=3V。

我们讨论的是可以正转反转的,如果只按一个方向转,我们就只要把PWM1置为高电平或低电平,只改变另一个PWM2电平的脉冲变化即可,,如下图(Q4导通,Q3闭合,电机只能顺时针调整转动速度)

C语言代码:

#includeAT89X52.h

#define uchar unsigned char

#define uint unsigned int

sbit K5=P1^4;

sbit K6=P1^5;

sbit PWM1=P1^0;

sbit PWM2=P1^1;

sbit FMQ=P3^6;

uchar ZKB1,ZKB2;

void delaynms(uint aa)

{

uchar bb;

while(aa--)

{

for(bb=0;bb115;bb++) //1ms基准延时程序

{

;

}

}

}

void delay500us(void)

{

int j;

for(j=0;j57;j++)

{

;

}

}

void beep(void)

{

uchar t;

for(t=0;t100;t++)

{

delay500us();

FMQ=!FMQ; //产生脉冲

}

FMQ=1; //关闭蜂鸣器

delaynms(300);

}

void main(void)

{

TR0=0; //关闭定时器0

TMOD=0x01; //定时器0,工作方式1

TH0=(65526-100)/256;

TL0=(65526-100)%256; //100us即0.01ms中断一次

EA=1; //开总中断

ET0=1; //开定时器0中断

TR0=1; //启动定时器T0

ZKB1=50; //占空比初值设定

ZKB2=50; //占空比初值设定

while(1)

{

if(!K5)

{

delaynms(15); //消抖

if(!K5) //确定按键按下

{

beep();

ZKB1++; //增加ZKB1

ZKB2=100-ZKB1; //相应的ZKB2就减少

}

}

if(!K6)

{

delaynms(15); //消抖

if(!K6) //确定按键按下

{

beep();

ZKB1--; //减少ZKB1

ZKB2=100-ZKB1; //相应的ZKB2增加

}

}

if(ZKB199)

ZKB1=1;

if(ZKB11)

ZKB1=99;

}

}

void time0(void) interrupt 1

{

static uchar N=0;

TH0=(65526-100)/256;

TL0=(65526-100)%256;

N++;

if(N100)

N=0;

if(N=ZKB1)

PWM1=0;

else

PWM1=1;

if(N=ZKB2)

PWM2=0;

else

PWM2=1;

}

//显现:电机转速到最高后,也就是N为1或99时,再按一下,就变到99或1,

//电机反方向旋转以最高速度

单片机利用pwm控制电机,L298N有四个输入端,两个使能端,怎么产生两路pwm波?

这是利用L298驱动两个直流电机的(来源于智能车循迹)程序,/* =======直流电机的PWM速度控制程序======== */

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

#includelt;reg51.hgt;

#includelt;math.hgt;

#define uchar unsigned char

#define uint unsigned int

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

sbit en2=P1^1; /* L298的Enable B */

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

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

sbit s3=P1^4; /* L298的Input 3 */

sbit s4=P1^5; /* L298的Input 4 */

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

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

uchar m2=0; /* 电机2速度值 */

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

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

void motor(uchar index, char speed)

{

if(speedgt;=-100 amp;amp; speedlt;=100)

{

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

{

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

if(speedlt;0) /* 速度值为负则反转 */

{

s1=0;

s2=1;

}

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

{

s1=1;

s2=0;

}

}

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

{

m2=abs(speed); /* 电机2的速度控制 */

if(speedlt;0) /* 电机2的方向控制 */

{

s3=0;

s4=1;

}

else

{

s3=1;

s4=0;

}

}

}

}

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

{

for(j;jgt;0;j--);

}

void main()

{

uchar i;

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

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

TL0=0x9B;

EA=1; /* 开中断 */

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

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

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

{

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

{

motor(1,i);

motor(2,i);

delay(5000);

}

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

{

motor(1,i);

motor(2,i);

delay(5000);

}

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

{

motor(1,-i);

motor(2,-i);

delay(5000);

}

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

{

motor(1,-i);

motor(2,-i);

delay(5000);

}

}

}

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

{

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

{

tmp1=m1;

tmp2=m2;

}

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

if(tlt;tmp2) en2=1; else en2=0; /* 产生电机2的PWM信号 */

t++;

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

单片机pwm控制电机转速

单片机控制电机转速:

如果只有一个转向的话就比较容易了,如果要有正反两个转向,就需要一个H桥,并且两个I/O口输出高低电频控制。

比如用P1口的P1.0,P1.1,P1.2三个I/O口接按键,P3.4口接电频输出,编个定时程序及按键程序,如果是快(全速运行),那就P3.4口直接输出高电频“1”;中(50%),那就让P3.4口0—50ms输出高电频“1”,50ms—100ms输出低电频“0”,后面就一直以50ms进行一次取反;慢(就用10%吧),0—40ns输出高电频“1”,41ns—400ns输出低电频“0”,这样为一个周期,后面就一直循环吧。

如果按键P1.0按下,执行方式1,全速运行,否则以默认方式运行;按键P1.1按下,执行方式2,改变占空比,以50%的速度运行,否则,不作改变;按键P1.2按下,执行方式3,改变占空比,以10%的速度运行,否则,不作改变。

单片机PWM直流电机问题

1、所谓的pwm就是高低变化的方波,单片机可以实现,建议选择有pwm功能的单片机;

2、精度不高的话,可以用简单一点的码盘来测速,直接计数就行;精度高的话,可以用编码器,推荐avagotech的heds9710系列编码器;

3、单片机可以设定为在没有发生中断时读取键盘;若正在读取键盘时产生了中断,则保存当前状态,执行中断,之后再继续读取键盘。所以不会影响pwm信号的。这个要在程序里注意的,比如读键盘的时候不能关闭中断,否则就不能产生pwm信号了。

pwm电机单片机的介绍就聊到这里吧,感谢您花时间阅读,谢谢。

本文标签:pwm电机单片机

<