基于labview的PWM電機調速 一、簡介: 此設計模擬工業控制現場,通過調節Labview界面中的模擬儀表,通過RS232串口通信,把轉速控制信息通過串口傳送到單片機中,進而利用單片機控制電動機的轉速。 二、Labview前面板設計: 1.左部分為通訊端口、波特率、數據位、奇偶校驗位、停止位、延時等選擇端口。 2.中間為所調電壓的PWM波形,圖中藍綠色所示。 3.右部分顯示的是等效電壓的大小,圖中所示為2.35V。 4.下半部分為調節電壓的儀表和確定按鈕,當調節好電壓,按下確定鍵后方能調節電機轉速。 三、Labview程序框圖: 1. 串口通訊部分: 2.PWM電壓波形顯示部分: 四、硬件設計: 單片機IO端口的電流太小,不足以驅動直流電機;本設計通過I0端口外接ULN2003AN驅動直流電動機。 五、單片機部分程序: /*********************************************關于頻率和占空比的確定,對于12M晶振,假定PWM輸出頻率為1KHZ,這樣定時中斷次數 * *設定為C=10,即0.01MS中斷一次,則TH0=FF,TL0=F6;由于設定中斷時間為0.01ms,這樣* *可以設定占空比可從1-100變化。即0.01ms*100=1ms ******************************************************************************/ #include<reg52.h> //52單片機頭文件 #include <intrins.h> //包含有左右循環移位子函數的庫 #define uint unsigned int //宏定義 #define uchar unsigned char //宏定義 #define V_TH0 0XFF #define V_TL0 0XF6 uchar ZKB1; sbit P1_2=P1^2; void init_sys(void); /*系統初始化函數*/ void main() //主函數 { init_sys(); while(1) { /*對占空比值限定范圍*/ if (ZKB1>99) ZKB1=1; if (ZKB1<1) ZKB1=99; } } void timer0(void) interrupt 1 using 2 { static uchar click=0; /*中斷次數計數器變量*/ TH0=V_TH0; /*恢復定時器初始值*/ TL0=V_TL0; ++click; if (click>=100) click=0; if (click<=ZKB1) /*當小于占空比值時輸出低電平,高于時是高電平,從而實現占空比的調整*/ P1_2=1; else P1_2=0; } void ser() interrupt 4 { RI=0; ZKB1=SBUF; } /*系統初始化函數*/ void init_sys() { ZKB1=40; TMOD=0x21;//設置定時器0工作方式1,定時器1為工作方式2 TH0=V_TH0; //定時0.01s TL0=V_TL0; TH1=0xF3; //波特率2400 TL1=0xF3; REN=1; //允許串口接收數據 SM0=0;//串口工作方式1,8位數據傳送 SM1=1; EA=1;//開總中斷 ES=1; //串口中斷開 PS=1; //串口中斷優先級最高 ET0=1;//開定時器0中斷 TR1=1; //開波特率 TR0=1;//啟動定時器0 } 基于labview的PWM電機調速 一、簡介: 此設計模擬工業控制現場,通過調節Labview界面中的模擬儀表,通過RS232串口通信,把轉速控制信息通過串口傳送到單片機中,進而利用單片機控制電動機的轉速。 二、Labview前面板設計: 1.左部分為通訊端口、波特率、數據位、奇偶校驗位、停止位、延時等選擇端口。 2.中間為所調電壓的PWM波形,圖中藍綠色所示。 3.右部分顯示的是等效電壓的大小,圖中所示為2.35V。 4.下半部分為調節電壓的儀表和確定按鈕,當調節好電壓,按下確定鍵后方能調節電機轉速。 三、Labview程序框圖: 1. 串口通訊部分: 2.PWM電壓波形顯示部分: 四、硬件設計: 單片機IO端口的電流太小,不足以驅動直流電機;本設計通過I0端口外接ULN2003AN驅動直流電動機。 五、單片機部分程序: /*********************************************關于頻率和占空比的確定,對于12M晶振,假定PWM輸出頻率為1KHZ,這樣定時中斷次數 * *設定為C=10,即0.01MS中斷一次,則TH0=FF,TL0=F6;由于設定中斷時間為0.01ms,這樣* *可以設定占空比可從1-100變化。即0.01ms*100=1ms ******************************************************************************/ #include<reg52.h> //52單片機頭文件 #include <intrins.h> //包含有左右循環移位子函數的庫 #define uint unsigned int //宏定義 #define uchar unsigned char //宏定義 #define V_TH0 0XFF #define V_TL0 0XF6 uchar ZKB1; sbit P1_2=P1^2; void init_sys(void); /*系統初始化函數*/ void main() //主函數 { init_sys(); while(1) { /*對占空比值限定范圍*/ if (ZKB1>99) ZKB1=1; if (ZKB1<1) ZKB1=99; } } void timer0(void) interrupt 1 using 2 { static uchar click=0; /*中斷次數計數器變量*/ TH0=V_TH0; /*恢復定時器初始值*/ TL0=V_TL0; ++click; if (click>=100) click=0; if (click<=ZKB1) /*當小于占空比值時輸出低電平,高于時是高電平,從而實現占空比的調整*/ P1_2=1; else P1_2=0; } void ser() interrupt 4 { RI=0; ZKB1=SBUF; } /*系統初始化函數*/ void init_sys() { ZKB1=40; TMOD=0x21;//設置定時器0工作方式1,定時器1為工作方式2 TH0=V_TH0; //定時0.01s TL0=V_TL0; TH1=0xF3; //波特率2400 TL1=0xF3; REN=1; //允許串口接收數據 SM0=0;//串口工作方式1,8位數據傳送 SM1=1; EA=1;//開總中斷 ES=1; //串口中斷開 PS=1; //串口中斷優先級最高 ET0=1;//開定時器0中斷 TR1=1; //開波特率 TR0=1;//啟動定時器0 } |