l297的应用----该死的相序控制
首先介紹一下l297的一些核心工作模塊
其核心組成部分是脈沖分配器:l297接受單片機(jī)傳來的信號,并將信號轉(zhuǎn)換為步進(jìn)電機(jī)的工作電流。我們權(quán)且將其分為單片機(jī)層和電機(jī)層。
L297設(shè)有兩個pwm斬波器控制繞線系統(tǒng):pwm斬波器工作于電機(jī)層,可以將恒流源調(diào)節(jié)為電機(jī)繞組中的電流。具體參考l297pwm工作電路
變換器是一個重要組成部分,由一些三倍計(jì)算器加某些組合邏輯電路組成,其功能就是把half/full,cw/ccw,clock的變化為斬波器的相序,工作于單片機(jī)層。
關(guān)系可以這樣來理解:half/full,cw/ccw,clock信號->輸出邏輯產(chǎn)生相序->pwm->進(jìn)行輸出。
由此可見因此它只需要時鐘、方向和模式輸入信號便能控制步進(jìn)電動機(jī)。從上位機(jī)接受方向,模式,時鐘(步進(jìn)脈沖)。
下面進(jìn)入編寫程序的部分:
1 首先是方向和模式兩個簡單變量接口的設(shè)置,一共3種模式。半步方式(四相八拍);基本步距,單相激勵(單相四拍);基本步距,兩相激勵。也就是說如果我們設(shè)置成為半步,就會產(chǎn)生一個四相八拍的相序;同理后面兩種情況。就是說我們的四個輸出口a,b,c,d就會有一個1,0的變化,具體參考8格雷碼變換。
//以四相八拍為例,進(jìn)行正轉(zhuǎn)波形的輸出
sbit enable=P1^0;
sbit hf=P1^1;
sbit cw=P1^2;
enable=1;
hf=1;
cw=1;
2 麻煩來了,1中的過程完成了什么呢,如果說1中的過程已經(jīng)將波形都進(jìn)行輸出了,我的clk是不是沒用了呢?可是你有沒有注意到,我們只是讓297輸出了這樣的一組波形,并沒有對輸出的時間,次數(shù)進(jìn)行設(shè)置,當(dāng)我們的使能輸入口enable為1時,是不是就可以工作了呢?答案當(dāng)然是否定的,有誰愿意使用這樣一個不聽人話的驅(qū)動呢。因此盡管我對l297的輸出波形進(jìn)行了設(shè)置,但是我依然沒有允許他進(jìn)行工作。這就是我下面要進(jìn)行的工作
sbit clk=P1^3;
下面我將我的pwm程序移植過來
void Init_Timer0(void){
TMOD |= 0x02; //模式設(shè)置
TH0 = (65536-500)/256; //初值的設(shè)定與單片的分頻器有關(guān)
TL0 = (65536-500)%256;
EA = 1; //啟動定時器
ET0 = 1;
TR0 = 1;
}
void Timer0_isr(void) interrupt 1{
TH0 = (65536-500)/256;
TL0 = (65536-500)%256;
unsigned char time; //設(shè)置一個全局變量
time++;
division = 4;
if(time<division){ //產(chǎn)生高電平
clk = 1;
}else{
clk = 0;
}
if(time==10){
time = 0;
}
}
上述程序說明了什么呢,在clk給高電平的時候297才工作,給低電平的時候便不會工作。這樣便完成了對297步進(jìn)電機(jī)的控制。
這是真的嗎?
到這里,有沒有小伙伴抱著這樣的疑問:我需要給297產(chǎn)生一個pwm嗎?怎么能沒有pwm呢,我沒讀過資料,你不要騙我。哈哈,這說明你沒有好好看書啊。我們驅(qū)動的是步進(jìn)電機(jī),步進(jìn)電機(jī)是如何工作的呢,通過脈沖,一個脈沖走一步。那我給pwm做什么,即便pwm給的高電平處的時間再長,它會走兩部嗎。
好吧,下面我們就從步進(jìn)電機(jī)的完善開始說起:
步進(jìn)電機(jī)其實(shí)和三相電源有些類似,組成是圍繞電磁物理原理展開的。首先我要為大家介紹的是步進(jìn)電機(jī)的轉(zhuǎn)子和定子。
轉(zhuǎn)子是步進(jìn)電機(jī)外面的一環(huán),這個很容易理解,因?yàn)殡姍C(jī)要轉(zhuǎn)動嘛。
然后是它的驅(qū)動原理:仔細(xì)觀察步進(jìn)電機(jī)的圖紙,你會發(fā)現(xiàn)其實(shí)他的轉(zhuǎn)子和定子并不是一一對應(yīng)的,當(dāng)某一個轉(zhuǎn)子和定子對應(yīng)的時候,其它的其實(shí)是錯位的。多么驚訝,事實(shí)上也正是應(yīng)為如此,在297的驅(qū)動里,你得delay太大的話顯得毫無意義,當(dāng)你輸入的只是一個脈沖的話,你能獲得的只是一個相序。也就是說你得步進(jìn)電機(jī)的某一相會牢牢的和定子結(jié)合,天吶,那它還怎么樣轉(zhuǎn)動呢。
因此我們又得到一個結(jié)論:通過變換器產(chǎn)生的相序,將你得clk信號很好的分配出去了。
ok,既然如此,那么我就對我的錯誤程序進(jìn)行訂正:
void Timer0_isr(void) interrupt 1{
TH0 = (65536-500)/256;
TL0 = (65536-500)%256;
unsigned char time; //設(shè)置一個全局變量
time++;
if(time==預(yù)定值){ //產(chǎn)生高電平
clk = ~clk;
time = 0;
}
}
這樣看起來程序就精簡多了,你發(fā)現(xiàn)了什么,對,我們的程序又回到了最初的部分,也是最簡單的部分,這就是297的妙用。
什么,我的time有什么作用,這里我先賣個關(guān)子,小伙伴們自己想一下,我的步進(jìn)電機(jī)的快慢要如何實(shí)現(xiàn)啊?
轉(zhuǎn)載于:https://www.cnblogs.com/winepastor/articles/archieve_blogs.html
總結(jié)
以上是生活随笔為你收集整理的l297的应用----该死的相序控制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中err是什么意思,错误 101
- 下一篇: 灰色预测模型代码