欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機步進電機正反轉修改
[打印本頁]
作者:
dj3365191
時間:
2020-8-2 12:26
標題:
單片機步進電機正反轉修改
高手看一下,下面這程序我想讓步進電機正轉10-15秒后再反轉10-15秒再正轉,周而復始。程序需要怎樣修改?謝謝!
/*
1、本程序用于測試4相步進電機常規驅動
2、需要用跳帽或者杜邦線把信號輸出端和對應的步進電機信號輸入端連接起來
3、速度不可以調節的過快,不然就沒有力矩轉動了
可以按照給的原理圖接線*/
#include <reg52.h>
unsigned char code F_Rotation[4]={0x04,0x08,0x10,0x20};//正轉表格
unsigned char code B_Rotation[4]={0x20,0x10,0x08,0x04};//反轉表格
void Delay(unsigned int i)//延時
{
while(--i);
}
main()
{
unsigned char i;
while(1)
{
for(i=0;i<4;i++) //4相
{
P3=F_Rotation[ i]; //輸出對應的相 可以自行換成反轉表格
Delay(750*10); //改變這個參數可以調整電機轉速
}
}
}
作者:
bbxyliyang
時間:
2020-8-2 15:56
需要使用定時器定時,你這個程序不好改,估計要重新寫一個,要用定時器0定時來實現電機脈沖輸出,定時器1定時時間,這樣才可以
作者:
dj3365191
時間:
2020-8-2 16:12
或者改成正轉180度然后反轉180度持續進行也可以,謝謝。
作者:
bbxyliyang
時間:
2020-8-2 18:22
#include <reg52.h>
unsigned long beats = 0; //電機轉動節拍總數
void StartMotor(unsigned long angle);
void main()
{
EA = 1; //使能總中斷
TMOD = 0x01; //設置T0為模式1
TH0 = 0xF8; //為T0賦初值0xF8CC,定時2ms
TL0 = 0xCC;
ET0 = 1; //使能T0中斷
TR0 = 1; //啟動T0
StartMotor(90); //控制電機轉動2圈半
while (1);
}
/* 步進電機啟動函數,angle-需轉過的角度 */
void StartMotor(unsigned long angle)
{
//在計算前關閉中斷,完成后再打開,以避免中斷打斷計算過程而造成錯誤
EA = 0;
beats = (angle * 4076) / 360; //實測為4076拍轉動一圈
EA = 1;
}
/* T0中斷服務函數,用于驅動步進電機旋轉 */
void InterruptTimer0() interrupt 1
{
unsigned char tmp; //臨時變量
static unsigned char index = 0; //節拍輸出索引
unsigned char code BeatCode[8] = { //步進電機節拍對應的IO控制代碼
0xE0, 0xC0, 0xD0, 0x90, 0xB0, 0x30, 0x70, 0x60
};
TH0 = 0xF8; //重新加載初值
TL0 = 0xCC;
if (beats != 0) //節拍數不為0則產生一個驅動節拍
{
tmp = P1; //用tmp把P1口當前值暫存
tmp = tmp & 0x87; //用&操作清零
tmp = tmp | (BeatCode[index]>>1); //用|操作把節拍代碼寫到低4位
P1 = tmp; //把低4位的節拍代碼和高4位的原值送回P1
index++; //節拍輸出索引遞增
index = index & 0x07; //用&操作實現到8歸零
beats--; //總節拍數-1
}
else //節拍數為0則關閉電機所有的相
{
P1 = P1 | 0x78;
}
}
作者:
1692483014
時間:
2020-8-3 00:26
void Delay_S(unsigned int t)
{
unsigned int m;
unsigned char i,j,k;
for(m=0; m<t; m++)
{
for(i=198;i>0;i--) //注意后面沒分號
for(j=100;j>0;j--) //注意后面沒分號
for(k=150;k>0;k--); //注意后面有分號
}
}
main()
{
unsigned char i;
unsigned long t;
while(1)
{
for(i=0;i<4;i++) //4相
{
P3=F_Rotation[ i]; //輸出對應的相 可以自行換成反轉表格
Delay(750*10); //改變這個參數可以調整電機轉速
}
Delay_S(10); //延時10秒
for(i=0;i<4;i++) //4相
{
P3=B_Rotation[ i]; //輸出對應的相 可以自行換成反轉表格
Delay(750*10); //改變這個參數可以調整電機轉速
}
Delay_S(10); //延時10秒
}
}
作者:
dj3365191
時間:
2020-8-3 17:07
謝謝指教,上面的兩個程序我都試過了,第一個程序電機不轉,只是抖動并發熱。第二個程序通電以后逆時針只轉很小的一個角度就停止。不知什么原因。
作者:
bbxyliyang
時間:
2020-8-3 17:36
dj3365191 發表于 2020-8-3 17:07
謝謝指教,上面的兩個程序我都試過了,第一個程序電機不轉,只是抖動并發熱。第二個程序通電以后逆時針只轉 ...
發給你的程序只是參考程序
作者:
王之未
時間:
2020-8-4 07:59
可能是你得電機某一相連接不好
作者:
18027081573
時間:
2020-8-4 09:48
#include <reg51.h> //51芯片管腳定義頭文件
#include <intrins.h> //內部包含延時函數 _nop_();
#define uchar unsigned char
#define uint unsigned int
uchar code FFW[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //四相八拍正轉編碼
uchar code REV[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; ////四相八拍反轉編碼
sbit K1 = P3^2; //正轉
sbit K2 = P3^3; //反轉
sbit K3 = P3^4; //停止
sbit BEEP = P3^6; //蜂鳴器
/********************************************************/
/*
/* 延時t毫秒
/* 11.0592MHz時鐘,延時約1ms
/*
/********************************************************/
void delay(uint t)
{
uint k;
while(t--)
{
for(k=0; k<125; k++)
{ }
}
}
/**********************************************************/
void delayB(uchar x) //x*0.14MS
{
uchar i;
while(x--)
{
for (i=0; i<13; i++)
{ }
}
}
/**********************************************************/
void beep()
{
uchar i;
for (i=0;i<100;i++)
{
delayB(4);
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //關閉蜂鳴器
}
/********************************************************/
/*
/*步進電機正轉
/*
/********************************************************/
void motor_ffw()
{
uchar i;
uint j;
for (j=0; j<8; j++) //轉1*n圈
{
if(K3==0)
{break;} //退出此循環程序
for (i=0; i<8; i++) //一個周期轉45度
{
P1 = FFW[i]; //取數據
delay(2); //調節轉速
}
}
}
/********************************************************/
/*
/*步進電機反轉
/*
/********************************************************/
void motor_rev()
{
uchar i;
uint j;
for (j=0; j<8; j++) //轉1×n圈
{
if(K3==0)
{break;} //退出此循環程序
for (i=0; i<8; i++) //一個周期轉45度
{
P1 = REV[i]; //取數據
delay(2); //調節轉速
}
}
}
/********************************************************
*
* 主程序
*
*********************************************************/
main()
{
uchar r,N=64; //N 步進電機運轉圈數
while(1)
{
if(K1==0)
{
beep();
for(r=0;r<N;r++)
{
motor_ffw(); //電機正轉
if(K3==0)
{beep();break;} //退出此循環程序
}
}
else if(K2==0)
{
beep();
for(r=0;r<N;r++)
{
motor_rev(); //電機反轉
if(K3==0)
{beep();break;} //退出此循環程序
}
}
else
P1 = 0xf0;
}
}
/********************************************************/
以上僅供參考
作者:
dj3365191
時間:
2020-8-5 13:29
謝謝指教,我已找到了程序,自己修改了下能用了。
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1