導航:首頁 > 操作系統 > 單片機紅外遙控步進電機控制

單片機紅外遙控步進電機控制

發布時間:2022-08-18 21:06:01

單片機紅外控制步進電機。紅外是接外部中斷的。由於步進電機需要連續不斷的脈沖。那麼當紅外來了怎麼處理

步進電機旋轉需要驅動的 如L298驅動晶元 我還不清楚你要用紅外感測器與步進電機一起連干什麼 如果是想用紅外感測器控制步進電機的旋轉 你需要加單片機 步進電機驅動 然後紅外感測器電路跟單片機連 步進電機跟驅動相連 單片機的io口與驅動的幾個腳相連 然後編程實現 假如紅外感測器識別到信號輸出一個觸發信號給單片機 假如單片機識別到這個信號就控制步進電機動作

Ⅱ 如何使用單片機精確控制步進電機

如何用單片機控制步進電機
步進電機是機電控制中一種常用的執行機構,它的用途是將電脈沖轉化為角位移,通俗地說:當步進驅動器接收到一個脈沖信號,它就驅動步進電機按設定的方向轉動一個固定的角度(及步進角)。通過控制脈沖個數即可以控制角位移量,從而達到准確定位的目的;同時通過控制脈沖頻率來控制電機轉動的速度和加速度,從而達到調速的目的。
一、步進電機常識
常見的步進電機分三種:永磁式(PM),反應式(VR)和混合式(HB),永磁式步進一般為兩相,轉矩和體積較小,步進角一般為7.5度或15度;反應式步進一般為三相,可實現大轉矩輸出,步進角一般為1.5度,但雜訊和振動都很大。在歐美等發達國家80年代已被淘汰;混合式步進是指混合了永磁式和反應式的優點。它又分為兩相和五相:兩相步進角一般為1.8度而五相步進角一般為0.72度。這種步進電機的應用最為廣泛。
二、永磁式步進電機的控制
下面以電子愛好者業余製作中常用的永磁式步進電機為例,來介紹如何用單片機控制步進電機。圖1是35BY型永磁步進電機的外形圖,圖2是該電機的接線圖,從圖中可以看出,電機共有四組線圈,四組線圈的一個端點連在一起引出,這樣一共有5根引出線。要使用步進電機轉動,只要輪流給各引出端通電即可。將COM端標識為C,只要AC、C、BC、C,輪流加電就能驅動步進電機運轉,加電的方式可以有多種,如果將COM端接正電源,那麼只要用開關元件(如三極體),將A、B、輪流接地。列出了該電機的一些典型參數:表135BY48S03型步機電機參數型號步距角相數電壓電流電阻最大靜轉距定位轉距轉動慣量35BY48S03 7.5 4 12 0.26 47 180 65 2.5 有了這些參數,不難設計出控制電路,因其工作電壓為12V,最大電流為0.26A,因此用一塊開路輸出達林頓驅動器(ULN2003)來作為驅動,通過P1.4~P1.7來控制各線圈的接通與切斷。開機時,P1.4~P1.7均為高電平,依次將P1.4~P1.7切換為低電平即可驅動步進電機運行,注意在切換之前將前一個輸出引腳變為高電平。如果要改變電機的轉動速度只要改變兩次接通之間的時間,而要改變電機的轉動方向,只要改變各線圈接通的順序。

Ⅲ 單片機紅外線控制步進電機的方法

不知道你要怎麼控制,估計只是做實驗吧,你可以對紅外遙控器的信號進行解碼,每個按鈕的編碼都不同的,然後你自己去定義哪個按鍵是啟動,哪個按鍵是加速、哪個按鍵是減速,哪個按鍵是停止,等等等等.....

