产品选型

单片机转速测量系统 看单片机如何控制PWM信号实现直流电机转速控制

小编 2024-10-25 产品选型 23 0

看单片机如何控制PWM信号实现直流电机转速控制

设计中采用了专门的芯片组成了PWM信号的发生系统并且对PWM信号的原理、产生方法以及如何通过软件编程对PWM信号占空比进行调节从而控制其输入信号波形等均作了详细的阐述。另外本系统中使用了红外对管对直流电机的转速进行测量,经过整形电路后将测量值送到单片机,并且最终作为反馈值输入到单片机进行PID运算从而实现了对直流电机速度的控制。在软件方面,文章中详细介绍了PID运算程序初始化程序等的编写思路和具体的程序实现。

1 单片机最小系统:单片机最小系统由51单片机,晶振电路,复位电路,电源组成。大家都比较熟悉,这里不再赘述。

2 四位数码管显示:在应用系统中,设计要求不同,使用的LED显示器的位数也不同,因此就生产了位数,尺寸,型号不同的LED显示器供选择,在本设计中,选择4位一体的数码型LED显示器,简称“4-LED”。本系统中前三位显示电压的整数位,最后一位显示转速的小数位。4-LED显示器引脚如图2所示,是一个共阴极接法的4位LED数码显示管,其中a,b,c,e,f,g为4位LED各段的公共输出端,1、2、3、4分别是每一位的位数选端,dp是小数点引出端,4位一体LED数码显示管的内部结构是由4个单独的LED组成,每个LED的段输出引脚在内部都并联后,引出到器件的外部。

3 电机驱动电路:电机驱动电中是采用ULN2003来驱动。ULN2003是高耐压、大电流达林顿陈列,由七个硅NPN达林顿管组成。该电路的特点:ULN2003的每一对达林顿都串联一个2.7K的基极电阻,在5V的工作电压下它能与TTL和CMOS电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据,输入5VTTL电平,输出可达500mA/50V。ULN2003的引脚图,其中IN1~IN7为输入控制端;OUT1~OUT7为输出端;8脚为芯片的接地端;9脚为公共端,该脚是内部7个续流二极管负极的公共端,各二极管的正极分别接各达林顿管的集电极。用于感性负载时,该脚接负载电源正极,实现续流作用。如果该脚接地,实际上就是达林顿管的集电极对地接通。

当P1.0中为高电平时,其内部三极管导通,使电机转动。当P1.0为低电平时,内部三极管截止,电路断开,电机停止转动。所以在程序中可以利用P1.0口输出PWM波来控制电机的转速。

4 红外测速电路:发射管工作时发出红外线,当接收管收到红外信号时,其电阻变小(本设计相当于从无穷大变到1k左右)。利用其电阻变化,改变接收管分压情况。挡片是利用圆盘上剪四个孔,当挡片随电机转动时,接收管两端电平发生变化,产生脉冲。

5 整形电路:本设计的整形电路是用555定时器接成的施密特触发器。

6 源程序:

#include reg52.h

#define uchar unsigned char

#define uint unsigned int

