Ⅰ 单片机中pwm产生的三角波用来控制电机正反转及调速的原理
中央对齐模式就是三角波了
Ⅱ 用过单片机pwm控制电机的进,怎样控制电机正反转,说下原理即可
不是这样的,驱动是指的电机驱动电路,不是指的就连到电机上的某个引线,看下这个原理图可能你会理解什么是驱动电路。
Ⅲ 基于单片机的pwm小功率直流电机调速
直流调速器就是调节直流电动机速度的设备,上端和交流电源连接,下端和直流电动机连接,直流调速器将交流电转化成两路输出直流电源,一路输入给直流电机砺磁(定子),一路输入给直流电机电枢(转子),直流调速器通过控制电枢直流电压来调节直流电动机转速。同时直流电动机给调速器一个反馈电流,调速器根据反馈电流来判断直流电机的转速情况,必要时修正电枢电压输出,以此来再次调节电机的转速。
直流电机的调速方案一般有下列3种方式:
1、改变电枢电压;
2、改变激磁绕组电压;
3、改变电枢回路电阻。
使用单片机来控制直流电机的变速,一般采用调节电枢电压的方式,通过单片机控制PWM1,PWM2,产生可变的脉冲,这样电机上的电压也为宽度可变的脉冲电压。根据公式
U=aVCC
其中:U为电枢电压;a为脉冲的占空比(0<a<1);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语言代码:
#include<AT89X52.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;bb<115;bb++) //1ms基准延时程序
{
;
}
}
}
void delay500us(void)
{
int j;
for(j=0;j<57;j++)
{
;
}
}
void beep(void)
{
uchar t;
for(t=0;t<100;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(ZKB1>99)
ZKB1=1;
if(ZKB1<1)
ZKB1=99;
}
}
void time0(void) interrupt 1
{
static uchar N=0;
TH0=(65526-100)/256;
TL0=(65526-100)%256;
N++;
if(N>100)
N=0;
if(N<=ZKB1)
PWM1=0;
else
PWM1=1;
if(N<=ZKB2)
PWM2=0;
else
PWM2=1;
}
//显现:电机转速到最高后,也就是N为1或99时,再按一下,就变到99或1,
//电机反方向旋转以最高速度
Ⅳ 单片机控制PWM直流电机(通过L298芯片)正反转、加减速
/* =======直流电机的PWM速度控制程序======== */
/* 晶振采用11.0592M,产生的PWM的频率约为91Hz */
#include<reg51.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
sbit en1=P2^0; /* L298的Enable A */
sbit en2=P2^1; /* L298的Enable B */
sbit s1=P2^2; /* L298的Input 1 */
sbit s2=P2^3; /* L298的Input 2 */
sbit s3=P2^4; /* L298的Input 3 */
sbit s4=P2^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(speed>=-100 && speed<=100)
{
if(index==1) /* 电机1的处理 */
{
m1=abs(speed); /* 取速度的绝对值 */
if(speed<0) /* 速度值为负则反转 */
{
s1=0;
s2=1;
}
else /* 不为负数则正转 */
{
s1=1;
s2=0;
}
}
if(index==2) /* 电机2的处理 */
{
m2=abs(speed); /* 电机2的速度控制 */
if(speed<0) /* 电机2的方向控制 */
{
s3=0;
s4=1;
}
else
{
s3=1;
s4=0;
}
}
}
}
void delay(uint j) /* 简易延时函数 */
{
for(j;j>0;j--);
}
void main()
{
char i;
TMOD=0x02; /* 设定T0的工作模式为2 */
TH0=0x9B; /* 装入定时器的初值 */
TL0=0x9B;
EA=1; /* 开中断 */
ET0=1; /* 定时器0允许中断 */
TR0=1; /* 启动定时器0 */
while(1) /* 电机实际控制演示 */
{
for(i=0;i<=100;i++) /* 正转加速 */
{
motor(1,i);
motor(2,i);
delay(5000);
}
for(i=100;i>0;i--) /* 正转减速 */
{
motor(1,i);
motor(2,i);
delay(5000);
}
for(i=0;i<=100;i++) /* 反转加速 */
{
motor(1,-i);
motor(2,-i);
delay(5000);
}
for(i=100;i>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(t<tmp1) en1=1; else en1=0; /* 产生电机1的PWM信号 */
if(t<tmp2) en2=1; else en2=0; /* 产生电机2的PWM信号 */
t++;
if(t>=100) t=0; /* 1个PWM信号由100次中断产生 */
}
本人也是在网上找到的,测试过,正确的,能实现,这段时间也在弄这,希望能帮助你
Ⅳ 51单片机PWM怎么正反转呢帮我看下代码怎么改,谢谢
unsigned char bdata Bits;
sbit bit = Bits^0;//定义1个位变量
unsigned char T5S;定义1个5秒计时变量
void main(void)
{
bit = 0;//位变量清0
T5S = 0xxx;//赋5秒倒计数初值
egine = 0;关闭电机
agine = 0;
EA=1; //开启中断程序(into) //开段序
ET0=1; //开启T0中断程序(into) //中程
TR0=1; //打开T0中断
while(1)
{
if(!ET0)//如果5秒计时结束
{
delay()//调用1个1秒的循环延时,电机停1秒
T5S = 0xxx;//重新赋初值
ET0 = 1;//重新开放T0中断
}
}
}
void into(void) interrupt 1
{
T5S--;
if(!T5S){bit = ~bit;ET0 = 0;}//取反位变量,关闭T0中断
whole--;
last--;
if(whole==0)
{whole=7;
last=2;
if(!bit)//判断位变量决定电机转动方向
{
egine =1;//电机正转
agine = 0;
}
else
(
agine = 1;//电极反转
egine =0;
}
}
else
{if(last==0)
{
egine =0;
agine = 0;
}
}
TH0 = 0x0FF;
TL0 = 0x9C;
}
delay()//1秒延时子程序
{
.........
}
以上修改的程序供参考,5秒和1秒的定时参数涉及单片机时钟频率,你自己解决,希望能帮到你。
Ⅵ 用单片机来控制直流电动机的正反转、加减速的程序如何写啊
正反转就是电流流向改变就可以.加减速度主要是电动机电压大小控制就可以了.具体的要有硬件才可以实现的.
Ⅶ 51单片机电机正反转控制程序
正转:PWM1高电平,PWM2低电平;
反转:PWM1低电平,PWM2高电平;
Ⅷ 51单片机pwm直流电机怎么实现调速和正反转
如果要正反转控制,驱动电路做个全桥的,控制占空比。50%的话就停止了!
Ⅸ 51单片机实现pwm对电机调速
可以用一个定时器实现,也可以用两个定时器实现
一个定时器实现办法,如定时器定时50US中断一次,中断100次是5ms,即PWM的周期
每次中断,变量a加1,并且a与另一变量b比较,如果a<b,让某一管脚输出高电平,如果a>=b,则让其输出低电平,a等于100时清0,这样占空比是b/100,改变b的值,就可以改变占空比
缺点定时器定时时间不能太短,例如10us中断程序根本执行不完,若占空比调节精度要求较高,如要求百分之一,则a需大于100,这样PWM波的周期就比较大,频率比较低
两个定时器,如一个定时器0定时100us,另外一个定时器1定时小于100us,如b
us
定时器0中断时输出高电平,并打开定时器1,定时器1负责置低电平
这样,就可以产生周期100us,占空比是b/100的方波
频率可以比用一个定时器高一些