Ⅳ 下面分別有單片機的紅外線控制中斷函數和步進電機的控制函數。。大神們怎樣把他們結合起來

  1. 你要組合起來實現實現什麼功能?

  2. 步進電機應該是有正轉,反轉,轉角,轉速等都能控制的吧?不知你那個完整的步進電機是通過什麼參數實現這些功能的。

  3. 紅外遙控就是當遙控器按某個鍵的時候,單片機解碼出某個鍵的鍵值,根據不同的鍵值實現不同的功能的。比如按A鍵-鍵值為0x03 按B鍵-鍵值為0xf3。

Ⅳ 單片機控制步進電機

這是我自己做過的。源碼都給你了

#include<reg52.h>
#include<intrins.h>
#include<absacc.h>
#include<string.h>
#define uchar unsigned char
#define uint unsigned int

uint count; //當前計數值
uint distance;
bit intt=1;
unsigned char cont=0;
unsigned char co=0;
uchar buf;
//uchar m,lm,cm;
/**************針腳定義************/
sbit rect_wave=P2^0; //晶振控制信號
sbit RS=P1^0;
sbit RW=P1^1;
sbit EN=P1^2;
sbit CLR=P1^3;
sbit DATA=P1^4;
sbit CLK=P1^5;
sbit d=P2^1;
sbit cp=P2^2;
sbit dir=P2^3;

/***********************************/

/**************函數聲明************/
void time0over(void); //定時器計時程序
void clrlcd(void); //clr LCD
void c_send(unsigned char y); //發命令
void reset(void); // reset LCD
void d_send(unsigned char x); //發數據
void pos(unsigned char pos); //設定顯示位置
void l_delay(unsigned int t); //長延時
void trans(j);
void ret(void); //初始化系統
void retcont(void); //定時器復位
void math(void); //計算測量距離

/***************************/
void init(void)
{ TH1=0xf3;
TL1=0xf3;
PCON=0x80;
TR1=1;
SCON=0x50; /*串口初始化設置,波特率4800BPS*/
}

//*******************************//
void send(uchar dat) /*發送子程序*/
{ //uchar i;
/*發送一個數據*/
SBUF=dat;
while(TI==0);
TI=0;

}
/***********************************/
void turn (void) //電機轉動控制
{
unsigned char x;
cont++;
cp=~cp;
l_delay(50);
cp=~cp;
co++;
if(co == 3)
{d=~d;
}
if(co == 4)
{d=~d;
co=0;
}
if (cont == 200) //判斷是否進行反轉復位
{dir=~dir;
cont=0;
for(x=0;x < 200;x++)
{cp=~cp;
l_delay(5);
cp=~cp;
co++;
if(co == 3)
{d=~d;
}
if(co == 4)
{d=~d;
co=0;
}
}
dir=~dir;
cont=0;
}
}
/**************子程序**********************/
void int0 () interrupt 0 //中斷0服務程序
{
EX0=0; //關閉中斷
TR0=0; //關閉定時器
TF0=0; //標志位清零
rect_wave=0; //停止發送超聲波
intt=0;
}

void work(void)
{
if(!intt)
{
intt=1;
if (distance < 400)
{
buf=distance;
send(buf);
turn();
math();} //計算所測得的距離
l_delay(5); //延時
retcont(); //定時器復位
rect_wave=1;
count=0;
}
}

void math(void) //計算所測得的距離
{ uchar m,lm,cm;

cm=distance%10; //取距離的最低位
distance=distance/10; //取距離的次高位
lm=distance%10;
distance=distance/10; //取距離的最高位
m=distance%10;

clrlcd(); //輸出計算結果
pos(0);
d_send('d');
d_send('i');
d_send('s');
d_send('=');
//pos(4);
d_send(m+0x30);
d_send(lm+0x30);
d_send(cm+0x30);
d_send('c');
d_send('m');
l_delay(500);
}

void time0over(void) //定時器計時程序
{ TF0=0;
count++;
distance=count;
}

/*
void trans(j)
{
switch(j)
{
case 0: d_send('0');break;
case 1: d_send('1');break;
case 2: d_send('2');break;
case 3: d_send('3');break;
case 4: d_send('4');break;
case 5: d_send('5');break;
case 6: d_send('6');break;
case 7: d_send('7');break;
case 8: d_send('8');break;
case 9: d_send('9');break;
}

}
*/
delay() //延時
{
int i;
for(i=0;i<1000;i++);
}

