单片机控制电机转速:
如果只有一个转向的话就比较容易了,如果要有正反两个转向,就需要一个H桥,并且两个I/O口输出高低电频控制。
比如用P1口的P10,P11,P12三个I/O口接按键,P34口接电频输出,编个定时程序及按键程序,如果是快(全速运行),那就P34口直接输出高电频“1”;中(50%),那就让P34口0—50ms输出高电频“1”,50ms—100ms输出低电频“0”,后面就一直以50ms进行一次取反;慢(就用10%吧),0—40ns输出高电频“1”,41ns—400ns输出低电频“0”,这样为一个周期,后面就一直循环吧。
如果按键P10按下,执行方式1,全速运行,否则以默认方式运行;按键P11按下,执行方式2,改变占空比,以50%的速度运行,否则,不作改变;按键P12按下,执行方式3,改变占空比,以10%的速度运行,否则,不作改变。
1、PWM波是控制直流电机的
通俗的说,5V直流电机在5V的情况下肯定速度最快,在0V的情况下肯定不转了
这样电源0~5V就对应了不同的速度
问题是怎么才能实现0~5V的变化呢?
于是就用PWM波控制mos管来给直流电机供电。PWM就是一个矩形波,通过控制高电平和低电平的时间来控制MOS管导通的时间。MOS管在高电平的时候导通,就相当于5V电源直接加到电机上;MOS管在低电平的时候截止,就相当于0V电源加到电机上。
PWM又叫脉宽调制,就是控制高电平占一个周期的比例。而这个PWM波就是控制5V电源加到电机上的时间,从而控制了电机。
2、例程:
#include <reg52h>
sbit KEY1 = P3^4;
sbit PWM = P1^5;
unsigned char CYCLE; //定义周期 该数字X基准定时时间 如果是10 则周期是10 x 01ms
unsigned char PWM_ON ;//定义高电平时间
void delay(unsigned int cnt)
{
while(--cnt);
}
main()
{
unsigned char PWM_Num;//定义档位
TMOD |=0x01;//定时器设置 1ms in 12M crystal
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;//定时1mS
IE= 0x82; //打开中断
TR0=1;
CYCLE = 10;// 时间可以调整 这个是10步调整 周期10ms 8位PWM就是256步
while(1)
{
if(!KEY1)
{
delay(10000);
if(!KEY1)
{
PWM_Num++;
if(PWM_Num==4)PWM_Num=0;
switch(PWM_Num){
case 0:P0=0x06;PWM_ON=0;break;//高电平时长
case 1:P0=0x5B;PWM_ON=4;break;
case 2:P0=0x4F;PWM_ON=6;break;
case 3:P0=0x66;PWM_ON=8;break;
default:break;
}
}
}
}
}
//
/ 定时中断 /
//
void tim(void) interrupt 1 using 1
{
static unsigned char count; //
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;//定时1mS
if (count==PWM_ON)
{
PWM = 1; //灯灭
}
count++;
if(count == CYCLE)
{
count=0;
if(PWM_ON!=0) //如果左右时间是0 保持原来状态
PWM = 0;//灯亮
}
基于51单片机直流电机调速测速仿真原理是以STC90C52RC单片机为主控芯片,利用PWM的原理,通过按键对直流电机进行调速,实现正反转;采用霍尔传感器对直流电机的转动进行计数,并通过主控芯片将采集到的计数值转化为直流电机的当前速度值;利用LCD1602显示模块将计算得到的值进行实时显示。
51单片步进电机控制原理与控制设计程序
51单片步进电机是数字控制电机,它将脉冲信号转变成角位移,即给一个脉冲信号,步进电机就转动一个角度,因此非常适合于单片机控制。步进电机可分为反应式步进电机(简称vr)、永磁式步进电机(简称pm)和混合式步进电机(简称hb)。
51单片步进电机区别于其他控制电机的最大特点是,它是通过输入脉冲信号来进行控制的,即电机的总转动角度由输入脉冲数决定,而电机的转速由脉冲信号频率决定。
51单片步进电机的驱动电路根据控制信号工作,控制信号由单片机产生。其基本原理作用如下:
(1)控制换相顺序
通电换相这一过程称为脉冲分配。例如:三相步进电机的三拍工作方式,其各相通电顺序为a-b-c-d,通电控制脉冲必须严格按照这一顺序分别控制a,b,c,d相的通断。
(2)控制步51单片进电机的转向
如果给定工作方式正序换相通电,步进电机正转,如果按反序通电换相,则电机就反转。
(3)控制51单片步进电机的速度
如果给步进电机发一个控制脉冲,它就转一步,再发一个脉冲,它会再转一步。两个脉冲的间隔越短,步进电机就转得越快。调整单片机发出的脉冲频率,就可以对步进电机进行调速。步进电机是机电控制中一种常用的执行机构,它的用途是将电脉冲转化为角位移,通俗地说:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。通过控制脉冲个数即可以控制角位移量,从而达到准确定位的目的;同时通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。
用PWM进行电机调速
#include<reg52h>
#include <intrinsh>
sbit ENA=P2^1;
sbit ENB=P2^2;
sbit OUTA1=P2^3;
sbit OUTA2=P2^4;
sbit OUTB1=P2^5;
sbit OUTB2=P2^6;
unsigned char PWM_ON1;
unsigned char PWM_ON2;
#define CYCLE 10
void Init_Timer0(void);
void qianjin()
{
PWM_ON1=1;
PWM_ON2=1;
OUTA1=0;
OUTA2=1;
OUTB1=0;
OUTB2=1;
}
void houtui()
{
PWM_ON1=6;
PWM_ON2=6;
OUTA1=1;
OUTA2=0;
OUTB1=1;
OUTB2=0;
}
void zuozhuan()
{
PWM_ON1=6;
PWM_ON2=0;
OUTA1=0;
OUTA2=1;
OUTB1=0;
OUTB2=1;
}
void youzhuan()
{
PWM_ON1=0;
PWM_ON2=6;
OUTA1=0;
OUTA2=1;
OUTB1=0;
OUTB2=1;
}
void DelayMs_12M(unsigned int n)
{
unsigned int i=0,j=0;
for(i=0;i<n;i++)
for(j=0;j<123;j++);
}
void tingzhi()
{
PWM_ON1=0;
PWM_ON2=0;
}
void main(void)
{
Init_Timer0();
while(1)
{
qianjin();
} }
void Init_Timer0(void)
{
TMOD|= 0x01;
EA=1;
ET0=1;
TR0=1;
}
void Timer0_isr(void) interrupt 1
{
unsigned char count1,count2;
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
if (count1==PWM_ON1)
{
ENA=0;
}
count1++;
if(count1==CYCLE)
{
count1=0;
if(PWM_ON1!=0)
ENA=1;
}
if(count2==PWM_ON2)
{
ENB=0;
}
count2++;
if(count2==CYCLE)
{
count2=0;
if(PWM_ON2!=0)
ENB=1;
}
}
这是我以前控制小车速度的一个程序,参考一下
以上就是关于单片机pwm控制电机转速全部的内容,包括:单片机pwm控制电机转速、求52单片机pwm控制电机转速程序C语言、基于51单片机直流电机调速测速仿真原理等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)