龙空技术网

51单片机霍尔测速与PWM调直流电机转速快慢

从零开始学单片机设计 349

前言:

现在同学们对“霍尔元件单片机”大致比较注意,同学们都需要学习一些“霍尔元件单片机”的相关内容。那么小编同时在网摘上搜集了一些对于“霍尔元件单片机””的相关文章,希望姐妹们能喜欢,你们一起来学习一下吧!

最近后台有小伙伴留言,说能不能写一篇关于霍尔传感器测试马达速度的文章,他们导师给他们布置的毕业论文是关于霍尔传感器和PWM控制的。今天我就写一篇类似的文章,增加一点难度,LCD实时显示速度,希望你们看后能明白其中的原理,更希望你们有所收获。

文章可能稍微有点长,请小伙伴们耐心看完。

首先对PWM技术先进行一下说明

PWM-脉冲宽度调制技术,通过对微处理器输出的一系列数字脉冲宽度进行调制,等效地获得模拟电路所需的波形,从而实现对模拟电路控制的一种有效技术。采用PWM技术可以避免传统调速系统模拟电路容易随时间飘移、产生一些不必要的热损耗、以及对噪声敏感等缺点,并且PWM调速系统低速特性好,动态抗干扰能力强的特点.由此来实现直流电机的启动、停止、加速、减速、正转、反转以及速度的动态显示,并且大幅度提高了转速显示的精确性。好了我们开始正式的设计说明。

设计说明

1.本设计采用STC89C51/52 两种单片机(任选其一)作为主控制器

· 2.采用霍尔传感器非接触式测电机转速

· 3.LCD1602液晶显示当前的转速,转速单位为转/分(RPM)。和显示当前的pwm占空比0~100%。

· 4.电机的速度可以通过按键调整,也可以开始暂停,正转和反转。

项目试验功能及说明:

液晶屏第一行显示电机转速,第二行显示占空比,占空比数值越大,电机转速越快。

系统一共有6个按键,单片机附近的独立按键是系统的复位按键,按下单片机会复位。

下面一排是控制按键:

1键:加速键,可以短按,占空比加1,也可长按,占空比连续加;

2键:减速键,可以短按,占空比减1,也可长按,占空比连续减;

3键:正转切换键,按下后电机正转;

4键:反转切换键,按下后电机反转;

5键:开始暂停键,按一下开始,再按一下暂停。

项目试验元器件清单

1) 9*15万用板

2) STC89C51单片机

3) 40脚IC座

4) 1602液晶

5) 16p母座

6) 16p排针

7) 10k电阻*3

8) 1k电阻*5

9) 3v直流电机

10) 3*1万用板

11) 磁铁*2

12) 塑料管

13) 3144霍尔传感器

14) 4148二极管*4

15) 8050三极管*4

16) 8550三极管*2

17) 103排阻

18) 104独石电容

19) 10uf电解电容

20) 30pf瓷片电容*2

21) 12M晶振

22) 按键*6

23) 自锁开关

24) DC电源插口

25) 导线若干

26) 焊锡若干

27) USB电源线或电池盒

制作出来的实物:

单片机直流电机控制转速仿真原理图如下:

按键仿真功能图:

电路设计原理图:

PCB-LAYOUT图如下:

部分源代码:

#include <reg52.h>

#define uchar unsigned char

#define uint unsigned int

void displaym();

sbit en=P2^5; //1602 6管脚

sbit rs=P2^7; //1602端口 4管脚

sbit rw=P2^6;//lcd1602控制端口 5管脚

sbit num1=P1^0; //占空比加1

sbit num2=P1^1; //占空比减一

sbit num3=P1^2; //正传

sbit num4=P1^3; //反转

sbit num5=P1^4; //开始停止切换

sbit out=P3^4; //PWM输出用于正传

sbit out1=P3^7; //PWM输出用于反转

uint zhuansu,flag,z1,z2,m,flag_1,zheng,fan,kai;

void delay(uint z)//延时1ms函数

{

uint x,y;

for(x=0;x<z;x++)

for(y=0;y<110;y++);

}

void write_com(uchar com)//向1602写一字节(控制指令)

{

rs=0;

P0=com;

delay(5);

en=0;

delay(10);

en=1;

}

void write_data(uchar date)//向1602写一字节(数据)