void l_delay(unsigned int t) //延時
{
unsigned int p;
unsigned int j;

for(j=0;j<t;j++)
{
for(p=0;p<1000;p++);
}
}

void reset(void) // reset LCD
{
delay();
c_send(0x38);
c_send(0x01);
c_send(0x06);
c_send(0x0c);
c_send(0x80);
}

void clrlcd(void) // clr LCD
{
delay();
c_send(0x01);

}

void pos(unsigned char pos) //設定顯示位置
{
c_send(pos | 0x80);
}

void c_send(unsigned char y) //發命令
{
unsigned char i;
EN=1;
RS=0;
RW=0;
for(i=0;i<8;i++)
{
if(_crol_(y,i)&0x80)
DATA=1;
else
DATA=0;
CLK=0;
CLK=1;
}
EN=0;
delay();
}

void d_send(unsigned char x) //發數據
{
unsigned char i;
EN=1;
RS=1;
RW=0;
for(i=0;i<8;i++)
{
if(_crol_(x,i)&0x80)
DATA=1;
else
DATA=0;
CLK=0;
CLK=1;
}
EN=0;
delay();
}

void ret(void) //初始化計數器

{ TMOD=0x22; //設置定時器計數器1為工作方式2
TH0=0xc6; //設置計數初值高位元組
TL0=0xc6; //設置計數初值低位元組
count=0;
IE=0x00; //禁止中斷
TF0=0; //溢出標志位清零
TR0=1; //打開定時器1
rect_wave=1;

EA=1; //打開中斷
IP=0x01; //外部中斷0為高中斷優先順序
IT0=0; //外部中斷低電平觸發シ?
EX0=1;
}
void retcont(void)
{ TF0=0; //溢出標志位清零
TR0=1; //打開定時器1
EA=1; //打開中斷
IP=0x01; //外部中斷0為高中斷優先順序
IT0=0; //外部中斷下降沿觸發
EX0=1;
rect_wave=1;

}
/**************主程序************/
void main(void)
{ rect_wave=0;
reset();
l_delay(10);
ret();
init();
math();
for(;;)
{
if(TF0)
{
time0over();
}
work();
}
}

Ⅵ 單片機怎麼控制步進電機

ULN2003D 是驅動步進電機的驅動晶元,主要是匹配電機所需的電流。
由於是四相電機,步進電機之所以可以轉動就需要給相繞組提供連續的脈沖,所以需要4個埠來控制四相繞組的工作狀態(P15應該是不需要的),具體的編碼要看電機的拍數;
一旦明白這些,你就可以很容易編寫代碼來控制電機的轉動了,還有在脈沖間你可以設置不同的延時時間來調節電機的轉速。

Ⅶ 怎麼用紅外遙控器隨時控制一個步進電機 轉動和停止

在具有自帶控制脈沖的步進驅動器如EZD552的『啟停』信號口加裝紅外接收頭,即可實現紅外遙控器控制步進電機。

Ⅷ 如何用單片機控制步進電機步數

