臨近期末,學校的單片機課程需要做課程設計,主要內容是基于51單片機的可調速電機,具體要求如下,在此記錄一下具體的一個解題方案。
- 要求利用單片機輸出PWM波形,通過改變占空比,改變電樞兩端電壓的平均值,從而改變電動機的轉速
- 通過按鍵進行手動速度調整(速度+ 速度-)
- 利用串口調試助手或編寫上位機軟件,通過上位機控制直流速度調整
- 測量直流電機轉速,并實時顯示
原理圖
首先是繪制原理圖如下,右下角示波器為方便觀察PWM脈沖波形用,可忽略
驅動電路
由于單片機的輸出功率不足以驅動電機運動,因此這里使用L298芯片搭建一個驅動電路,驅動電壓為12V,用于驅動電機運動。驅動電路如圖。L298芯片的工作電壓為5V(VCC接5V電壓),支持同時驅動兩臺電機,可接驅動電壓范圍為(+5V~+46V),輸出電流高達4A。
L298芯片控制引腳狀態(tài)與電機對應狀態(tài)如下圖。因此,若要讓電機運動則需要,ENA置1,IN1與IN2引腳所處電平相反。
ENA | IN1 | IN2 | 直流電機狀態(tài) |
---|---|---|---|
0 | X | X | 停止 |
1 | 0 | 0 | 制動 |
1 | 0 | 1 | 正轉 |
1 | 1 | 0 | 反轉 |
1 | 1 | 1 | 制動 |
MOTOR-ENCODER詳解
這里由于需要測量電機轉速,使用需要使用帶有編碼器的電機,Proteus中帶有這樣的一個電機,元件名稱為MOTOR-ENCODER。MOTOR-ENCODER有5根引腳,其中左右兩個接工作電壓。上面三根引腳,左邊與右邊電機每轉一圈就輸出設定的脈沖數(shù)(這里設定每轉一圈輸出360個脈沖),二者脈沖相位相差90°。中間的引腳電機每轉一圈引腳輸出一個脈沖。 電機具體屬性參數(shù)如下,這里設置電機額定電壓為12V(因為驅動電路的驅動電壓為12V),每轉脈沖數(shù)為360(取值范圍為1~360),其余保持默認。
串口通信
由于需要用到串口通信,因此需要用到Proteus中的虛擬串口COMPIM,將元件端口設置為COM1,波特率設置為9600,數(shù)據(jù)位8位,無校驗位,停止位1位。將虛擬串口的RXD與單片機的RXD相連,TXD與TXD相連(與一般的串口連接不同,一般需要TXD與RXD交叉相連)。
然后打開VSPD虛擬串口連接軟件(VSPD軟件的下載與使用可參考該文章: 虛擬串口 VSPD 的使用),將COM1與COM2端口進行虛擬鏈接。然后進入串口助手打開COM2端口(一定不能打開COM1口,因為COM1口已被單片機占用) 設置好波特率、校驗位與停止位,即可與單片機成功硬件連接。
電機測速原理
測速原理:單位時間內,根據(jù)該時間段內統(tǒng)計的脈沖數(shù)計算電機實際速度,這里單位時間為50ms。
由于編碼器設置為每圈發(fā)出360個脈沖,則統(tǒng)計在50ms內的脈沖數(shù)即可知道在這50ms內電機轉了多少圈,從而可推算出電機每分鐘的轉速。
設編碼器單圈總脈沖數(shù)為C,在時間T0內,統(tǒng)計到的編碼器脈沖數(shù)為M0,則轉速n的計算公式為:
n = M0/(C*T0)。
PWM
PWM即脈沖寬度調制,在具有慣性的系統(tǒng)中,可以通過對一系列脈沖的寬度進行調制,來等效的獲得所需要的模擬參量。
其實就是通過控制高低電平的時間,來對輸出的波形進行控制。
其中有幾個重要的參數(shù)
PWM的頻率:
是指1秒鐘內信號從高電平到低電平再回到高電平的次數(shù)(一個周期);
也就是說一秒鐘PWM有多少個周期
單位: Hz
表示方式: 50Hz 100Hz
PWM的周期:
T=1/f
周期=1/頻率
50Hz = 20ms 一個周期
如果頻率為50Hz ,也就是說一個周期是20ms 那么一秒鐘就有 50次PWM周期
占空比:
是一個脈沖周期內,高電平的時間與整個周期時間的比例
單位: % (0%-100%)
表示方式:20%
一個簡單的生成PWM的方法: 利用定時器進行定時中斷,分別設置兩個變量counter和compare。其中compare表示占空比。假設每100us定時器產生一次中斷,則每進一次中斷counter++,中斷100次為一個周期,即T=10ms。
假設設置compare為60,即占空比為60%
每次定時器進入中斷后,將當前counter值與compare進行判斷,若counter<compare則置引腳為高電平,否則置低電平。這樣在一個周期中,counter從1至100計數(shù),counter為1~60時引腳均為高電平,即在一個周期內有60%的時間引腳都處于高電平。
這樣我們就可以通過調整compare變量的值來控制PWM的占空比,從而達到控制電機轉速的目的。
有關PWM的詳細知識可參考以下文章
51單片機-PWM調速(直流電機,智能小車的電機調速)
PWM原理 PWM頻率與占空比詳解
軟件部分
#include <REG51.H>
#define K 21/8
void UartInit(void);
void UART_SendByte(unsigned char Byte);
void Timer0Init(void);
sbit motor1_IN1=P0^0;
sbit motor1_IN2=P0^1;
sbit motor1_ENA1=P0^2;
sbit ADD=P0^3;
sbit SUBTRACT=P0^4;
unsigned char led_mod[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽極字模
unsigned char led_point[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//帶小數(shù)點字模
unsigned char counter,compare;//compare為占空比
unsigned int n,m,rad;//n為脈沖數(shù)
void delay(unsigned char time) //1ms@11.0592MHz
{
unsigned char i, j;
i = 15*time;
j = 90;
do
{
while (--j);
} while (--i);
}
void Display() //LED顯示
{
P2=(0x01);
P1=led_mod[(rad/100)%10];
delay(1);
P2=(0x01<<1);
P1=led_mod[(rad/10)%10];
delay(1);
P2=(0x01<<2);
P1=led_point[rad%10];
delay(1);
P2=(0x01<<3);
P1=led_mod[(rad%10)];
delay(1);
}
void move(void) //啟動電機
{
motor1_IN1=1;
motor1_IN2=0;
}
void UartInit(void) //9600bps@11.0592MHz
{
SCON = 0x50; //8位數(shù)據(jù),可變波特率
TMOD &= 0x0F; //設置定時器模式
TMOD |= 0x20; //設置定時器模式
TL1 = 0xFD; //設置定時初始值
TH1 = 0xFD; //設置定時初始值
ET1 = 0; //禁止定時器1中斷
TR1 = 1; //定時器1開始計時
ES=1; //開啟中斷
EA=1; //開啟中斷
PS=1; //設置優(yōu)先級
}
void Timer0Init(void) //100微秒@11.0592MHz
{
TMOD &= 0xF0; //設置定時器模式
TMOD |= 0x02; //設置定時器模式
TL0 = 0xA4; //設置定時初始值
TH0 = 0xA4; //設置定時重載值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
ET0=1; //定時器0中斷開啟
EA=1; //EA開啟
PT0=0; //定時器0開始計時
}
void UART_Routine(void) interrupt 4 //串口接收中斷
{
if(RI==1)
{
compare=SBUF; //接收串口傳輸來的數(shù)據(jù)
SBUF=compare; //將當前占空比發(fā)送回上位機
while(!TI); //等待發(fā)送完畢
TI=0; //標志位復位
RI=0; //標志位復位
}
}
void Timer0_Routine(void) interrupt 1 //定時器0中斷,用于PWM生成
{
TL0 = 0xA4; //設置定時初始值
TH0 = 0xA4; //設置定時初始值
counter++;
m++;
counter%=100;
if(counter<compare) //PWM生成
motor1_ENA1=1;
else
motor1_ENA1=0;
if(m==500) //50ms后計算一次轉速
{
rad=n*K;//計算轉速,若結果與實際有較大誤差則調整比例系數(shù)K
m=0;
n=0;
}
}
void interrupt0_int() //電機編碼器脈沖中斷初始化
{
IT0=1;
EX0=1;
EA=1;
PX0=0;
}
void motor_Routine(void) interrupt 0 //編碼器脈沖中斷函數(shù)
{
n++; //脈沖數(shù)+1
}
void main()
{
Timer0Init(); //定時器0初始化
interrupt0_int(); //電機編碼器中斷初始化
UartInit(); //串口中斷初始化
compare=70; //初始占空比70%
n=0; //電機旋轉圈數(shù)初始化
m=0; //計時次數(shù)初始化
move(); //啟動電機
while(1)
{
if(ADD==0)
{
compare=compare+10; //按下按鍵占空比+10
if(compare>100)
compare=100;
while(!ADD) //等待松開
Display();
}
if(SUBTRACT==0)
{
compare=compare-10; //按下按鍵占空比-10
if(compare<0)
compare=0;
while(!SUBTRACT) //等待松開
Display();
}
Display();
}
}
成果
電機正常轉動,同時數(shù)碼管顯示當前轉速,可通過ADD按鍵和SUBTRACT按鍵對轉速進行加減速 。文章來源:http://www.zghlxwxcb.cn/news/detail-412962.html
可通過串口對轉速大小進行調整。文章來源地址http://www.zghlxwxcb.cn/news/detail-412962.html
到了這里,關于Proteus基于51單片機通過PWM脈沖調制控制電機轉速_按鍵與串口控制轉速_電機轉速可測的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!