typedef struct {
? 第一部分:bresenham算法需要的入口條件宝磨,包括運(yùn)動方向盅安,X,Y,Z各需要運(yùn)動多少步,以及完成這個(gè)BLOCK需要運(yùn)動多少步窿祥。
? uint8_t? direction_bits;? ? ? ? ? ? //
? uint32_t steps_x, steps_y, steps_z; //
? int32_t? step_event_count;? ? ? ? ? //
Bresenham直線算法是用來描繪由兩點(diǎn)所決定的直線的算法壁肋,它會算出一條線段在 n 維光柵上最接近的點(diǎn)籽慢。這個(gè)算法只會用到較為快速的整數(shù)加法猫胁、減法和位元移位,常用于繪制電腦畫面中的直線届惋。是計(jì)算機(jī)圖形學(xué)中最先發(fā)展出來的算法脑豹。
GRBL中衡查,圓弧是用直線段來接近描述的,所以不需要考慮俱饿,直接的畫法通過下面的判斷器拍埠,X先走。
把縱軸的一個(gè)方格的一半作為基準(zhǔn)嬉探,如果在基準(zhǔn)點(diǎn)以上甲馋,則Y軸走一步迄损,如果在下面,則X繼續(xù)走一步痊远。而step_event_count為最終走的總步數(shù)碧聪,為X+Y總步數(shù)。
第二部分:
調(diào)度器用于計(jì)算加速度的內(nèi)容逞姿,也就是說捆等,BRESENHEM用到的是梯形加速度栋烤,我們需要計(jì)算梯形的各個(gè)表征值。
? float nominal_speed;? ? ? ? ? ? ? // 勻速運(yùn)動速度
? float entry_speed;? ? ? ? ? ? ? ? // 從一個(gè)BLOCK進(jìn)入到這個(gè)BLOCK的速度
? float max_entry_speed;? ? ? ? ? ? // 最大的進(jìn)入速度
? float millimeters;? ? ? ? ? ? ? ? // BLOCK運(yùn)動的實(shí)際mm距離
? uint8_t recalculate_flag;? ? ? ? ? // 重新計(jì)算梯度的FLAG
? uint8_t nominal_length_flag;? ? ? ? // 是否進(jìn)入了勻速的FLAG
? 第三部分:
實(shí)際梯形的各個(gè)參數(shù)計(jì)算
? uint32_t initial_rate;? ? ? ? ? ? ? // 梯形運(yùn)動初始值?
? uint32_t final_rate;? ? ? ? ? ? ? ? // 梯形運(yùn)動結(jié)束
? int32_t rate_delta;? ? ? ? ? ? ? ? //計(jì)算加速度
? uint32_t accelerate_until;? ? ? ? ? // 加速度階段運(yùn)動的距離
? uint32_t decelerate_after;? ? ? ? ? // 減速度階段運(yùn)行的距離
? uint32_t nominal_rate;? ? ? ? ? ? ? // 勻速階段運(yùn)行的距離
} block_t;
實(shí)際上,BLOCK的執(zhí)行需要一定的時(shí)間始绍,所以沒有執(zhí)行完成的BLOCK需要列隊(duì)進(jìn)行等待话侄,所以需要用到調(diào)度器苛败。
目前罢屈,3D打印機(jī)做開源的主要用到了Marlin固件缠捌,其實(shí)核心算法就是GRBL,加入了兩軸材料擠出的步進(jìn)電機(jī)軸曼月,另外還用到了一個(gè)開源的溫控PID算法,這個(gè)我們暫時(shí)用不上柔昼,不再考慮哑芹。
在找Marlin固件時(shí)發(fā)現(xiàn)了一個(gè)好的芯片,TC2100這顆IC賣出的價(jià)格在20元以上捕透,而市面上用的1.5A電流的芯片大部分只賣到了4元左右聪姿,這顆IC的核心優(yōu)勢就是細(xì)分?jǐn)?shù),看了一下資料乙嘀,也用到了他們的專利算法:一種新型的PWM算法末购,淘寶上賣出的模塊價(jià)格在37元左右,其實(shí)還有不少的利潤空間虎谢,可惜拿貨估計(jì)有點(diǎn)麻煩盟榴,訂單小了估計(jì)都不好拿貨。
另外需要注意的是婴噩,初始化的參數(shù)是存放在EEPROM中的擎场,GRBL也有一個(gè)EEPROM的函數(shù),但是實(shí)際上我們定義了我們新的EEPROM函數(shù)几莽,用到的是W24512,至于這一塊如何移植迅办,后文再介紹银觅。