如何用單片機控制步進電機
步進電機是機電控制中一種常用的執行機構,它的用途是將電脈沖轉化為角位移,通俗地說:當步進驅動器接收到一個脈沖信號,它就驅動步進電機按設定的方向轉動一個固定的角度(及步進角)。通過控制脈沖個數即可以控制角位移量,從而達到准確定位的目的;同時通過控制脈沖頻率來控制電機轉動的速度和加速度,從而達到調速的目的。
一、步進電機常識
常見的步進電機分三種:永磁式(PM),反應式(VR)和混合式(HB),永磁式步進一般為兩相,轉矩和體積較小,步進角一般為7.5度或15度;反應式步進一般為三相,可實現大轉矩輸出,步進角一般為1.5度,但雜訊和振動都很大。在歐美等發達國家80年代已被淘汰;混合式步進是指混合了永磁式和反應式的優點。它又分為兩相和五相:兩相步進角一般為1.8度而五相步進角一般為0.72度。這種步進電機的應用最為廣泛。
二、永磁式步進電機的控制
下面以電子愛好者業余製作中常用的永磁式步進電機為例,來介紹如何用單片機控制步進電機。圖1是35BY型永磁步進電機的外形圖,圖2是該電機的接線圖,從圖中可以看出,電機共有四組線圈,四組線圈的一個端點連在一起引出,這樣一共有5根引出線。要使用步進電機轉動,只要輪流給各引出端通電即可。將COM端標識為C,只要AC、C、BC、C,輪流加電就能驅動步進電機運轉,加電的方式可以有多種,如果將COM端接正電源,那麼只要用開關元件(如三極體),將A、B、輪流接地。列出了該電機的一些典型參數:表135BY48S03型步機電機參數型號步距角相數電壓電流電阻最大靜轉距定位轉距轉動慣量35BY48S03 7.5 4 12 0.26 47 180 65 2.5 有了這些參數,不難設計出控制電路,因其工作電壓為12V,最大電流為0.26A,因此用一塊開路輸出達林頓驅動器(ULN2003)來作為驅動,通過P1.4~P1.7來控制各線圈的接通與切斷。開機時,P1.4~P1.7均為高電平,依次將P1.4~P1.7切換為低電平即可驅動步進電機運行,注意在切換之前將前一個輸出引腳變為高電平。如果要改變電機的轉動速度只要改變兩次接通之間的時間,而要改變電機的轉動方向,只要改變各線圈接通的順序。

Ⅸ 求一個程序,單片機接收紅外感測器發出的信號,然後再控制步進電機動作!

我有紅外遙控器的程序。
你自己可以改改:
/*-----------------------------------------------
名稱:遙控器紅外解碼液晶顯示
日期:2009.5
修改:無
內容:
------------------------------------------------*/
#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
#include<stdio.h>
#include<intrins.h>

#define TURE 1
#define FALSE 0

sbit IR=P3^2; //紅外介面標志
sbit RS = P2^4;//Pin4
sbit RW = P2^5;//Pin5
sbit E = P2^6;//Pin6

#define Data P0//數據埠
unsigned int hour,minute,second,count;char code Tab[16]="0123456789ABCDEF";
char data TimeNum[]=" ";char data Test1[]=" ";
/******************************************************************/
/* 變數聲明 */
/******************************************************************/

unsigned char irtime;//紅外用全局變數
bit irpro_ok,irok;
unsigned char IRcord[4]; //處理後的紅外碼,分別是 客戶碼,客戶碼,數據碼,數據碼反碼
unsigned char irdata[33]; //33個高低電平的時間數據

/******************************************************************/
/* 函數聲明 */
/******************************************************************/
void Ir_work(void);
void Ircordpro(void);
void ShowString (unsigned char line,char *ptr);
/******************************************************************/
/* 定時器0中斷服務函數 */
/******************************************************************/

void tim0_isr (void) interrupt 1 using 1//定時器0中斷服務函數
{
irtime++; //用於計數2個下降沿之間的時間
}

/******************************************************************/
/* 外部中斷0函數 */
/******************************************************************/
void ex0_isr (void) interrupt 0 using 0//外部中斷0服務函數
{
static unsigned char i; //接收紅外信號處理
static bit startflag; //是否開始處理標志位

if(startflag)
{

if(irtime<63&&irtime>=33)//引導碼 TC9012的頭碼,9ms+4.5ms
i=0;

irdata[i]=irtime;//存儲每個電平的持續時間,用於以後判斷是0還是1
irtime=0;
i++;
if(i==33)
{
irok=1;
i=0;
}
}

else
{irtime=0;startflag=1;}

}
/******************************************************************/
/* 定時器0初始化 */
/******************************************************************/
void TIM0init(void)//定時器0初始化
{

TMOD=0x02;//定時器0工作方式2,TH0是重裝值,TL0是初值
TH0=0x00; //重載值
TL0=0x00; //初始化值
ET0=1; //開中斷
TR0=1;
}
/******************************************************************/
/* 外部中斷初始化 */
/******************************************************************/
void EX0init(void)
{
IT0 = 1; //指定外部中斷0下降沿觸發,INT0 (P3.2)
EX0 = 1; //使能外部中斷
EA = 1; //開總中斷
}
/******************************************************************/
/* 紅外鍵值處理 */
/******************************************************************/