{

rs=1;

P0=date;

delay(5);

en=0;

delay(5);

en=1;

}

void init()//初始化函数

{

en=0;

rw=0;

write_com(0x01); //lcd初始化

write_com(0x38); //5X7显示

write_com(0x0c); //关闭光标

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

TH0=0xdc;

TL0=0x00; //定时器装入初值

EA=1; //开总中断

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

TR0=1;

EX1=1;

IT1=1; //定时器启动

TH1=0xfc;

TL1=0x66;//定时100us

ET1=1; //定时器1开中断

TR1=1;

write_com(0x80);

write_data('V');

write_data(':');

write_com(0x87); //第一行显示转速

write_data('r');

write_data('p');

write_data('m');

write_com(0xc0);

write_data('z');

write_data('h');

write_data('a');

write_data('n');

write_data('k');

write_data('o');

write_data('n');

write_data('g');

write_data('b');

write_data('i'); //在第二行显示zhankongbi:

write_data(':');

displaym();

}

void keyscan() //键盘扫描函数

{

if(num1==0)

{

delay(5); //消除抖动

if(num1==0)

{

if(m<=199)

m++;

displaym(); //设定占空比加一

}

}

if(num2==0)

{

delay(5);

if(num2==0)

{

if(m>=1)

m--;

displaym(); //设定占空比减一

}

}

if(num3==0)

{

delay(5);

if(num3==0)

{

zheng=1; //正传标志置1

fan=0; // 反转标志置0

}

}

if(num4==0)

{

delay(5);

if(num4==0)

{

zheng=0; //正传标志置0

fan=1; // 反转标志置1

}

}

if(num5==0)

{

delay(5);

if(num5==0)

{

while(num5==0) ;

kai=1-kai;

}

}

}

void display()

{

write_com(0x82);

zhuansu=zhuansu*30; //将两秒内的计数乘以30得到转每分

if(zhuansu/10000!=0)

write_data(zhuansu/10000+0x30); //如果转速的万即第五位位不为0 正常显示否则显示空格

else

write_data(' ');

if(zhuansu/1000==0)

write_data(' ');

else

write_data(zhuansu%10000%1000+0x30); //如果转速小于1000 千位为空格 否则正常显示

if(zhuansu/100==0)

write_data(' ');

else

write_data(zhuansu%10000%1000/100+0x30); //如果转速小于100 百位为空格 否则正常显示

if(zhuansu/10==0)

write_data(' ');

else

write_data(zhuansu%10000%1000%100/10+0x30); //如果转速小于10 十位为空格 否则正常显示

write_data(zhuansu%10000%1000%100%10+0x30);

write_com(0xd0); //如果没有这句,当中断内的显示函数执行完,就会在转速的位置显示占空比数据,导致乱码

}

void displaym()

{

write_com(0xcb);

if(m/200%10!=0)

write_data(m/200%10+0x30); //如果占空比百位不为0则显示百位否则显示空格

else

write_data(' ');

if(m/200%10==0&&m/20%10==0)

write_data(' ');

else

write_data(m/20%10+0x30); //如果占空比小于10 十位正常显示 否则显示空格

write_data(m/2%10+0x30); //显示个位

}

void main()

{

flag_1=0;

m=100; //占空比为100

zhuansu=0; //转速初值0

flag=0;

zheng=1; //初始化电机正转动

fan=0;

init(); //初始化

while(1)

{

keyscan(); //键盘扫描程序

}

}

void int1()interrupt 2 //外部中断1脉冲技术记录电机的转速 电机转一圈zhuansu加一

{

zhuansu++;

}

void int2()interrupt 3 //定时器0显示转速

{

TH0=0xdc;

TL0=0x00;//定时10ms

flag++;

if(flag==200) //计时到达2s

{

display(); //显示转速

zhuansu=0; //转速重置0

flag=0;

}

}

void int3()interrupt 1 //产生PWM

{

TH1=0xff;

。。。。。。。。。。

…………限于本文篇幅有限 只能写部分代码,需要完整代码请留言或者私信…………

最后,如果有什么意见或者建议欢迎直接给我留言,让我们共同学习一起进步,

如果需要完整代码或设计文件,请在下方留言或者私信我,看到后会第一时间回复。

谢谢!

如果喜欢我的文章请评论转发加关注哦。

标签: #霍尔元件单片机