您的当前位置:首页正文

直流电机测速并显示

来源:华佗健康网


可实现功能: 1 可控制左右旋转 2 可控制停止转动

3 有测速功能,即时显示在液晶上

4 有速度档位选择,分五个档次,但不能精确控速 5 档位显示在液晶上

用到的知识:

1 用外部中断检测电机送来的下降沿,在一定时间里统计 脉冲个数,进行算出转速。

2 通过改变占空比可改变电机速度,占空比的改变可以通 过改变定时器的重装初值来实现。

3 要想精确控制速度,还需要用自动控制理论里的PID算 法,但参数难以选定,故在此设计中没有涉及!

#include<>

#define uchar unsigned char #define uint unsigned int

sbit PW1=P1^0 ;

sbit PW2=P1^1 ; ; write_data('0'+shi); write_data('0'+ge); }

/******延时函数********/ void delay(uint z) {

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--) ; }

/************写指令************/ void write_com(uchar com) {

lcdrs=0; Da=com; delay(1); lcden=1; delay(1); lcden=0; }

/************写数据**********/ void write_data(uchar date) {

lcdrs=1; Da=date; delay(1); lcden=1; delay(1); lcden=0; }

/************液晶初始化**********/ void lcd_init() {

lcden=0;

write_com(0x38) ; //初始化

write_com(0x0c) ; //打开光标 标闪

write_com(0x01) ; //清显示 write_com(0x80+0x40); write_data('0');

不显示光标 光标不闪,0x0f光 0x0c 0x0e write_data(' '); write_data('G'); write_data('e'); write_data('a'); write_data('r'); }

/***********键盘扫描程序**********/ void keyscan() {

if(stop==0) {

TR1=0; //关闭定时器0 end_turn; // 停止供电 write_com(0x80+0x40); write_data('0'); }

if(left==0) {

TR1=1;

dflag=1; //转向标志置位则左转 write_com(0x80+0x40);

write_data('0'+sflag); }

if(right==0) {

TR1=1;

dflag=0; //转向标志复位则右转 write_com(0x80+0x40); write_data('0'+sflag); }

if(accelerate==0) {

delay(10) ; //延时消抖 if(accelerate==0) {

while(accelerate==0) ; //等待松手 sflag++; if(sflag==2) {

t0=20000;

t1=30000; //占空比为百分之60

即可停止转动 write_com(0x80+0x40); write_data('2'); }

if(sflag==3) {

t0=15000;

if(sflag==5) } }

}

t1=35000; //占空比为百分之70 write_com(0x80+0x40); write_data('3'); }

if(sflag==4) {

t0=10000;

t1=40000; //占空比为百分之80 write_com(0x80+0x40); write_data('4'); }

{

t0=5000;

t1=45000; //占空比为百分之90 write_com(0x80+0x40); write_data('5'); }

if(sflag>=6) {

sflag=0;

t0=25000; t1=25000;

write_com(0x80+0x40); write_data('1'); }

因篇幅问题不能全部显示,请点此查看更多更全内容