void Ir_work(void) //紅外鍵值散轉程序
{

TimeNum[5] = Tab[IRcord[0]/16]; //處理客戶碼並顯示
TimeNum[6] = Tab[IRcord[0]%16];
TimeNum[8] = Tab[IRcord[1]/16]; //處理客戶碼並顯示
TimeNum[9] = Tab[IRcord[1]%16];
TimeNum[11] = Tab[IRcord[2]/16]; //處理數據碼並顯示
TimeNum[12] = Tab[IRcord[2]%16];
TimeNum[14] = Tab[IRcord[3]/16]; //處理數據反碼並顯示
TimeNum[15] = Tab[IRcord[3]%16];

ShowString(1,TimeNum);//顯示處理過後的碼值
irpro_ok=0; //處理完成後清楚標志位

}
/******************************************************************/
/* 紅外解碼函數處理 */
/******************************************************************/
void Ircordpro(void)//紅外碼值處理函數
{
unsigned char i, j, k;
unsigned char cord,value;

k=1;
for(i=0;i<4;i++) //處理4個位元組
{
for(j=1;j<=8;j++) //處理1個位元組8位
{
cord=irdata[k];
if(cord>7)//大於某值為1,這個和晶振有絕對關系,這里使用12M計算,此值可以有一定誤差
{
value=value|0x80;
}
else
{
value=value;
}
if(j<8)
{
value=value>>1;
}
k++;
}
IRcord[i]=value;
value=0;
} irpro_ok=1;//處理完畢標志位置1

}

/******************************************************************/
/* 微秒延時函數 */
/******************************************************************/
void DelayUs(unsigned char us)//delay us
{
unsigned char uscnt;
uscnt=us>>1;/* Crystal frequency in 12MHz*/
while(--uscnt);
}
/******************************************************************/
/* 毫秒函數聲明 */
/******************************************************************/
void DelayMs(unsigned char ms)//delay Ms
{
while(--ms)
{
DelayUs(250);
DelayUs(250);
DelayUs(250);
DelayUs(250);
}
}

/******************************************************************/
/* 寫入命令函數 */
/******************************************************************/
void WriteCommand(unsigned char c)
{
DelayMs(5);//操作前短暫延時,保證信號穩定
E=0;
RS=0;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
}
/******************************************************************/
/* 寫入數據函數 */
/******************************************************************/
void WriteData(unsigned char c)
{
DelayMs(5); //操作前短暫延時,保證信號穩定
E=0;
RS=1;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
RS=0;
}
/******************************************************************/
/* 寫入位元組函數 */
/******************************************************************/
void ShowChar(unsigned char pos,unsigned char c)
{
unsigned char p;
if (pos>=0x10)
p=pos+0xb0; //是第二行則命令代碼高4位為0xc
else
p=pos+0x80; //是第二行則命令代碼高4位為0x8
WriteCommand (p);//寫命令
WriteData (c); //寫數據
}
/******************************************************************/
/* 寫入字元串函數 */
/******************************************************************/
void ShowString (unsigned char line,char *ptr)
{
unsigned char l,i;
l=line<<4;
for (i=0;i<16;i++)
ShowChar (l++,*(ptr+i));//循環顯示16個字元
}
/******************************************************************/
/* 初始化函數 */
/******************************************************************/
void InitLcd()
{
DelayMs(15);
WriteCommand(0x38); //display mode
WriteCommand(0x38); //display mode
WriteCommand(0x38); //display mode
WriteCommand(0x06); //顯示游標移動位置
WriteCommand(0x0c); //顯示開及游標設置
WriteCommand(0x01); //顯示清屏

}
/******************************************************************/
/* 主函數 */
/******************************************************************/

