標(biāo)題:
基于l297的51單片機(jī)步進(jìn)電機(jī)轉(zhuǎn)速控制問題
[打印本頁]
作者:
megadna
時(shí)間:
2018-6-5 20:40
標(biāo)題:
基于l297的51單片機(jī)步進(jìn)電機(jī)轉(zhuǎn)速控制問題
我們用T0來發(fā)出不同占空比的脈沖來控制電機(jī)轉(zhuǎn)速,然后用T1去計(jì)T0發(fā)出脈沖的數(shù)量來達(dá)到我們所需要的步數(shù),達(dá)到步數(shù)后電機(jī)停止并且蜂鳴器響。我們現(xiàn)在的問題是用鍵盤在液晶屏上控制轉(zhuǎn)速和步數(shù)后,發(fā)送給我們的兩個(gè)定時(shí)器作為初值去運(yùn)轉(zhuǎn)電機(jī),但是設(shè)置的轉(zhuǎn)速一旦大于30(r/min),電機(jī)就會(huì)一直轉(zhuǎn)下去不會(huì)停止,蜂鳴器也不會(huì)叫,而且不論轉(zhuǎn)速怎么提升,電機(jī)的轉(zhuǎn)動(dòng)速度都差不多不會(huì)變,只有在轉(zhuǎn)速設(shè)定小于30的時(shí)候才能正常實(shí)現(xiàn)我們的功能,用設(shè)定轉(zhuǎn)速行走我們所規(guī)定的步數(shù)后電機(jī)停止并且蜂鳴器報(bào)警。求51hei論壇大佬進(jìn)行指點(diǎn)。!
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
QQ圖片20180605203237.png
(49.77 KB, 下載次數(shù): 31)
下載附件
2018-6-5 20:33 上傳
單片機(jī)源程序如下:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
sbit S1=P2^3; //定義鍵-----進(jìn)入設(shè)置界面
sbit S2=P2^4; //定義鍵-----調(diào)整光標(biāo)位置
sbit S3=P2^5; //定義鍵-----調(diào)整光標(biāo)位置數(shù)值
sbit S4=P2^6; //定義鍵-----保存設(shè)置值
sbit S5=P2^7; //定義鍵-----發(fā)送鍵
uchar code table1[]="z:0 v:000 b:000";
uchar code table0[]=" 000";
uchar S1num,S2num,S3num;
uint z,v1,v2,v3,b1,b2,b3,sv;
uchar i;
void delay(uint z) //延時(shí)函數(shù)
{
int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void LCD_write_data(uint dat) //寫數(shù)據(jù)
{
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P1=dat;
delay(5);
LCD_EN = 1;
delay(5);
LCD_EN = 0;
}
void LCD_write_com(uint com) //寫指令
{
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
P1=com;
delay(5);
LCD_EN = 1;
delay(5);
LCD_EN = 0;
}
void init()//1602初始化
{
z=0;
v1=0;
v2=0;
v3=0;
b1=0;
b2=0;
b3=0;
sv=0;
LCD_write_com(0x38);
LCD_write_com(0x01);
LCD_write_com(0x06);
LCD_write_com(0x0c);
}
void write_v1(uchar add,uint dat)//寫轉(zhuǎn)速v函數(shù)
{
uchar bai;
bai=dat;
LCD_write_com(0xc0+add);
LCD_write_data(0x30+bai);
}
void write_v2(uchar add,uint dat)//寫轉(zhuǎn)速v函數(shù)
{
uchar shi;
shi=dat;
LCD_write_com(0xc0+add);
LCD_write_data(0x30+shi);
}
void write_v3(uchar add,uint dat)//寫轉(zhuǎn)速v函數(shù)
{
uchar ge;
ge=dat;
LCD_write_com(0xc0+add);
LCD_write_data(0x30+ge);
}
void write_b1(uchar add,uint dat)//寫步數(shù)b函數(shù)
{
uint bai;
bai=dat;
LCD_write_com(0xc0+add);
LCD_write_data(0x30+bai);
}
void write_b2(uchar add,uint dat)//寫步數(shù)b函數(shù)
{
uint shi;
shi=dat;
LCD_write_com(0xc0+add);
LCD_write_data(0x30+shi);
}
void write_b3(uchar add,uint dat)//寫步數(shù)b函數(shù)
{
uint ge;
ge=dat;
LCD_write_com(0xc0+add);
LCD_write_data(0x30+ge);
}
void write_z(uchar add,uint dat)//寫轉(zhuǎn)向z函數(shù)
{
uint ge;
ge=dat;
LCD_write_com(0xc0+add);
LCD_write_data(0x30+ge);
}
void write_sv(uchar add,uint dat)//寫實(shí)際轉(zhuǎn)速sv函數(shù)
{
uint bai,shi,ge;
bai=dat/100;
shi=dat%100/10;
ge=dat%10;
LCD_write_com(0x80+add);
LCD_write_data(0x30+bai);
LCD_write_data(0x30+shi);
LCD_write_data(0x30+ge);
}
void display()//1602初始化顯示函數(shù)
{
init();
LCD_write_com(0x80|0x10);
for(i=0;i<11;i++)
{
LCD_write_data(table0[i]);
delay(5);
}
LCD_write_com(0xc0);
for(i=0;i<15;i++)
{
LCD_write_data(table1[i]);
delay(5);
}
write_z(2,z);
write_v1(6,v1);
write_v2(7,v2);
write_v3(8,v3);
write_b1(12,b1);
write_b2(13,b2);
write_b3(14,b3);
write_sv(6,sv);
S1num=0;
S2num=0;
S3num=0;
}
void keyscan()//鍵盤掃描函數(shù)
{
if(S1==0)//按鍵S1按下時(shí)
{
S1num=1;
delay(20);
if(S1==0)
{
LCD_write_com(0xc0+2);//光標(biāo)到轉(zhuǎn)向位置處
LCD_write_com(0x0f);//光標(biāo)閃爍
}
}
if(S1num!=0)//只有按鍵S1按下后,S2,S3,S4按鍵操作才有效
{
if(S2==0)//按鍵S2按下時(shí)
{
delay(20);
if(S2==0)
{
S2num++;
while(!S2);//松手檢測
if(S2num==0)
{
LCD_write_com(0xc0+2);//光標(biāo)到指定位置
}
if(S2num==1)
{
LCD_write_com(0xc0+6);//光標(biāo)到指定位置
}
if(S2num==2)
{
LCD_write_com(0xc0+7);
}
if(S2num==3)
{
LCD_write_com(0xc0+8);
}
if(S2num==4)
{
LCD_write_com(0xc0+12);
}
if(S2num==5)
{
LCD_write_com(0xc0+13);
}
if(S2num==6)
{
LCD_write_com(0xc0+14);
}
if(S2num==7)
{
LCD_write_com(0xc0+2);
S2num=0;
}
}
}
if(S3==0)//按鍵S3按下時(shí)
{
delay(20);
if(S3==0)
{
while(!S3);
if(S2num==0)
{
z++;
if(z==2)
{
z=0;
}
write_z(2,z);
LCD_write_com(0xc0+2);
}
if(S2num==1)
{
v1++;
if(v1==10)
{
v1=0;
}
write_v1(6,v1);
LCD_write_com(0xc0+6);
}
if(S2num==2)
{
v2++;
if(v2==10)
{
v2=0;
}
write_v2(7,v2);
LCD_write_com(0xc0+7);
}
if(S2num==3)
{
v3++;
if(v3==10)
{
v3=0;
}
write_v3(8,v3);
LCD_write_com(0xc0+8);
}
if(S2num==4)
{
b1++;
if(b1==10)
{
b1=0;
}
write_b1(12,b1);
LCD_write_com(0xc0+12);
}
if(S2num==5)
{
b2++;
if(b2==10)
{
b2=0;;
}
write_b2(13,b2);
LCD_write_com(0xc0+13);
}
if(S2num==6)
{
b3++;
if(b3==10)
{
b3=0;
}
write_b3(14,b3);
LCD_write_com(0xc0+14);
}
}
}
if(S4==0)//按鍵S4按下時(shí)
{
delay(5);
if(S4==0)
{
S1num=0;
S2num=0;
S3num=0;
LCD_write_com(0x0c);
}
}
}
}
void main()
{
display();//1602顯示
while(1)
{
keyscan();//不斷檢測鍵是否按下
}
}
復(fù)制代碼
所有資料51hei提供下載:
最新.zip
(265.78 KB, 下載次數(shù): 29)
2018-6-5 20:39 上傳
點(diǎn)擊文件名下載附件
proteus仿真圖和keil代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1