利用Bresenham演算法控制多部步進電機勻速轉動

2021-04-01 19:50:15 字數 973 閱讀 4790

計算機圖形學中繪製直線的bresenham演算法原本是用在繪圖儀上控制x軸方向和y軸方向的兩部電機的,最近遇到乙個十分類似的步進電機控制問題,用bresenham演算法恰好能解決。

問題描述:有左右兩個相同的步進電機,用8051微控制器控制l297 + l298晶元驅動,需要它們同時轉動(同時啟動,同時停止),但轉速不同。例如左側電機正轉180步,同時右側電機反轉97步。這就好比從原點出發畫一條到點(180, -97)的直線。

與電機的介面已抽象為四個函式:

void motorleftshrink();  // 左側電機收緊繩索

void motorleftloose();    // 左側電機放鬆繩索

void motorrightshrink();  // 右側電機收緊繩索

void motorrightloose();   // 右側電機放鬆繩索

另外有兩個輔助函式,分別控制左右電機:

void motorleftstep(int direct)

void motorrightstep(int direct)

現在的任務是寫乙個函式movemotor(),有四個引數,分別為兩個電機轉的步數和方向,讓它控制這兩部電機同時運轉。我用的是整數版本的直線bresenham演算法,取自《計算機圖形學的演算法基礎》一書。

// 引數:absdl、absdr 分別是左右電機轉動的步數

//       sdl、sdr 分別是左右電機轉動的方向

void movemotor3(int absdl, int absdr, int sdl, int sdr)

el += 2*absdl;

while (er > 0)

er += 2*absdr;

wait_ms(15); // 等待

}assert(cntl == absdl);

assert(cntr == absdr);

}程式稍作修改後在keil c51上編譯通過,電機運轉情況良好:)

利用Bresenham演算法畫圓和直線

利用bresenham演算法,從零開始實現在矩陣中畫圓和直線,效果如下 close all clear all clc create image reactangle img ones 100 200 figure name original image imshow img draw line h...

Bresenham畫線演算法

bresenham畫線演算法 bresenham演算法是計算機圖形學領域使用最廣泛的直線掃瞄轉換演算法。仍然假定直線斜率在0 1 之間,該方法類似於中點法,由乙個誤差項符號決定下乙個象素點。演算法原理如下 過各行各列象素中心構造一組虛擬網格線。按直線從起點到終點的順序計算直線與各垂直網格線的交點,然...

Bresenham演算法畫圓

下面先簡要介紹常用的畫圓演算法 bresenham演算法 然後再具體闡述筆者對該演算法的改進。乙個圓,如果畫出了圓上的某一點,那麼可以利用對稱性計算餘下的七段圓弧 plot x,y plot y,x plot y,x plot x,y plot x,y plot y,x plot y,x plot ...