uchar code table[10]={0x3f,0x06,0x5b,

0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴数码管显示码(0-9)

sbit xiaoshudian=P0^7;

sbit wei1=P2^4; //数码管位选定义

sbit wei2=P2^5;

sbit wei3=P2^6;

sbit wei4=P2^7;

sbit beep=P2^3; //蜂鸣器控制端

sbit motor = P1^0; //电机控制

sbit s1_jiasu = P1^4; //加速按键

sbit s2_jiansu= P1^5; //减速按键

sbit s3_jiting=P1^6; //停止/开始按键

uint pulse_count; //INT0接收到的脉冲数

uint num=0; //num相当于占空比调节的精度

uchar speed[3]; //四位速度值存储

float bianhuasudu; //当前速度(理论计算值)

float reallyspeed; //实际测得的速度

float vv_min=0.0;vv_max=250.0;

float vi_Ref=60.0; //给定值

float vi_PreError,vi_PreDerror;

uint pwm=100; //相当于占空比标志变量

int sample_time=0; //采样标志

float v_kp=1.2,v_ki=0.6,v_kd=0.2; //比例,积分,微分常数

void delay (uint z)

{

uint x,y;

for(x=z;x0;x--)

for (y=20;y0;y--);

}

void time_init()

{

ET1=1; //允许定时器T1中断

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

TMOD = 0x15; //定时器0计数,模式1;定时器1定时,模式1

TH1 = (65536-100)/256; //定时器1值,负责PID中断 ,0.1ms定时

TL1 = (65536-100)%6;

TR0 = 1; //开定时器

TR1 = 1;

IP=0X08; //定时器1为高优级

EA=1; //开总中断

}

void keyscan()

{

float j;

if(s1_jiasu==0) //加速

{

delay(20);

if(s1_jiasu==0)

vi_Ref+=10;

j=vi_Ref;

}

while(s1_jiasu==0);

if(s2_jiansu==0) //减速

{

delay(20);

if(s2_jiansu==0)

vi_Ref-=10;

j=vi_Ref;

}

while(s2_jiansu==0);

if(s3_jiting==0)

{

delay(20);

motor=0;

P1=0X00;

P3=0X00;

P0=0x00;

}

while(s3_jiting==0);

}

float v_PIDCalc(float vi_Ref,float vi_SpeedBack)

{

register float error1,d_error,dd_error;

error1=vi_Ref-vi_SpeedBack; //偏差的计算

d_error=error1-vi_PreError; //误差的偏差

dd_error=d_error-vi_PreDerror; //误差变化率

vi_PreError=error1; //存储当前偏差

vi_PreDerror=d_error;

bianhuasudu=(v_kp*d_error+v_ki*vi_PreError+v_kd*dd_error);

return (bianhuasudu);

}

void v_Display()

{

uint sudu;

sudu=(int)(reallyspeed*10); //乘以10之后强制转化成整型

speed[3]=sudu/1000; //百位

speed[2]=(sudu00)/100; //十位

speed[1]=(sudu0)/10; //个位

speed[0]=sudu; //小数点后一位

wei1=0; //第一位打开

P0=table[speed[3]];

delay(5);

wei1=1; //第一位关闭

wei2=0;

P0=table[speed[2]];

delay(5);

wei2=1;

wei3=0;

P0=table[speed[1]];

xiaoshudian=1;

delay(5);

wei3=1;

wei4=0;

P0=table[speed[0]];

delay(5);

wei4=1;

}

void BEEP()

{

if((reallyspeed)=vi_Ref+5||(reallyspeed

{

beep=~beep;

delay(4);

}

}

void main()

{

time_init();

motor=0;

while(1)

{

v_Display();

BEEP();

}

if(s3_jiting==0) //对按键3进行扫描,增强急停效果

{

delay(20);

motor=0;

P1=0X00;

P3=0X00;

P0=0x00;

}

while(s3_jiting==0);

}

void timer0() interrupt 1

{

}

void timer1() interrupt 3

{

TH1 = (65536-100)/256; //1ms定时

TL1 = (65536-100)%6;

sample_time++;

if(sample_time==5000) //采样时间0.1ms*5000=0.5s

{

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

sample_time=0;

pulse_count=TH0*255+TL0; //保存当前脉冲数

keyscan(); //扫描按键

reallyspeed=pulse_count/(4*0.6); //计算速度

pwm=pwm+v_PIDCalc(vi_Ref,reallyspeed);

if(pwm

if(pwm100)pwm=100;

TH0=TL0=0;

TR0=1; //开启定时器0

}

num++;

if(num==pwm) //此处的num值,就是占空比

{

motor=0;

}

if(num==100) //100相当于占空比调节的精度

{

num=0;

motor=1;

}

}

51单片机项目(1)— 直流电机速度控制与测量的仿真(含代码)

你是否曾经想过,如何通过按键来调节电机的速度?如何通过LED指示灯来控制电机的正反转?如何将测到的电机速度显示在LCD1602上?今天我们将带你一起探索这个问题。首先,我们需要了解如何产生PWM波来控制电机的速度。由于51单片机没有PWM输出模式,但我们可以利用定时器来人工产生PWM。

具体来说,我们需要配置定时器,使其每0.1ms产生一次中断,并在每次中断时对timer1这个变量++,当timer1加到100时,再让它清0,那么timer1这个量一直在0-100这个范围内变化。然后,我们可以通过调整传入的参数a,来控制PWM输出的高电平时间,从而实现控制电机的速度。

接下来,我们需要解决如何通过LED指示灯来控制电机的正反转。我们可以通过一个单刀开关来控制电机的正反转,并让两个LED指示灯与之对应,用于指示当前电机的正反转状态。最后,我们需要将测到的电机速度显示在LCD1602上。

我们可以通过编写代码来实现测速功能,具体来说,我们可以利用定时器来计算电机的速度,将速度值存储到一个变量中,并通过LCD1602来显示。综上所述,通过按键调节电机速度,通过LED指示灯控制电机正反转,以及通过LCD1602显示电机速度,我们成功实现了控制直流电机的功能。

最后,我们想问一句,你对这种控制直流电机的方式有何看法?有没有更好的实现方式?欢迎在评论区留言,一起讨论!如何轻松掌握电机的转速?或许你从未考虑过这个问题,但是它对于电机控制却是至关重要的。此时,我来为你介绍一个简单易行的测速方法,让你不再为测量电机转速而烦恼。

首先,我们需要选用一种每转一圈输出24个脉冲的电机,并将脉冲输出接到单片机的外部中断管脚。接下来,在中断服务函数里记录脉冲数。再使用定时器0产生1ms的中断,记录时间。经过1秒的时间,我们可以读取外部中断记录的脉冲数,并通过数学关系得出电机的转速。这种方法操作简单,测量精准,为电机控制提供了巨大的便利。

当然,测速方法有多种,但是这种方法简单易行,对于初学者来说是非常友好的。通过单片机的控制,我们可以轻松地测量电机转速,这对于电机控制而言至关重要。因此,如果你对电机控制感兴趣,或者想要进一步了解测速方法,我建议你试试这种简单有效的测速方式。

如果你想获取完整的代码,可以通过点击这里找小助理0元领取,并扫码进群领取资料。总之,测量电机转速对于电机控制非常重要。我们可以通过这种简单有效的测速方法来掌握电机的转速。如果你对于电机控制有着更多的兴趣和想法,欢迎在评论区与我们分享。

相关问答

传感器 单片机 控制电机 转速 的方法?

在这里我只说说一般的直流电机。你可以使单片机一个引脚输出一个可调占空比的方波,用三极管将这个方波(数字信号)转成一个稳定的直流(模拟信号)电压,通过调...

单片机 是怎么通过pwm波来控制电机运转的,工作原理是什么?

三、单片机PWM控制原理现在很多单片机都有PWM功能,一般情况下,单片机的PWM功能是通过定时器来实现的,在使用时,需要对定时器的寄存器进行PWM功能的设置。...现...

空调 单片机 控制原理?

空调的室内风机电机是反馈试调速电机,控制那3根线是连接单片机的,是转速信号,一般是霍尔原件,供电是连接电源,用可控硅调速。原理是这样的:电机启动后单...

单片机 驱动交流接触器的方法

[回答]在各种自动控制设备中,都存在一个低压的自动控制电路与高压电气电路的互相连接问题,一方面要使低压的电子电路的控制信号能够控制高压电气电路的执...

单片机 控制步进电机驱动器

这个驱动器的功能是为了配合控制源来说的。驱动器的脉冲输入和方向信号的输入都是脉冲信号!1:单脉冲就是脉冲输入一直有,通过方向输入的高低电平来...

红外 转速 仪的使用方法?

红外光电转速测量仪,由转子、红外光电传感器和二次仪表组成,红外光电传感器采用传统的光电自准直式结构,包括光学成像系统及前置放大电路两部分,光学成像系统...

51 单片机 码速表说明?

51单片机码速表是一种常用的51单片机指令速查表,它包含了51单片机的大部分指令及其对应的操作码、机器码、指令周期、执行时间等信息。使用51单片机码速表可以...

单片机 智能小车pmw?

不需要单独的PWM模块,仅靠单片机和电机驱动(L298N)足够了。具体是在程序中用单片机的IO口模拟出PWM信号来,也就是控制IO口输出的高低电平的时间,利用不同时...

单片机 C语音控制步进电机正反转程序?

只要控制在四相绕组上输入脉冲的顺序,就可以控制电机的正转/反转。(控制延时就能控制转速。)步进电机正反转控制方式:步进电机有四相绕组A、B、C、D,当一绕...

如何将 单片机 输出的PWM控制信号,变成可以带负载的变化的电压?

单片机输出的PWM为控制信号,需要加入控制器件才可以驱动负载单片机输出的PWM驱动能比较弱,不能直接驱动负载,需要三极管、MOS管参与才可以控制负载的功率,比...

猜你喜欢