第八集
講解用移位和或運(yùn)算實(shí)現(xiàn)流水燈的方法《51單片機(jī)復(fù)習(xí)筆記2》里面的代碼。
講解了用函數(shù)的方法實(shí)現(xiàn)流水燈。
第九集
一、ULN2003芯片。
用于增強(qiáng)單片機(jī)IO口的驅(qū)動(dòng)能力。
ULN2003是高耐壓、大電流達(dá)林頓陳列,由七個(gè)硅NPN達(dá)林頓管組成。
ULN2003是大電流驅(qū)動(dòng)陣列,多用于單片機(jī)、智能儀表、PLC、數(shù)字量輸出卡等控制電路中。可直接驅(qū)動(dòng)繼電器等負(fù)載。
ULN2003 的每一對(duì)達(dá)林頓都串聯(lián)一個(gè)2.7K 的基極電阻,在5V 的工作電壓下它能與TTL 和CMOS 電路
直接相連,可以直接處理原先需要標(biāo)準(zhǔn)邏輯緩沖器來(lái)處理的數(shù)據(jù)。
ULN2003 工作電壓高,工作電流大,灌電流可達(dá)500mA,并且能夠在關(guān)態(tài)時(shí)承受50V-95V 的電壓,輸出還可以在高負(fù)載電流并行運(yùn)行。ULN2003 采用DIP—16 或SOP—16 塑料封裝。
一、蜂鳴器
驅(qū)動(dòng)蜂鳴器很簡(jiǎn)單,由于51單片機(jī)的IO口驅(qū)動(dòng)能力還不足以驅(qū)動(dòng)蜂鳴器,所以需要加一個(gè)三極管來(lái)做電子開(kāi)關(guān)控制蜂鳴器。(當(dāng)然也可以用ULN2003)。上面電路圖中其實(shí)不接電阻也可以驅(qū)動(dòng)蜂鳴器,當(dāng)然R26的分支需要去掉。FM接在單片機(jī)的P2^3IO口上并給低電平即可讓蜂鳴器鳴響。
第十集
一、步進(jìn)電機(jī)
步進(jìn)電機(jī)和我們以前玩的四驅(qū)車(chē)?yán)锩娴鸟R達(dá)是不一樣的。里面的馬達(dá)是連續(xù)旋轉(zhuǎn)的,而步進(jìn)電機(jī)卻是一步一步地轉(zhuǎn)動(dòng),準(zhǔn)確來(lái)說(shuō)是每次只轉(zhuǎn)動(dòng)一個(gè)很小的角度,用手也是轉(zhuǎn)不動(dòng)的。
對(duì)于角位移步進(jìn)電機(jī)可以通過(guò)控制脈沖的個(gè)數(shù)來(lái)控制角位移量(即幾個(gè)脈沖就轉(zhuǎn)動(dòng)幾個(gè)步距角),達(dá)到準(zhǔn)確定位的目的。可以通過(guò)控制脈沖的頻率來(lái)控制步進(jìn)電動(dòng)機(jī)的轉(zhuǎn)動(dòng)速度和加速度達(dá)到調(diào)速的功能。
步進(jìn)電機(jī)按相數(shù)分可分為:?jiǎn)蜗、雙相和多相三種。
步進(jìn)電機(jī)的工作原理:(這里是3相步進(jìn)電機(jī))里面的1,2,3,4是轉(zhuǎn)子,外面的A、A1、B、B1、C、C1是定子。
當(dāng)A相通電時(shí),產(chǎn)生A-A1軸線方向的磁通,并通過(guò)轉(zhuǎn)子形成閉合回路。這時(shí)候A、A1就成了電磁鐵的N、S極。在磁場(chǎng)的作用下,轉(zhuǎn)子總是力圖轉(zhuǎn)到磁阻最小的位置,也就是要轉(zhuǎn)到轉(zhuǎn)子的齒對(duì)齊A、A1極的位置,也就是說(shuō)轉(zhuǎn)子的1、3會(huì)對(duì)著定子的A、A1(圖a);
緊接著B相通電(A、C兩相不通電),轉(zhuǎn)子就會(huì)向順時(shí)針?lè)较蜣D(zhuǎn)4、2對(duì)齊到定子的B1、B(圖b)
緊接著C相通電(A、B兩相不通電),轉(zhuǎn)子就會(huì)向順時(shí)針?lè)较蜣D(zhuǎn)1、3對(duì)齊到定子的C1、C(圖c)
當(dāng)一直重復(fù)著上面的步驟A→B→C那么轉(zhuǎn)子就會(huì)一直順時(shí)針?lè)较蜣D(zhuǎn)動(dòng)。每轉(zhuǎn)動(dòng)一次都只是轉(zhuǎn)動(dòng)一個(gè)固定的角度,也就是步距角。。當(dāng)重復(fù)的速度越快,那么轉(zhuǎn)動(dòng)的速度也就越快。
這種通電方式是1相勵(lì)磁方式。
1-2相勵(lì)磁方式:
設(shè)A相先通電,轉(zhuǎn)子就會(huì)向順時(shí)針?lè)较蜣D(zhuǎn)1、3對(duì)齊到定子的A、A1(圖a)
接著在A相通電的情況下,繼續(xù)給B相通電。這時(shí)B、B1極對(duì)轉(zhuǎn)子2、4產(chǎn)生磁力,但是A,A1繼續(xù)拉住1、3,因此轉(zhuǎn)子會(huì)轉(zhuǎn)到兩個(gè)磁拉力平衡為止(如圖b),從外看來(lái),轉(zhuǎn)子順時(shí)針轉(zhuǎn)動(dòng)了一個(gè)很小的角度。
接著A相斷電,B相繼續(xù)通電。這時(shí)轉(zhuǎn)子順時(shí)針轉(zhuǎn)動(dòng)2、4和定子B、B1極對(duì)齊(如圖c)。
接著B相通電的情況下,給C相通電。這時(shí)C、C1極對(duì)轉(zhuǎn)子3、1產(chǎn)生磁力,而B、B1會(huì)繼續(xù)拉住2、4,因此轉(zhuǎn)子會(huì)順時(shí)針轉(zhuǎn)動(dòng)一個(gè)小角度(如圖d)。
一直重復(fù)以上步驟A→A、B→B→B、C→C→C、A→A.....,一樣可以讓步進(jìn)電機(jī)轉(zhuǎn)動(dòng)起來(lái),其中每一個(gè)步驟通電都會(huì)讓步進(jìn)電機(jī)轉(zhuǎn)動(dòng)一個(gè)角度,這個(gè)角度是1相勵(lì)磁方式角度的一半(1/2),這就是稱為最小步距角。
這種步進(jìn)電機(jī)叫減速步進(jìn)電機(jī)(里面有減速齒輪),減速比是1/64。
里面減速齒輪轉(zhuǎn)動(dòng)64圈,外面的轉(zhuǎn)子才轉(zhuǎn)動(dòng)1圈。
驅(qū)動(dòng)電壓為5V,步進(jìn)(距)角度5.625*1/64,采用5線4相。
線的順序是VCC、A、B、C、D。
1相勵(lì)磁方式驅(qū)動(dòng)程序代碼:實(shí)現(xiàn)讓步進(jìn)電機(jī)轉(zhuǎn)動(dòng)360°。
現(xiàn)在知道步進(jìn)電機(jī)的最小步距角是5.625*1/64 = 0.087890625°
1相勵(lì)磁方式 每通一相電(即每轉(zhuǎn)動(dòng)一次)的角度應(yīng)該是最小步距角的2倍(即 0.087890625°*2=0.17578125)。一個(gè)循環(huán)就是4相: A→B→C→D(即0.17578125*4=0.703125°)。
那么一個(gè)循環(huán)就是0.703125°,要幾個(gè)循環(huán)才能轉(zhuǎn)動(dòng)360°呢?360°/0.703125 = 512個(gè)循環(huán)。
下面這份代碼是通過(guò)按位方式給A、B、C、D相輪流通電。
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
sbit DA = P1^0; // A相
sbit DB = P1^1; // B相
sbit DC = P1^2; // C相
sbit DD = P1^3; // D相
void delay(uint x)
{
uint y;
for(;x>0;x--)
for(y=10;y>0;y--);
}
void main()
{
uint i = 512;
uchar delayCout = 25;
while (i--) // 循環(huán)512次 就轉(zhuǎn)動(dòng)360°的角度。
{
DA = 1; // A相通電
delay(delayCout); // 需要延時(shí)一小段時(shí)間讓硬件反應(yīng)的過(guò)來(lái)
DA = 0; // A相斷電
DB = 1; // B相通電
delay(delayCout); // 需要延時(shí)一小段時(shí)間讓硬件反應(yīng)的過(guò)來(lái)
DB = 0; // B相斷電
DC = 1; // C相通電
delay(delayCout); // 需要延時(shí)一小段時(shí)間讓硬件反應(yīng)的過(guò)來(lái)
DC = 0; // C相斷電
DD = 1; // D相通電
delay(delayCout); // 需要延時(shí)一小段時(shí)間讓硬件反應(yīng)的過(guò)來(lái)
DD = 0; // D相斷電
}
while(1); // 旋轉(zhuǎn)完后就停在這里,避免重復(fù)執(zhí)行main函數(shù)
}
上面那份源碼很好理解,下面是按邏輯運(yùn)算實(shí)現(xiàn)的通斷A、B、C、D四相:
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
void delay(uint x)
{
uint y;
for(;x>0;x--)
for(y=10;y>0;y--);
}
void main()
{
uint i = 512;
uchar Xh;
uchar delayCout = 25;
while (i--) // 循環(huán)512次 就轉(zhuǎn)動(dòng)360°的角度。調(diào)整角度
{
Xh = 3;
P1 = 0x01; // P1 == 0000 0001 相當(dāng)于 P1^0置1 將A相通電
delay(delayCout); // 延時(shí)一段時(shí)間讓步進(jìn)電機(jī)能反應(yīng)過(guò)來(lái)
while(Xh--)
{
P1 <<= 1; // 第一次循環(huán) 0000 0001<<1 = 0000 0010 相當(dāng)于 P1^1 置1同時(shí)將P1^0置0 A相斷電 B相通
電每次循環(huán)都會(huì)將1向左移動(dòng)一位
delay(delayCout); // 這里是調(diào)節(jié)切換速度,即轉(zhuǎn)動(dòng)速度
}
}
while(1); // 旋轉(zhuǎn)完后就停在這里,避免重復(fù)執(zhí)行main函數(shù)
}
步進(jìn)電機(jī)主要知道它的工作原理和計(jì)算角度。步進(jìn)電機(jī)最大的方便是可以精確控制轉(zhuǎn)動(dòng)角度和速度。