張旺 王東 黃玲玲 沈霄
【摘 要】隨著我國工業化進程和電子技術的快速發展,離心機的應用越來越廣泛。與此同時,企業對離心機各方面的性能有著越來越高的要求。本文詳細介紹了基于DSPIC30F3011單片機的驅動系統的設計方案、轉速檢測和通信系統各個部分,并附上了部分軟件程序。
【關鍵詞】離心機;軟件;PWM波形;測速系統;通信系統
中圖分類號: TQ051 文獻標識碼: A 文章編號: 2095-2457(2018)19-0052-003
DOI:10.19694/j.cnki.issn2095-2457.2018.19.022
Software Design of Centrifugal Variable Frequency Drive System
ZHANG Wang WANG Dong HUANG Ling-ling SHEN Xiao
(Hunan Normal University, School of Engineering and Design, Changsha Hunan 410000, China)
【Abstract】With the rapid development of industrialization and electronic technology in China, the application of centrifuges is more and more extensive. At the same time, companies have increasingly higher requirements for all aspects of centrifuge performance. This paper introduces the design scheme, speed detection and communication system parts of the drive system based on DSPIC30F3011 microcontroller, and attaches some software programs.
【Key words】Centrifuge; Software; PWM waveform; Speed measurement system; Communication system
1 芯片簡介
本系統選擇DSPIC30F3011作為主芯片,該芯片是microchip公司生產的高性能數字信號控制器,其包含5個16位定時器,4路輸入捕捉、4路輸出比較,6路PWM通道,9路10位的A/D轉換,2個異步收發器UART以及大內存,完全滿足產生SPWM調速、建立用戶通信系統、測量轉速以及電機其他功能的需求。
2 PWM模塊
產生SPWM的方案:將PWM時基設置工作在連續向上/向下計數模式,產生一個對稱三角波形,通過公式計算出PTPER的值,通過配置特殊事件觸發寄存器的值,得到一路中心對稱的PWM波形,將PWM配對I/O引腳模式位設置為1,互補輸出模式,得到一組互補的輸出。由此得到三組PWM波。將SIN函數值放到各個占空比寄存器當中,得到三組隨正弦規律變化的SPWM波形。
通過配置DSPICL30F3011芯片的PWM模塊的相關寄存器,實現一個基本的三組PWM波的輸出。在本設計中,采用的是一個頻率為6MHz的晶振,產生一個頻率為6.5KHz的PWM波,需要配置PTCON(PWM時基控制寄存器)、PTPER(PWM時基周期寄存器)、SEVTCMP(特殊事件比較寄存器)、PWMCON1(PWM控制寄存器1)、PWMCON2(PWM控制寄存器2)。
2.1 產生單通道PWM波形輸出
為了產生三角載波,需要將PWM模塊時基控制寄存器PTCON設置為0X8002(開啟PWM時基,PWM時基輸出后預分頻比設為1:1,輸入時鐘預分頻比為1:1,工作在連續向上/向下計數模式),可以根據需要設計不同的分頻系數,此值僅作參考。通過式(1)
PTPER=■-1式(1)
計算出PWM時基周期寄存器的值,并將十五位寄存器的值寫入時基寄存器(PTMR),因為工作在連續向上/向下計數模式,此值是三角載波的峰值,載波周期需乘以二,完成此步驟之后還需將相應的中斷允許寄存器開啟,并且根據需要設計相應的中斷優先級,即可完成載波輸出。
假設采用6M晶振,輸出PWM波的頻率為6.5k,PWM時基工作在連續向上/向下計數模式,無分頻,則:
PTPER=■-1=460
部分初始化例程如下:
IFS2bits.PWMIF=0;清除PWM中斷標志狀態位
IEC2bits.PWMIE=1;允許PWM中斷
IPC9=0X5000;將PWM中斷優先級設為3
PTCON=0X8002;
PTMR=0X0000;清除計數寄存器值
PTPER=460;輸出頻率為6.5k的PWM波
2.2 產生三組PWM波形輸出
為了驅動三相電動機,在硬件電路設計了三組逆變橋,每組逆變橋的兩個開關管不能同時導通,并且三組的電壓相位相差120°,因此在軟件部分,控制開關管的脈沖序列必須達到這兩個要求。DSPIC30F3011內部的PWM控制寄存器可以控制PWM波的輸出模式,當處于互補模式時,就可以得到一組互補的序列(在編寫程序時,需要用到PWMCON1(PWM控制寄存器1)。考慮到開關器件的開關時間的存在,除此之外必須要設置序列間足夠長的死區時間,保證同一逆變橋的兩個開關管不會同時閉合。
假設采用6M晶振,死區時間由單元A提供,單元A的預分頻比為1:2,死區時間設為5us 則:
十六進制時間值=3MHz×5μs=15=0X000F
部分程序如下:
DTCON1=0X000F;
DTCON2=0X0000;所有PWM信號的死區時間都由單元A提供
PWMCON1=0X0077;模塊為互補模式,允許PWMPIN引腳輸出
3 測速系統的軟件實現
本系統中采用霍爾元件測速法,將霍爾元件的輸入端安裝在電機底部的轉軸上,輸出端接CPU的CN端口,根據其測速原理,在程序設計部分,需要檢測其輸出端的電平變化,并且進行計數,可以用單片機DSPIC30F3011內部的計數器和輸入捕捉中斷模塊來實現。
初始化程序如下:
void initial_CN(void)
{
CNPU1=0X00fe; //CN12345,6,7,上拉開啟CN0不上拉,作AD口.
CNPU2=0X0006; //CN17.18上拉.
CNEN1=0X0000; //CN5,CN6,CN7電平變化中斷關閉。
CNEN2=0X0000; //不要CN中斷.
IPC3=0X0000;
IEC0bits.CNIE=0; //關閉電平變化中斷
}
void initial_icp7(void)
{
IC7CON=0X0002; //每個下降沿捕捉一次,每次一個中斷,捕捉TMR3的內容。
IC7BUF=0;
}
計數器初始化程序如下
void initial_timer(void)
{ PR1=24000; // t1計數周期設為24000
TMR1=0;
TMR2=0;
TMR3=0;
T2CON=0X0008; //t2和T3形成32位定時器
PR2=0XFFFF;
PR3=0X06FF; //最大的周期設為19秒,如果19秒后沒有進入CN中斷,報錯。
}
輸入捕捉模塊中斷程序如下
void __attribute__((interrupt, no_auto_psv)) _IC7Interrupt(void)
{
hall_timer_low=TMR2;
hall_timer = TMR3HLD;
hall_timer <<= 16;
hall_timer += hall_timer_low;
TMR3HLD=0;
TMR2=0;
IFS1bits.IC7IF=0; //清除 輸入捕捉中斷.
if(hall_timer>30000)
{
count_speed = 720000000/hall_timer;
current_speed = count_speed;
}
if(syn_speed_set<(current_speed))
SpeedCheckCount++;
else
SpeedCheckCount=0;
}
4 通信系統的軟件實現
因為異步串行通信接口具有傳輸線少、成本低、可靠性高、實現簡單等優點,在本設計中,對傳輸距離沒有太高的要求,因此選擇RS-232端口進行傳輸,而所選用的CPU內部集成有UART(通用異步收發器),只要在程序部分進行配置即可。
DSPIC30F3011芯片的UART是可以直接連接外設的串行I/O端口之一,在本設計中,利用這一端口實現軟件通信部分。在通信模塊有一個波特率發生器UXBRG,通過此寄存器,可設置波特率,計算方法如式(5-2a)、(5-2b):
波特率=■式(5-2 a)
UXBRG=■-1式(5-2 b)
例如:系統晶振頻率為6MHz,設置波特率為1200,求波特率發生器的值。
UXBRG=■-1■-1=311
將此值寫入到波特率發生器,通信系統的波特率為1200
UART初始化程序如下:
void initial_uart(void)
{
U1BRG=311; //波特率是1200的值。
U1STA=0X0130; //使能地址檢測//接收到一個緩沖器滿時,中斷標志置位
U1MODE=0X0406; //一個停止位,9位數據無奇偶效驗,使用ALIO(輔助IO端口)
U1MODEbits.UARTEN=1; //啟用UART
U1STAbits.UTXEN=1; //啟用發送功能。
}
發送數據程序:
void send_uart_data(void)
{
if(U1STAbits.UTXBF==0)//發送緩沖器未滿
{
if(tx_count==0) //重新發送一個字數據
U1TXREG=tx_data[tx_count];//發送緩沖器加載數據
else
U1TXREG=tx_data[tx_count]&0x00ff; //如果9位數據沒加載完,緩沖寄存器繼續加載 tx_count++;
if(tx_count>10)//加載完9位數據,寫入數據
{ tx_count=0;
write_send_data();
}
}
}
數據接收子程序如下:
//*****************VOID receive_data數據接收子程序**************************************
void receive_uart_data(void)
{
if(U1STAbits.OERR)
{
U1STAbits.OERR=0; //如果有數據溢出錯誤,清除數據溢出錯誤
IFS0bits.U1RXIF=0;//清除接收中斷標志
if(sys_error==0) //無系統標志錯誤數據
sys_error=6; //串口通訊錯誤置位。
}
else if(U1STAbits.FERR)//檢測到當前字符的幀錯誤
{
U1STAbits.FERR=0;//清除幀錯誤標志位
if(sys_error==0)
sys_error=7; //返回接收錯誤信息
}
else if(rx_count==0)//接收寄存器中無數據
{
if(IFS0bits.U1RXIF)//UART1接收器中斷請求
{
IFS0bits.U1RXIF=0;//清除UART1接收器狀態標志位
while(U1STAbits.URXDA)//接收緩沖器中有數據
rx_data[0]= U1RXREG;//接收數據
if(rx_data[0]==0x0169)
{ rx_count++;
U1STAbits.ADDEN=0;//地址檢測模式禁止(接收數據的第八位=1)
}
}
}
else
{
if(IFS0bits.U1RXIF) //如果接受中斷標志位置位
{
IFS0bits.U1RXIF=0; //清除接收中斷標志
while(U1STAbits.URXDA) //接收緩沖器中有數據
rx_data[rx_count]= U1RXREG;//接收數據
rx_count++;
if(rx_count>10) //接收到一個9位數據后
{
rx_count=0; //地址清零,等待接收下一個
rx_data[0]=0;
U1STAbits.ADDEN=1;//地址檢測模式使能
receive_data_check();//接收數據校驗
read_rx_data();//讀數據
}
}
}
}
//********************void data check接收數據和效驗*********************************************
void receive_data_check(void)
{
unsigned int rx_data_add;rx_data_add=rx_data[1]+rx_data[2]+rx_data[3]+rx_data[4]+rx_data[5]+rx_data[6]+rx_data[7]+rx_data[8]+rx_data[9];
rx_data_add&=0x00ff;
if(rx_data_add==rx_data[10])
rx_ERROR=0;
else
rx_ERROR=1;
}
5 結束語
在離心機系統中,軟件系統非常重要,軟件系統的優劣直接決定了整個系統的安全性和可靠性。在本系統中設計了一個電機測速系統,檢測當前的轉速,對速度進行實時監控,讓操作員能夠清楚的知道當前電機的轉速。為了增強系統的可操作性,還增加了微機間的通信系統,讓操作員可以根據需要對離心機速度,時間進行調節與設定。
【參考文獻】
[1]張燕賓.SPWM變頻調速應用技術第3版[M].北京:機械工業出版社,2005:59-84.
[2]馬小亮.高性能變頻調速及其典型控制系統[M].北京:機械工業出版社,2010:44-47.
[3]石秋潔,張燕賓.變頻器應用基礎[M].北京:機械工業出版社,2002.
[4]周志敏,周紀海,紀愛華.變頻調速系統設計與維護[M].北京:中國電力出版社,2007.