void main(void)
{
EX0init(); //初始化外部中斷
TIM0init();//初始化定時器

InitLcd(); //初始化液晶 DelayMs(15);
sprintf(Test1," haixiang MCU "); //顯示第一行固定信息 ShowString(0,Test1);
sprintf(TimeNum,"Code ");//顯示第二行固定信息 ShowString(1,TimeNum);
while(1)//主循環
{
if(irok) //如果接收好了進行紅外處理
{
Ircordpro();
irok=0;
}

if(irpro_ok) //如果處理好後進行工作處理,如按對應的按鍵後顯示對應的數字等
{
Ir_work();
}
}
}

Ⅹ 如何使用單片機控制步進電機

先看步進電機控制電機轉動原理,把時序搞清楚,單片機控制驅動按照時序置管腳就OK
1、本程序用於測試4相步進電機常規驅動
2、需要用跳帽或者杜邦線把信號輸出端和對應的步進電機信號輸入端連接起來
3、速度不可以調節的過快,不然就沒有力矩轉動了
4、按s4(設置成獨立按鍵模式)可以控制正反轉
------------------------------------------------*/

#include <reg52.h>

bit Flag;//定義正反轉標志位

unsigned char code F_Rotation[4]={0xf1,0xf2,0xf4,0xf8}; //正轉表格
unsigned char code B_Rotation[4]={0xf8,0xf4,0xf2,0xf1}; //反轉表格
/******************************************************************/
/* 延時函數 */
/******************************************************************/
void Delay(unsigned int i)//延時
{
while(--i);
}
/******************************************************************/
/* 主函數 */
/******************************************************************/
main()
{

unsigned char i;

EX1=1; //外部中斷0開
IT1=1; //邊沿觸發
EA=1; //全局中斷開

while(!Flag)
{
P0=0x71;//顯示 F 標示正轉
for(i=0;i<4;i++) //4相
{
P1=F_Rotation[i]; //輸出對應的相 可以自行換成反轉表格
Delay(500); //改變這個參數可以調整電機轉速 ,數字越小,轉速越大
}
}
while(Flag)
{
P0=0x7C;//顯示 b 標示反轉
for(i=0;i<4;i++) //4相
{
P1=B_Rotation[i]; //輸出對應的相
Delay(500); //改變這個參數可以調整電機轉速 ,數字越小,轉速越大
}
}
}
/******************************************************************/
/* 中斷入口函數 */
/******************************************************************/
void ISR_Key(void) interrupt 2 using 1
{
Delay(300);

Flag=!Flag; //s3按下觸發一次,標志位取反
}

閱讀全文

與單片機紅外遙控步進電機控制相關的資料

熱點內容
重生民國收母 瀏覽:723
男主當鴨子的韓劇電影 瀏覽:488
人乳奶水電影 瀏覽:211
台灣鏡花風月系列 瀏覽:551
主角叫江辰的重生小說 瀏覽:608
李采潭演的都是真的嗎 瀏覽:512
日本女人切腹大尺度電影 瀏覽:637
vr電影在哪看 瀏覽:86
法國四級電影有哪些 瀏覽:558
男主角叫林楓得到系統的小說 瀏覽:820
pdf列印白邊 瀏覽:612
重生異界收母收姨 瀏覽:801
韓國女同性戀影片 瀏覽:192
信念科幻電影 瀏覽:791
javaiocp 瀏覽:702
看免費大片網站 瀏覽:849
h5游戲源碼論壇 瀏覽:692
視覺表現pdf 瀏覽:555
htlm源碼 瀏覽:939
文明景洪app怎麼下載 瀏覽:232