STC單片�(jī)是以51�(nèi)核為主的系列單片�(jī),STC單片�(jī)是宏晶生�(chǎn)的單�(shí)�/�(jī)器周期的單片�(jī),是高�、低功�、超�(qiáng)抗干擾的新一�8051單片�(jī),指令代碼完全兼容傳�(tǒng)8051,但速度�8�12�,內(nèi)部集成MAX810專用�(fù)位電��4�PWM 8路高�10位A、D�(zhuǎn)�,針�(duì)電機(jī)控制,強(qiáng)干擾�(chǎng)��
●高速:1 �(gè)�(shí)�/ �(jī)器周�,增�(qiáng)�8051 �(nèi)核,速度比普�8051 �8�12 �
●寬電壓�5.5�3.8V�2.4�3.8V(STC12LE5410AD 系列�
●低功耗設(shè)�(jì):空閑模�,掉電模式(可由外部中斷喚醒�
●工作頻率:0�35MHz,相�(dāng)于普�8051�0�420MHz
--- �(shí)際可�48MHz,相�(dāng)�8051� 0�576MHz
●時(shí)鐘:外部晶體或內(nèi)部RC 振蕩器可�,在ISP 下載編程用戶程序�(shí)�(shè)�
� 12K/10K/8K/6K/4K/2K 字節(jié)片內(nèi)Flash 程序存儲(chǔ)器,擦寫次數(shù)10 萬次以上
� 512 字節(jié)片內(nèi)RAM �(shù)�(jù)存儲(chǔ)�
●芯片內(nèi)EEPROM 功能
� ISP / IAP,在系統(tǒng)可編�/ 在應(yīng)用可編程,無需編程�/ 仿真�
� 10 位ADC�8 通道,STC12C2052AD 系列�8 位ADC�4 路PWM 還可�(dāng)4 路D/A 使用
� 4 通道捕獲/ 比較單元(PWM/PCA/CCU�,STC12C2052AD 系列�2 通道
--- 也可用來再實(shí)�(xiàn)4 �(gè)定時(shí)器或4 �(gè)外部中斷(支持上升沿/ 下降沿中斷)
� 2 �(gè)硬件16 位定�(shí)�,兼容普�8051 的定�(shí)��4 路PCA 還可再實(shí)�(xiàn)4 �(gè)定時(shí)�
●硬件看門狗(WDT�
●高速SPI 通信端口
●全雙工異步串行�(UART),兼容普�8051 的串�
●先�(jìn)的指令集�(jié)�(gòu),兼容普�8051指令�
4 �8 �(gè)8 位通用工作寄存器(�32 �(gè)通用寄存器)
有硬件乘�/ 除法指令
●通用I/O 口(27/23/15 �(gè)�,復(fù)位后為: �(zhǔn)雙向�/ 弱上拉(普�8051 傳統(tǒng)I/O 口)
可設(shè)置成四種模式:準(zhǔn)雙向�/ 弱上拉,推挽/ �(qiáng)上拉,僅為輸�/ 高阻,開漏每�(gè)I/O 口驅(qū)�(dòng)能力均可�(dá)�20mA,但整�(gè)芯片不得超過55mA
1 、I / O 口經(jīng)過特殊處� 2 、輕松過2KV/4KV 快速脈沖干�(EFT �(cè)試) 3 、寬電壓� 不怕電源抖�(dòng) 4 、寬溫度范圍, - 4 0 ℃~8 5 � 5 、高抗靜電(E S D 保護(hù)� 6 、單片機(jī)�(nèi)部的�(shí)鐘電路經(jīng)過特殊處� 7 、單片機(jī)�(nèi)部的電源供電系統(tǒng)�(jīng)過特殊處� 8 、單片機(jī)�(nèi)部的看門狗電路經(jīng)過特殊處� 9 、單片機(jī)�(nèi)部的�(fù)位電路經(jīng)過特殊處�
STC單片�(jī)具有在應(yīng)用編�,調(diào)試起來比較方�;帶�10位AD;內(nèi)部eeprom;可�1T/�(jī)器周期下工作,速度是傳�(tǒng)51單片�(jī)�12�;下面是我寫的AD和EEPROM的驅(qū)�(dòng)C代碼�
/*----------------------------------------------------------------
*File Name: stc_AD.c -
*Description: A/D �(zhuǎn)換程�
*Project: -
*MCU type: STC12C5410AD -
-
*Company: WY -
*Compiler: KEIL C51 -
*DESINER: 郭準(zhǔn) 06.2.7 -
-----------------------------------------------------------------------*/
#include <global.h> //定義� 系統(tǒng)頭文件和全局變量
/*A/D SFR*/
sfr ADC_LOW2 = 0xBE;
sfr ADC_CONTR = 0xC5;
sfr ADC_DATA = 0xC6;
sfr CLK_DIV = 0xC7; ////////
//定義變量
uchar code display_AD_channel_ID[2] = {0x00,0x01};
uchar data AD_channel_result[2][5]; //各通道A/D�(zhuǎn)換結(jié)�。前是通道�(hào);后是轉(zhuǎn)換的�
//定義引用外部
extern void Delay(uint number);//晶振=11059200,�(jī)器周�=1.085069444us,"�"的機(jī)器周�=1
extern void send_char_com(uchar ch);
extern void send_string_com(uchar *str,uchar strlen);
void Ad_Change(uchar channel);
//------------------------------------------------------
//功能:A/D�(zhuǎn)�
//入口:channel = 通道�(hào) .0�0通道�1�1通道�������
//出口:AD_channel_1_result: 10位的�(shù)�(jù)�16�(jìn)制�
//�(shè)�(jì):郭�(zhǔn),偉�(yè)�2006/2/7
//------------------------------------------------------
void Ad_Change(uchar channel)
{
uint AD_Result_Temp = 0 ;
//---------------------將P1.0--P1.1�(shè)置成適合AD�(zhuǎn)換的模式
/// P1 = 0xff; //將P1口置�,為A/D�(zhuǎn)換作�(zhǔn)�
ADC_CONTR = ADC_CONTR|0x80; //1000,0000打開A/D�(zhuǎn)換電�
P1M0 = 0x03; //0000�0011用于A/D�(zhuǎn)換的P1.x�,先�(shè)為開�
P1M1 = 0x03; //0000�0011P1.0--P1.1先設(shè)為開�。斷開內(nèi)部上拉電�
Delay(20); //20
ADC_CONTR = ADC_CONTR&0xE0; //1110,0000 清ADC_FLAG,ADC_START位和�3�
ADC_CONTR = ADC_CONTR|(display_AD_channel_ID[channel]&0x07); //�(shè)置當(dāng)前通道�(hào)
Delay(1); //延時(shí)使輸入電壓達(dá)到穩(wěn)�
ADC_DATA = 0; //清A/D�(zhuǎn)換結(jié)果寄存器
ADC_LOW2 = 0;
ADC_CONTR = ADC_CONTR|0x08; //0000�1000ADCS � 1,啟�(dòng)�(zhuǎn)�
do { ; }
while((ADC_CONTR & 0x10)==0); //0001,0000等待A/D�(zhuǎn)換結(jié)�
ADC_CONTR = ADC_CONTR&0xE7; //1110,0111清ADC_FLAG�,停止A/D�(zhuǎn)�
AD_Result_Temp = ((AD_Result_Temp|ADC_DATA)<<2)|(ADC_LOW2&0x03);
//保存返回AD�(zhuǎn)換的 �(jié)�
//----------------------------�(zhuǎn)換成可由串口顯示的字�
AD_channel_result[channel][0] = AD_Result_Temp/1000+0x30;
AD_channel_result[channel][1] = (AD_Result_Temp%1000)/100+0x30;
AD_channel_result[channel][2] = (AD_Result_Temp%100)/10+0x30;
AD_channel_result[channel][3] = AD_Result_Temp%10+0x30;
//------------------------串口�(jiān)�
// send_char_com(ADC_DATA); //////�(fā)送轉(zhuǎn)� � 到的 �,這里只是 �8位,值的�(zhuǎn)換需要考慮
// send_char_com(ADC_LOW2); //////�(fā)送轉(zhuǎn)� � 到的 �,這里只是 �2�,值的�(zhuǎn)換需要考慮
send_string_com(AD_channel_result[channel],4);
Delay(1); //
}
/*----------------------------------------------------------------
*File Name: STC_EEPROM.c -
*Description: IAP/ISP 功能 -
*Project: -
*MCU type: STC12C5410AD -
-
*Company: WY -
*Compiler: KEIL C51 -
*DESINER: 郭準(zhǔn) 06.2.7 -
-----------------------------------------------------------------------*/
#include <global.h> //定義� 系統(tǒng)頭文件和全局變量
/*IAP有關(guān)功能寄存�*/
sfr ISP_DATA = 0xE2;
sfr ISP_ADDRH = 0xE3;
sfr ISP_ADDRL = 0xE4;
sfr ISP_CMD = 0xE5;
sfr ISP_TRIG = 0xE6;
sfr ISP_CONTR = 0xE7;
//----------------------------定義常量
#define ENABLE_ISP 0x82 //<20MHz
//#define ENABLE_ISP 0x83 //<12MHz
#define DEBUG_DATA 0x5A
//----------------------------flash 存儲(chǔ)的起始地址
#define DATA_FLASH_START_ADDRESS 0x2800 //stc12c2052ad ////////////???????????
uchar tx_buf[3] = {0,0,0};
extern void Delay(uint number);//晶振=11059200,�(jī)器周�=1.085069444us,"�"的機(jī)器周�=1
extern void send_char_com(uchar ch);
extern void send_string_com(uchar *str,uchar strlen);
uchar Byte_Read(uint address);
void Sector_Erase(uint address);
void Byte_Program(uint address,uchar ch);
/*
void Eeprom_Start(void)
{
P1 = 0xf0; //開始工作
Delay(2); //22us..�13us
// SP = 0xE0; //堆棧指針指向0E0H單元
}
*/
//------------------------------------------------------
//功能:讀一字節(jié);�(diào)用前需打開IAP功能
//入口:uint address=頁地址0�512,為了提高處理速度,用0~256的范�
//出口�
//�(shè)�(jì):郭�(zhǔn),偉�(yè)�2006/2/7
//------------------------------------------------------
uchar Byte_Read(uint address)
{
uchar data ch;
ISP_CONTR = ENABLE_ISP; //打開IAP功能,設(shè)置Flash操作等待�(shí)�
ISP_CMD = 0x01; //選擇讀AP模式
//--------------------------
address = DATA_FLASH_START_ADDRESS+address;
ISP_ADDRH = (uchar)(address>>8); //填頁地址
ISP_ADDRL = (uchar)(address); //填頁地址
EA = 0;
ISP_TRIG = 0x46; //出發(fā)ISP處理�
ISP_TRIG = 0xB9;
nop();
ch = ISP_DATA; //保存�(shù)�(jù)
EA = 1;
//------------------------在處理器完成之前,CUP將暫�
//------------------------�(guān)閉IAP功能,清與ISP有關(guān)的特殊功能寄存器
ISP_CONTR = 0;
ISP_CMD = 0;
ISP_TRIG = 0;
// send_char_com(ch + 0x30);
return ch;
}
//------------------------------------------------------
//功能:擦除扇區(qū)
//入口:uint address=頁地址0�512,為了提高處理速度,用0~256的范�
//出口�
//�(shè)�(jì):郭�(zhǔn),偉�(yè)�2006/2/7
//------------------------------------------------------
void Sector_Erase(uint address)
{
ISP_CONTR = ENABLE_ISP; //打開IAP功能,設(shè)置Flash操作等待�(shí)�
ISP_CMD = 0x03; //選擇頁擦除模�
//--------------------------
address = DATA_FLASH_START_ADDRESS+address;
ISP_ADDRH = (uchar)(address>>8); //填頁地址
ISP_ADDRL = (uchar)(address); //填頁地址
EA = 0;
ISP_TRIG = 0x46; //出發(fā)ISP處理�
ISP_TRIG = 0xB9;
nop();
EA = 1;
//------------------------�(guān)閉IAP功能,清與ISP有關(guān)的特殊功能寄存器
ISP_CONTR = 0;
ISP_CMD = 0;
ISP_TRIG = 0;
}
//------------------------------------------------------
//功能:字節(jié)編程,寫
//入口:uint address=頁地址0�512,為了提高處理速度�
// �0~256的范�;uchar ch=要寫的數(shù)�(jù)
//出口�
//�(shè)�(jì):郭�(zhǔn),偉�(yè)�2006/2/7
//------------------------------------------------------
void Byte_Program(uint address,uchar ch)
{
// Sector_Erase(address);
ISP_CONTR = ENABLE_ISP; //打開IAP功能,設(shè)置Flash操作等待�(shí)�
ISP_CMD = 0x02; //選擇字節(jié)編程模式
//--------------------------
address = DATA_FLASH_START_ADDRESS+address;
ISP_ADDRH = (uchar)(address>>8); //填頁地址
ISP_ADDRL = (uchar)(address); //填頁地址
ISP_DATA = ch;
EA = 0;
ISP_TRIG = 0x46; //出發(fā)ISP處理�
ISP_TRIG = 0xB9;
nop();
EA = 1;
//------------------------�(guān)閉IAP功能,清與ISP有關(guān)的特殊功能寄存器
ISP_CONTR = 0;
ISP_CMD = 0;
ISP_TRIG = 0;
}
//------------------------------------------------------
//功能:字節(jié)編程,寫字符�
//入口:uint address=頁地址0�512,為了提高處理速度�
// �0~256的范�;uchar ch=要寫的數(shù)�(jù)
// len=字符串的�(zhǎng)�
//出口�
//�(shè)�(jì):郭�(zhǔn),偉�(yè)�2006/2/7
//------------------------------------------------------
void Morebyte_Program(uint address,uchar *ch,uchar len)
{
uchar k = 0;
Sector_Erase(address);
do
{
Byte_Program(address,*(ch + k));
address++;
k++;
}
while(k < len);
}
//------------------------------------------------------
//功能:讀多字節(jié);�(diào)用前需打開IAP功能
//入口:uint address=頁地址0�512,為了提高處理速度,用0~256的范�
//出口�
//�(shè)�(jì):郭�(zhǔn),偉�(yè)�2006/2/7
//------------------------------------------------------
void Moreyte_Read(uint address)
{
uchar k = 0;
do
{
tx_buf[k] = Byte_Read(address);
address++;
k++;
}
while(k < 3);
}
步�(jìn)電機(jī)是工�(yè)控制中應(yīng)用十分廣泛的一種電�(dòng)�(jī),它能將�(shù)字信�(hào)直接�(zhuǎn)換成角位移或線位移,�(qū)�(dòng)速度和指令脈沖能�(yán)格同�,具有較高的定位精度,控制系�(tǒng)成本低廉,在�(jīng)�(jì)型數(shù)控機(jī)床等�(lǐng)域應(yīng)用廣泛。這里針對(duì)電磁干擾較強(qiáng)以及要求低成本應(yīng)用的�(chǎng)�,采用超�(qiáng)抗干擾、小巧低功耗的工業(yè)�(jí)STC12C系列單片�(jī),充分利用單片機(jī)�(nèi)部的硬件資源,設(shè)�(jì)�(shí)用的步�(jìn)電機(jī)控制和驅(qū)�(dòng)系統(tǒng)�
1 控制系統(tǒng)總體方案�(shè)�(jì)
系統(tǒng)功能原理示意圖如�1所示�
在該系統(tǒng)中由單片�(jī)直接輸出電機(jī)的各相控制脈沖序�,光耦�(jìn)行必要的光電隔離,采用分立元件構(gòu)成功率.MOSFET管驅(qū)�(dòng)電路,帶�(dòng)電機(jī)�(zhuǎn)�(dòng)。鍵盤接口與 LED顯示功能由具有SPI串行接口功能的ZLG7289�(shí)�(xiàn)。既可使用按鍵輸入的方式精確�(shè)置電�(jī)的工作方式與�(zhuǎn)�,也可以通過�(diào)速旋鈕實(shí)�(xiàn)電機(jī)�(zhuǎn)速的連續(xù)�(diào)節(jié),還能通過上位�(jī)�(shí)�(xiàn)�(duì)電機(jī)工作方式的調(diào)整與控制�
2 硬件電路�(shè)�(jì)
2�1 控制電路�(shè)�(jì)
控制芯片采用STC12C4052AD,它�1�(gè)�(shí)鐘/�(jī)器周期的單片�(jī),速度比普通的8051單片�(jī)�8�12倍,�20�(gè)引腳且為小巧封裝。該單片�(jī)具有超強(qiáng)抗干�,抗靜電的特�(diǎn),能輕松通過4 kV快速脈沖干�,其功耗超�,正常工作模式下的典型功耗為2�7�7 mA。芯片自帶硬件看門�,具有高速SPI通信端口�8通道8位A/D�(zhuǎn)��2路PWM輸出�4 KB容量的FLASH存儲(chǔ)��256 B容量的SRAM�4�(gè)定時(shí)��1�(gè)全雙工串行通信�。由于單片機(jī)�(nèi)部的資源豐富,性價(jià)比高,能夠滿足該�(shè)�(jì)的要�,而且減少了硬件電路的�(shè)�(jì),提高了工作效率。單片機(jī)的外部引腳定義,及其在該�(shè)�(jì)中的資源分布如圖2所��
P1�4(ADC4)口外�4�7 kΩ的可�(diào)電位�,利用單片機(jī)�(nèi)部的模/�(shù)�(zhuǎn)換功能轉(zhuǎn)換成�(shù)字量,�(jìn)而控制輸出脈沖頻�,完成步�(jìn)電機(jī)速度的“連續(xù)”調(diào)節(jié)。過流檢�(cè)的結(jié)果直接引入到外部中斷0,實(shí)�(xiàn)�(duì)電流的快速控��
2�2 �(qū)�(dòng)電路�(shè)�(jì)
功率MOSFET管的部分�(qū)�(dòng)電路如圖3所�。該電路的設(shè)�(jì)可改�(jìn)功率MOSFET管的快速開通時(shí)間,提高了驅(qū)�(dòng)電流的前后沿陡度,能夠改善高頻響�(yīng)。功率MOSFET管柵源間的阻抗很�,工作于開關(guān)狀�(tài)下漏源間電壓的突變會(huì)通過極間電容耦合到柵�,產(chǎn)生相�(dāng)幅度的VGS脈沖電壓。正方向的VGS脈沖電壓可能�(huì)�(dǎo)致器件的誤導(dǎo)通。為�,需要適�(dāng)降低柵極�(qū)�(dòng)電路的阻�,在柵源之間并接阻尼電阻或接一�(gè)�(wěn)壓值小�20 V,而又接近20 V的齊納二極管,以防止柵源開路工作�
為了抑制功率管內(nèi)的快恢復(fù),二極管出現(xiàn)反向恢復(fù)效應(yīng),在電路中接�4只快恢復(fù)二極管。其�,反并聯(lián)快恢�(fù)二極管的作用是為電機(jī)相繞組提供續(xù)流通路,其�2 只是為了使功率MOSFET管內(nèi)部的快恢�(fù)二極管不流過反向電流,以保證功率MOSFET管在�(dòng)�(tài)工作�(shí)能起到正常的開關(guān)的作��
2�3 顯示與按鍵處理電�
在單片機(jī)�(yīng)用系�(tǒng)中,典型的鍵盤顯示接口電路由基于并行�(kuò)展技�(shù)�8155�8279�(gòu)成控制電�?,F(xiàn)代單片機(jī)�(yīng)用系�(tǒng)廣泛采用串行�(kuò)展技�(shù)。相�(duì)于并行方�,串行擴(kuò)展接線靈活,占用單片�(jī)資源��
ZLG7289A是具有SPI串行接口功能的可同時(shí)�(qū)�(dòng)8位數(shù)碼管�64只獨(dú)立LED的智能顯示驅(qū)�(dòng)芯片,單片即可完成顯示、鍵盤接口的全部功能。采用串行方式與微處理器通信,數(shù)�(jù)從DIO引腳送入芯片,并由CLK端同�。當(dāng)選信�(hào)�?yōu)榈碗娖胶?,DIO引腳上的�(shù)�(jù)在CLK引腳的上升沿被寫� ZLG7289A的緩沖寄存器。圖4是ZLG7289的典型應(yīng)�。ZLG7289A連接共陰式數(shù)碼管,應(yīng)用中不需要的�(shù)碼管與鍵盤可以不連接,省去數(shù)碼管�?qū)�?shù)碼管�(shè)置消隱屬�,這均不會(huì)影響鍵盤的使用。整�(gè)電路無需添加鎖存器和�(qū)�(dòng)�,耗電�,軟件設(shè)�(jì)中無需編寫顯示譯碼程序,省去了靜態(tài)顯示�(kuò)展芯�,大大節(jié)省了CPU的時(shí)�。該電路�(shè)�(jì)中僅采用4×4鍵盤�4位數(shù)碼管,已完全滿足�(shè)�(jì)需��
3 軟件�(shè)�(jì)
軟件部分采用模塊化結(jié)�(gòu)�(shè)�(jì)。對(duì)步�(jìn)電機(jī)�(zhuǎn)速的控制是通過定時(shí)器工作在中斷方式�(shí)�(xiàn)�。定�(shí)器定�(shí)中斷�(chǎn)生周期性脈沖序�,不是采用軟件延�(shí)的方�,這樣不占用CPU的時(shí)�。CPU在非中斷�(shí)間內(nèi)可以處理其他事件,只有在中斷�(fā)生時(shí)才驅(qū)�(dòng)步�(jìn)電機(jī)�(zhuǎn)�(dòng)一�。根�(jù)步�(jìn)電機(jī)�(lì)磁狀�(tài)�(zhuǎn)換,采用查表法求出所需的輸出狀�(tài),并以二�(jìn)制碼的形式依次存入單片機(jī)�(nèi)部的存儲(chǔ)器中;然后按照正向或反向順序依次取出地址的狀�(tài)字,送給STC12C4052AD,輸出各�(lì)磁狀�(tài),從而實(shí)�(xiàn)�(huán)形分配器的功��
程序總體框架包括:主程序、過流檢�(cè)中斷服務(wù)子程�、定�(shí)器中斷服�(wù)子程�、以及其他子程序(包括正轉(zhuǎn)、反�(zhuǎn)子程�、鍵盤顯示控制子程序、A/D�(zhuǎn)換子程序�),由于篇幅限�,在此不一一敘述�
4 系統(tǒng)�(cè)�
該系�(tǒng)采用超強(qiáng)抗干�,小巧低功耗的工業(yè)�(jí)STC12C4052AD單片�(jī)為控制核�,工作可靠性高,抗于擾能力�(qiáng)。系�(tǒng)�(cè)試在專門的檢�(cè)�(shí)�(yàn)室內(nèi)�(jìn)�。利用群脈沖�(fā)生器(EFT-4001)、周波電壓跌落發(fā)生器(VDG-1105)、靜電放電發(fā)生器(ESD-20)以及雷擊浪涌�(fā)生器(SG-5006) 等專用儀器對(duì)系統(tǒng)的電壓變化抗擾度、快速瞬變脈沖群抗擾度、抗靜電和雷擊浪涌等參數(shù)�(jìn)行檢�(cè)。經(jīng)過實(shí)�(yàn),系�(tǒng)功能正常,所有參�(shù)均已�(dá)�(biāo)�
5 �(jié) �
電子技�(shù)�(fā)展日新月�,新型單片機(jī)層出不窮。在電機(jī)控制系統(tǒng)開發(fā)過程�,如果恰�(dāng)選取單片�(jī)以及各電路模塊的型號(hào),能夠簡(jiǎn)化設(shè)�(jì)過程,起到事半功倍的效果。該系統(tǒng)采用STC12C4052AD單片�(jī),其工作方式、轉(zhuǎn)�(dòng)速率及轉(zhuǎn)�?cái)?shù)可以通過鍵盤輸入,也可通過普通旋鈕或上位�(jī)�(diào)節(jié)。鍵盤顯示模塊采� ZLG7289�(shí)�(xiàn)。本系統(tǒng)具有通用�,適�(dāng)改變輸出口各位控制端,便可控制不同相�(shù)的步�(jìn)電機(jī)