小規(guī)模
位置控制 先進(jìn)的位置控制系統(tǒng)已在工業(yè)控制應(yīng)用中使用了數(shù)十年。通常這些系統(tǒng)既復(fù)雜又昂貴,而且是必要的。在當(dāng)今的電子市場中,存在允許非常小且便宜的位置控制系統(tǒng)的選項(xiàng)?,F(xiàn)在可以以經(jīng)濟(jì)實(shí)惠的方式提供小規(guī)模的先進(jìn)控制系統(tǒng),甚至可以圍繞固定的電子硬件定制多種設(shè)計(jì)。這為增強(qiáng)制造控制創(chuàng)造了許多選擇,從而減少了材料損失并節(jié)省了時(shí)間和金錢。本文描述了一個(gè)簡單的設(shè)計(jì),后來基于該設(shè)計(jì)創(chuàng)建了一個(gè)強(qiáng)大的小型化運(yùn)動(dòng)控制系統(tǒng)。 使用Microchip 的
小型化伺服控制器
dsPIC 系列 16 位微控制器允許以非常低的硬件成本開發(fā)復(fù)雜的控制方案。對(duì)于該應(yīng)用,選擇了dsPIC33FJ64MC802-I/MM-ND器件作為合適的控制器。選擇該部分的重要原因如下:
64K x 8 閃存,16K x 8 RAM
Microchip 的 MPLAB C 免費(fèi)評(píng)估版
通過 MPLAB ICD3 實(shí)現(xiàn)的低成本調(diào)試器/編程器
高達(dá) 40MIPS 的運(yùn)行速度
除了這些因素之外,dsPIC33FJ64MC802-I/MM-ND 還具有大量有用的外設(shè),非常適合許多控制應(yīng)用。這些外設(shè)包括定時(shí)器、正交編碼器硬件、10 位或 12 位模數(shù)轉(zhuǎn)換器、UART、SPI、I2C、專為電機(jī)控制而設(shè)計(jì)的 PWM 模塊、看門狗定時(shí)器、帶 PLL 的內(nèi)部振蕩器和許多中斷驅(qū)動(dòng)特性。許多外圍設(shè)備可以映射到各種 IC 焊盤,從而簡化印刷電路板的布線。在此伺服設(shè)計(jì)中,選擇了
穩(wěn)健的飛思卡爾 MC33926PNB-ND來提供微控制器和直流電機(jī)之間的接口。然而,幾乎任何H 橋 IC可以插入到這個(gè)設(shè)計(jì)中,一旦控制系統(tǒng)完善,就可以輕松調(diào)整電機(jī)尺寸。選擇 MC33926PNB 的原因如下:
簡化的設(shè)計(jì)示例
之前我們討論了選擇用于創(chuàng)建小型伺服系統(tǒng)的主要部件。為了提供更多細(xì)節(jié),我們將基于這些部分設(shè)計(jì)一個(gè)閉環(huán)比例控制器(見圖 1)。使用 dsPIC33 AD 和 PWM 模塊,我們可以快速生成 12 位模擬控制和模擬反饋系統(tǒng)。通過使用內(nèi)部 RC 振蕩器和 PLL 以 36.85 MIPS 的速度運(yùn)行,以及 250 μS 的控制環(huán)路,可以節(jié)省額外的資金。
dsPIC33 固件還將監(jiān)控來自 H 橋 IC 的故障和電流反饋。如果存在故障條件,微控制器將嘗試在每個(gè)控制回路中重置 H 橋。如果電機(jī)負(fù)載電流超過大約 2 A,dsPIC33 固件將關(guān)閉 PWM 信號(hào)。
以 20 KHz 運(yùn)行 dsPIC33 PWM 模塊允許 PWM 值介于 0(0% 占空比)和 3685(100% 占空比)之間。這接近 12 位的分辨率,與我們的 12 位模擬測量非常匹配。PWM 信號(hào)是通過將誤差信號(hào)(模擬控制測量 - 模擬反饋測量)乘以比例項(xiàng)常數(shù)生成的。選擇比例項(xiàng)值是通過反復(fù)試驗(yàn)完成的,多種值提供了平滑控制。
PWM 輸出 = 比例項(xiàng) *(模擬控制 - 模擬反饋)
PWM 輸出必須限制在不超過 +3685 且不低于 -3685 以使其保持在 PWM 模塊的 100% 占空比值的邊界內(nèi)(20 KHz 時(shí)) )。這也在固件中處理。
除了 MC33926PNB-ND 內(nèi)置的保護(hù)功能外,如果負(fù)載電流超過約 2 A,則負(fù)載電流會(huì)受到監(jiān)控以關(guān)閉電機(jī)。MC33926PNB-ND 提供電機(jī)負(fù)載電流的 0.24% 的比例反饋電流。一個(gè) 270 歐姆的電阻器將反饋電流轉(zhuǎn)換為由 dsPIC33 監(jiān)控的電壓。在 2 A 時(shí),該電壓為 1.296 V,或 1608 位(使用 dsPIC33 上的 12 位 AD)(3.3V/4096 = 0.805mV/位)。反饋電流是粗略測量,在 500 mA 以上時(shí)精度僅為 ±20%。但是,它對(duì)于保護(hù)控制系統(tǒng)仍然有用。
圖 1:閉環(huán)比例控制器示例。
在測試此設(shè)計(jì)時(shí),我們使用了具有 65.5:1 齒輪比的 Pittman GM9236S025-R1 12 V 減速電機(jī)。齒輪比阻止了快速響應(yīng),如下面的斜坡波形測試信號(hào)(圖 3)所示,但在其他方面創(chuàng)建了強(qiáng)大的伺服系統(tǒng)。反饋是通過直接連接到電機(jī)軸的電位計(jì)傳遞的。12 V 電機(jī)電壓由 5 V 線性穩(wěn)壓器(示意圖中未顯示)降壓,進(jìn)而為板載 3.3 V 線性穩(wěn)壓器供電。
圖 2:伺服對(duì)正弦控制信號(hào)的響應(yīng)。
圖 3:伺服對(duì)斜坡控制信號(hào)的響應(yīng)。
物理原型
此設(shè)計(jì)的原型被放置在一個(gè) 24 引腳、600 mil 寬的 DIP 封裝中。2 層板的布線包括一個(gè)串行通信端口、限位開關(guān)輸入連接、一個(gè)正交編碼器端口,以及讀取持續(xù)時(shí)間為 5 μs 至 20 ms 的脈沖的能力。
電路板上還布置了連接,以允許使用各種 Microchip 工具進(jìn)行調(diào)試。該設(shè)計(jì)是使用 MPLAB ICD3 調(diào)試器 / 編程器完成的。
固件
本設(shè)計(jì)的固件是使用 Microchip 的 C30 C 編譯器(版本 3.25)的免費(fèi)評(píng)估版編寫的。MPLAB IDE 版本 8.66.00.00 用作開發(fā)環(huán)境。調(diào)試和編程是使用在固件版本 1.26.52 上運(yùn)行的 MPLAB ICD3 完成的。
此處列出的固件執(zhí)行具有模擬控制輸入和模擬反饋的簡單運(yùn)動(dòng)控制系統(tǒng)。比例控制以及過溫、過流和欠壓保護(hù)均在固件或硬件中實(shí)現(xiàn)。下面提供的固件可用作使用相同硬件的更復(fù)雜系統(tǒng)的起點(diǎn)。
事實(shí)上,該硬件用于實(shí)現(xiàn)完整的 PID 控制算法,具有串行命令接口和多種控制和反饋選項(xiàng)。該設(shè)計(jì)目前由 Solutions Cubed, LLC 制造,作為 Synaptron 高準(zhǔn)控制器。
//------------------------------------------------ ---------
//
//------------------------- ------------------------------
// 應(yīng)包含以下文件在 MPLAB 項(xiàng)目中:
//
// synaptron_opensource_01.c -- 主源代碼文件
// traps.c -- dsPIC33F 陷阱的顯式定義
// p33FJ64MC802.h -- dsPIC 的頭文件
// p33FJ64MC802.gld -- 鏈接描述文件文件
//------------------------------------------------ --------------------
// 修訂歷史
// 1/10/12 -- synaptron_opensource_01.c -- 初始實(shí)現(xiàn)
//-------- -------------------------------------------------- ----------
#define FCY 36850000ULL
#include “p33FJ64MC802.h” // 寄存器位定義在這里
/******************** *************************************************
配置位和定義語句
************************************************ ***********************/
/* 振蕩器設(shè)置 */
_FOSCSEL(FNOSC_FRCPLL & IESO_OFF);
_FOSC(F??CKSM_CSDCMD & OSCIOFNC_ON & POSCMD_NONE & IOL1WAY_OFF);
/* 上電復(fù)位 */
_FPOR( PWMPIN_ON & HPOL_OFF & LPOL_OFF & ALTI2C_OFF & FPWRT_PWR32)
/* 看門狗定時(shí)器 */
_FWDT(FWDTEN_ON & WINDIS_OFF & WDTPRE_PR32 & WDTPOST_PS64);
/* 代碼保護(hù) */
_FBS(BWRP_WRPROTECT_OFF);
_FSS(SWRP_WRPROTECT_OFF);
_FGS(GWRP_OFF);
/* 程序/調(diào)試 */
_FICD(ICS_PGD1 & JTAGEN_OFF);
/* 應(yīng)用程序定義語句、變量、常量 */
#define FAULT PORTBbits.RB12
#define ENABLE PORTBbits.RB13
#define PWMSTATE_STOPPED 0x0000
#define PWMSTATE_FORWARD 0x0201
#define PWMSTATE_REVERSE 0x0102
unsigned int AnalogControl = 0;
無符號(hào)整數(shù)模擬反饋 = 0;
無符號(hào)整數(shù)模擬電流 = 0;
無符號(hào)整數(shù) ProportionalTerm = 0;
整數(shù) PWM 輸出 = 0;
/************************************************* ************************
初始化例程
**************************** *****************************************/
/******* ****************************************************** ************
函數(shù):InitTimer5
說明:初始化 Timer5 為 250uS 定時(shí)器,無中斷
************************* ************************************************/
void InitTimer5( void )
{
T5CON = 0; // 確保定時(shí)器 5 處于復(fù)位狀態(tài)
IFS1bits.T5IF = 0; // 復(fù)位定時(shí)器 5 中斷標(biāo)志
?? IPC7bits.T5IP = 5; // 設(shè)置 Timer5 中斷優(yōu)先級(jí)為 5
PR5 = 9212; // 設(shè)置 Timer5 周期寄存器
T5CONbits.TCKPS1 = 0; // 選擇 Timer5 輸入時(shí)鐘預(yù)分頻比 1:1
T5CONbits.TCS = 0; // 選擇外部定時(shí)器時(shí)鐘
T5CONbits.TON = 1; // 啟用定時(shí)器 5 并開始計(jì)數(shù)
IEC1bits.T5IE = 0; // 禁用定時(shí)器 5 中斷
}
/****************************************** ******************************
函數(shù):InitPLL()
說明:初始化振蕩器和PLL設(shè)置并等待鎖定。處理器將以 36.85MIPS 運(yùn)行。
****************************************************** *******************/
void InitPLL()
{
// 7.37MHz / 2 * 40 / 2 FCY = FOSC/2 = 36.85MIPS
CLKDIVbits.PLLPRE = 0; //N1 = 2 VCO 分頻器 = /2
PLLFBDbits.PLLDIV = 38;//40x 乘數(shù)
CLKDIVbits.PLLPOST = 0; //N2 = 2 PLL 輸入分頻器 = 2
while(OSCCONbits.LOCK != 1);
}
/****************************************************** ************************ 函數(shù):InitIO()
說明:初始化引腳方向(輸入/輸出)和電壓。
****************************************************** *******************/
void InitIO()
{
TRISAbits.TRISA0 = 1; // 控制電壓輸入
TRISAbits.TRISA1 = 1; // 反饋電壓輸入
LATA = 0xFFFF;
TRISBbits.TRISB2 = 1;// 未使用
的 TRISBbits.TRISB3 = 1; // 當(dāng)前電壓輸入
TRISBbits.TRISB4 = 1; // 未使用
的 TRISBbits.TRISB5 = 1; // 沒用過
TRISBbits.TRISB6 = 1;// 未使用
的 TRISBbits.TRISB7 = 1; // 未使用
的 TRISBbits.TRISB8 = 1; // 未使用
的 TRISBbits.TRISB9 = 1; // 未使用
的 TRISBbits.TRISB10 = 1; // 未使用
的 TRISBbits.TRISB11 = 1; // 未使用
的 TRISBbits.TRISB12 = 1; // 故障輸入
TRISBbits.TRISB13 = 0; // 使能輸出
TRISBbits.TRISB14 = 0; // PWM1L 輸出
TRISBbits.TRISB15 = 0; // PWM1H 輸出
LATB = 0x1FFF;
}
/****************************************************** ************************
函數(shù):InitADC()
說明:初始化 ADC 模塊以進(jìn)行 12 位操作
************* ****************************************************** ******/
無效初始化ADC(無效)
{
AD1CON1 = 0;// 清除控制寄存器
AD1CON2 = 0;
AD1CON3 = 0;
AD1CHS0 = 0x0000;// 通道選擇 AN0
AD1PCFGL = 0xFFFF; // 模擬輸入配置為數(shù)字
AD1PCFGLbits.PCFG0 = 0; // AN0 模擬
AD1PCFGLbits.PCFG1 = 0; // AN1 模擬
AD1PCFGLbits.PCFG5 = 0; // AN5 模擬
AD1CON1bits.AD12B = 1; // 12 位,1 通道操作
AD1CON1bits.FORM = 0; // 整數(shù)結(jié)果
AD1CON1bits.SSRC = 0; //清除樣本位開始conv。
AD1CON1bits.ASAM = 0;// 設(shè)置采樣位時(shí)采樣
AD1CON2bits.CSCNA = 0; // 禁用通道掃描
AD1CON2bits.VCFG = 0; // AVDD 和 AVSS 是參考
AD1CON3bits.ADRC = 0; // 時(shí)鐘來自系統(tǒng)時(shí)鐘
AD1CON3bits.ADCS = 0x2f;// ADC 轉(zhuǎn)換時(shí)鐘
AD1CON1bits.ADON = 1; // 開啟 ADC 模塊
}
/****************************************** ******************************
函數(shù):void InitMCPWM(void)
說明:初始化電機(jī)控制脈寬調(diào)制模塊為20KHz。
****************************************************** ******************/
void InitMCPWM(void)
{
P1TCON = 0x8000; // PWM 為自由運(yùn)行模式,1:1 TCY
PWM1CON1 = 0x0111; // 使能 PWM1L 和 PWM1H
// 將它們配置為獨(dú)立模式
PWM1CON2 = 0x0000; // 實(shí)現(xiàn) 20 kHz
P1DTCON1 = 0x0028; // 2 us 死區(qū)時(shí)間
P1DTCON2 = 0x0000;
P1FLTACON = 0x0000;// 初始化故障控制
PTPER = FCY/20000 - 1;// 計(jì)算周期
P1OVDCON = PWMSTATE_STOPPED; // 禁用 PWM1 輸出。
P1DC1 = 0; // 將占空比設(shè)置為 0
}
/********************************************** ******************************
程序例程
******************** *************************************************/
/************************************************* ********************
函數(shù):ReadAnalog()
說明:收集模擬值并對(duì)誤差信號(hào)進(jìn)行比例乘法。如果電流超過 2A +/- 20%,還會(huì)測量電機(jī)電流并關(guān)閉電機(jī)驅(qū)動(dòng)器。
****************************************************** *******************/
void ReadAnalog(void)
{
無符號(hào)整數(shù)采樣時(shí)間 = 0;
AD1CHS0 = 0x0000;// 通道選擇 AN0 (引腳 RA0)
AD1CON1bits.SAMP = 1;
while (SampleTime 《 100) // 為采樣時(shí)間提供 》5uS
SampleTime++;
AD1CON1bits.SAMP = 0;
而(!AD1CON1bits.DONE);
模擬控制 = ADC1BUF0;// 將轉(zhuǎn)換存儲(chǔ)在寄存器
AD1CHS0 = 0x0001; // 通道選擇 AN1 (引腳 RA1)
AD1CON1bits.SAMP = 1;
采樣時(shí)間 = 0;// 提供 》5uS 的采樣時(shí)間 while (SampleTime 《 100)
SampleTime++;
AD1CON1bits.SAMP = 0;
而(!AD1CON1bits.DONE);
模擬反饋 = ADC1BUF0;// 將轉(zhuǎn)換存儲(chǔ)在寄存器
AD1CHS0 = 0x0005; // 通道選擇 AN5 (引腳 RB3)
AD1CON1bits.SAMP = 1;
采樣時(shí)間 = 0;// 提供 》5uS 的采樣時(shí)間 while (SampleTime 《 100)
SampleTime++;
AD1CON1bits.SAMP = 0;
而(!AD1CON1bits.DONE);
模擬電流 = ADC1BUF0;// 將轉(zhuǎn)換存儲(chǔ)在寄存器
ProportionalTerm = 10; // 設(shè)置比例值
PWMOutput=(int(ProportionalTerm*(AnalogControl-AnalogFeedback));
// 確保 PWM 信號(hào)不超過 100%
if (PWMOutput 》 3685)
PWMOutput = 3685;
if (PWMOutput 《 -3685)
PWMOutput = -3685 ;
if (AnalogCurrent 》 1600) // 1600 大約等于 2A.
PWMOutput = 0;
}
/**************************** *****************************************
函數(shù):MotorControl()
說明:該子程序檢查故障條件,如果存在故障,則禁用 H 橋。如果沒有故障情況,則 H 橋模塊配置為適當(dāng)?shù)姆较?,并?PWMOutput 中的 PWM 信號(hào)應(yīng)用于電機(jī)。請(qǐng)注意,PWM 值被反轉(zhuǎn)以應(yīng)用適當(dāng)?shù)妮敵鲂盘?hào),如果發(fā)生故障,H 橋?qū)⒃诳刂骗h(huán)路計(jì)時(shí)器結(jié)束后重新啟用。
****************************************************** *******************/
void MotorControl(void)
{
if (FAULT == 0) // 故障條件下的故障輸入 0V
{
PWMOutput = 0; // 如果發(fā)生故障,禁用電機(jī)輸出。
啟用 = 0; // 禁用 H 橋
}
if (PWMOutput》0)
P1OVDCON = PWMSTATE_FORWARD;// 設(shè)置為正向
if (PWMOutput《0)
{
P1OVDCON = PWMSTATE_REVERSE; // 設(shè)置為反向
PWMOutput = -PWMOutput; // 反轉(zhuǎn) PWM 信號(hào)
}
if (PWMOutput == 0)
P1OVDCON = PWMSTATE_STOPPED; // 停止 H 橋
P1DC1 = 3685 - PWMOutput; // 設(shè)置 PWM 值
}
/************************************************ ******************************
主程序
********************** ***********************************************/
int main (void)
{
InitPLL(); // 初始化 PLL,等待 lock
InitIO(); // 初始化 i/os
InitADC(); // 初始化 ADC
InitTimer5(); // 初始化一個(gè)定時(shí)器
初始化MCPWM(); // 初始化 PWM
while (1)
{
asm(“clrwdt”); // 清除看門狗定時(shí)器
if (IFS1bits.T5IF == 1) // 檢查控制循環(huán)定時(shí)器
{
IFS1bits.T5IF = 0; // 清除下一個(gè)循環(huán)的標(biāo)志
ENABLE = 1; // 啟用 H 橋
ReadAnalog(); // 獲取模擬讀數(shù)
MotorControl(); // 設(shè)置 PWM 驅(qū)動(dòng)信號(hào)
}
}
}
評(píng)論
查看更多