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