




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第2章繪圖儀項(xiàng)目設(shè)計(jì)
2.2.1主程序模塊相關(guān)代碼
//library.h
#ifndeflibrary_h
#definelibrary_h
//標(biāo)準(zhǔn)庫(kù)
#include<avr/io.h>
#include<avr/pgmspace.h>
#include<avr/interrupt.h>
#include<avr/wdt.h>
#include<util/delay.h>
#include<math.h>
#include<inttypes.h>
#include<string.h>
#include<stdlib.h>
#include<stdint.h>
#include<stdbool.h>
//模塊庫(kù)
#include"config.h"http://設(shè)置相關(guān)
#includenshared.h"〃共享的定義、變量、函數(shù)
#include"settings.h"http://參數(shù)相關(guān)設(shè)置
#includendefaults.h"〃默認(rèn)設(shè)置
#includencpu_map.h"http://CPU映射
#includeneeprom.hH//EEPROM內(nèi)容存儲(chǔ)
#include“geode.h"http://GCode解讀代碼
#includenmotion_control?h”//運(yùn)動(dòng)控制
#include"planner.h"http://指令隊(duì)列緩存
#include"print.h"http://格式化輸出字符串
#include"probe.hH//系統(tǒng)狀態(tài)探測(cè)
#include"protocol.h"http://控制執(zhí)行協(xié)議
#include"serial.hn//發(fā)送/接收串口通信
#includeHspindle_control.h"http://主軸控制模塊
#include"stepper.h"http://步進(jìn)電機(jī)驅(qū)動(dòng)
#endif
//main.c
#include"library.h"
//系統(tǒng)全局變量結(jié)構(gòu)
system_tsys;
intmain(void){
//初始化系統(tǒng)
serial_init();〃設(shè)置波特率和中斷
settings_init();//從內(nèi)存中加載設(shè)置
stepper_init();〃配置步進(jìn)電機(jī)和中斷計(jì)時(shí)器
system_init();//配置引腳
memset(&sys,0,sizeof(system_t));
sys.abort=true;
sei();//中斷
//加電后初始化循環(huán)
for(;;){
serial_reset_read_buffer();
gc_init();
spindle_init();
probe_init();
plan_reset();
st_reset();
//同步系統(tǒng)位置
plan_sync_position();
gc_sync_position();
//重置系統(tǒng)變量
sys.abort=false;
sys_rt_exec_state=0;
sys_rt_exec_alarm=0;
sys.suspend=false;
//主循環(huán)
protocol_main_loop();
}
return0;
#ifndefcpu_map_h
#definecpu_map_h
#definePLATFORM”Atmega328p”
#defineSERIAL_RXUSART_RX_vect
#defineSERIAL_UDREUSART_UDRE_vect
#defineSTEP_DDRDDRD
#defineSTEP_PORTPORTD
#defineX_STEP_BIT2
#defineY_STEP_BIT3
#defineSTEP_MASK((1?X_STEP_BIT)|(1?Y_STEP_BIT))
#defineDIRECTION_DDRDDRD
#defineDIRECTION_PORTPORTD
#defineX_DIRECTION_BIT5
#defineY_DIRECTION_BIT6
#defineDIRECTION_MASK((1?X_DIRECTION_BIT)|(1?Y_DIRECTION_BIT))
#defineSTEPPERS_DISABLE_DDRDDRB
#defineSTEPPERS_DISABLE_PORTPORTB
#defineSTEPPERS_DISABLE_BIT0
#defineSTEPPERS_DISABLE_MASK(1?STEPPERS_DISABLE_BIT)
#defineSPINDLE_ENABLE_DDRDDRB
#defineSPINDLE_ENABLE_PORTPORTB
#ifdefVARIABLE_SPINDLE
#ifdefUSE_SPINDLE_DIR_AS_ENABLE_PIN
#defineSPINDLE_ENABLE_BIT5
#else
#defineSPINDLE_ENABLE_BIT3
#endif
#else
#defineSPINDLE_ENABLE_BIT4
#endif
#ifndefUSE_SPINDLE_DIR_AS_ENABLE_PIN
#defineSPINDLE_DIRECTION_DDRDDRB
#defineSPINDLE_DIRECTION_PORTPORTB
#defineSPINDLE_DIRECTION_BIT5
#endif
//定義輸入引腳
#defineCONTROL_DDRDDRC
#defineCONTROL_PINPINC
#defineCONTROL_PORTPORTC
#defineRESET_BIT0//弓I腳AO
#defineFEED_HOLD_BIT1//引腳Al
#defineCYCLE_START_BIT2//弓|腳A2
#defineCONTROL_INTPCIE1
#defineCONTROL_INT_vectPCINTl_vect
#defineCONTROL_PCMSKPCMSK1
#defineCONTROL_MASK((1?RESET_BIT)|(1?FEED_HOLD_BIT)|(1?CYCLE_START_BIT))
#defineCONTROL_INVERT_MASKCONTROL_MASK
#definePROBE_DDRDDRC
#definePROBE_PINPINC
#definePROBE_PORTPORTC
#definePROBE_BIT5
#definePROBE_MASK(1?PROBE_BIT)
#ifdefVARIABLE_SPINDLE
#definePWM_MAX_VALUE255.0
#defineTCCRA_REGISTERTCCR2A
#defineTCCRB_REGISTERTCCR2B
#defineOCR_REGISTEROCR2A
#defineCOMB_BITCOM2A1
#defineWAVEOREGISTERWGM20
#defineWAVE「REGISTERWGM21
#defineWAVE2_REGISTERWGM22
#defineWAVE3_REGISTERWGM23
#defineSPINDLE_PWM_DDRDDRB
#defineSPINDLE_PWM_PORTPORTB
#defineSPINDLE_PWM_BIT3
#endif
#endif
//shared.h
#ifndefshared_h
#defineshared_h
#definefalse0
#definetrue1
//軸定義
#defineN_AXIS2//軸數(shù)量
#defineX_AXIS0
#defineY_AXIS1
//XY步進(jìn)電機(jī)定義
#ifdefCOREXY
#defineA_MOTORX_AXIS
#defineB_MOTORY_AXIS
#endif
〃定義參數(shù)
#defineMM_PER_INCH(25.40)
#defineINCH_PER_MM(0.0393701)
#defineTICKS_PER_MICROSECOND(F_CPU/1000000)
#defineclear_vector(a)memset(az0,sizeof(a))
#defineclear_vector_float(a)memset(a,0.0,sizeof(float)*N_AXIS)
#defineclear_vector_long(a)memset(az0.0,sizeof(long)*N_AXIS)
#definemax(a,b)(((a)>(b))?(a):(b))
#definemin(a,b)(((a)<(b))?(a):(b))
#definebit(n)(1?n)
#definebit_true_atomic(xzmask){uint8_tsreg=SREG;cli();(x)|=(mask);SREG
=sreg;}
#definebit_false_atomic(x,mask){uint8_tsreg=SREG;cli();(x)&=~(mask);
SREG=sreg;}
A
#definebit_toggle_atomic(xzmask){uint8_tsreg=SREG;cli();(x)=(mask);
SREG=sreg;}
#definebit_true(x,mask)(x)|=(mask)
#definebit_false(x,mask)(x)&=-(mask)
#definebit_istrue(x,mask)((x&mask)!=0)
#definebit_isfalse(x,mask)((x&mask)==0)
uint8_tread_float(char*line,uint8_t*char_counterzfloat*float_ptr);
//延遲函數(shù)
voiddelay_ms(uintl6_tms);
voiddelay_us(uint32_tus);
floathypot_f(floatx,floaty);
#endif
//shared.c
#include"library.h"
#defineMAX_INT_DIGITS8//最大位數(shù)
uint8_tread_float(char*linezuint8_t*char_counter,float*float_ptr)
{
char*ptr=line+*char_counter;
unsignedcharc;
〃找到第一個(gè)字符用指針指向它
c=*ptr++;
boolisnegative=false;
if(c==?-'){
isnegative=true;
c=*ptr++;
}elseif(c=='+'){
c=*ptr++;
)
uint32_tintval=0;
int8_texp=0;
uint8_tndigit=0;
boolisdecimal=false;
while(1){
c-=101;
if(c<=9){
ndigit++;
if(ndigit<=MAX_INT_DIGITS){
if(isdecimal){exp―;}
intval=(((intval<<2)+intval)<<1)+c;
}else{
if(!(isdecimal)){exp++;}//丟棄溢出字符
)
}elseif(c==(('.1'01)&Oxff)&&!(isdecimal)){
isdecimal=true;
}else{
break;
}
c=*ptr++;
}
//如果沒(méi)有數(shù)據(jù)就返回
if(!ndigit){return(false);};
//整形轉(zhuǎn)浮點(diǎn)
floatfval;
fval=(float)intval;
if(fval!=0){
while(exp<=-2){
fval*=0.01;
exp+=2;
)
if(exp<0){
fval*=0.1;
}elseif(exp>0){
do{
fval*=10.0;
}while(一-exp>0);
)
}
if(isnegative){
*float_ptr=-fval;
}else{
*float_ptr=fval;
)
*char_counter=ptr-line-1;
return(true);
)
voiddelay_ms(uintl6_tms)
{
while(ms-){_delay_ms(1);}
)
voiddelay_us(uint32_tus)
{
while(us){
if(us<10){
_delay_us(1);
us--;
}elseif(us<100){
_delay_us(10);
us-=10;
}elseif(us<1000){
_delay_us(100);
us-=100;
}else{
_delay_ms(1);
us-=1000;
}
//斜邊計(jì)算函數(shù).
floathypot_f(floatx,floaty){return(sqrt(x*x+y*y));
2.2.2串口通信模塊相關(guān)代碼
//serial.h
#ifndefserial_h
#defineserial_h
#ifndefRX_BUFFER_SIZE
#defineRX_BUFFER_SIZE128
#endif
#ifndefTX_BUFFER_SIZE
#defineTX_BUFFER_SIZE64
#endif
#defineSERIAL_NO_DATAOxff
#ifdefENABLE_XONXOFF
#defineRX_BUFFER_FULL96
#defineRX_BUFFER_LOW64
#defineSEND_XOFF1
#defineSEND_XON2
#defineXOFF_SENT3
#defineXON_SENT4
#defineXOFF_CHAR0x13
#defineXON_CHAR0x11
#endif
voidserial_init();
〃寫(xiě)Ibyte數(shù)據(jù)到TXbuffer中
voidserial_write(uint8_tdata);
//讀取buffer中最前方的Ibyte數(shù)據(jù)
uint8_tserial_read();
//清空讀取buffer
voidserial_reset_read_buffer();
//返回?cái)?shù)據(jù)數(shù)量
uint8_tserial_get_rx_buffer_count();
//返回已完成數(shù)據(jù)量
uint8_tserial_get_tx_buffer_count();
#endif
//serial.c
#include"library.hn
uint8_tserial_rx_buffer[RX_BUFFER_SIZE];
uint8_tserial_rx_buffer_head=0;
volatileuint8_tserial_rx_buffer_tail=0;
uint8tserialtxbuffer[TXBUFFERSIZE];
uint8_tserial_tx_buffer_head=0;
volatileuint8_tserial_tx_buffer_tail=0;
#ifdefENABLE_XONXOFF
volatileuint8_tflow_ctrl=XON_SENT;
#endif
//返回RXbuffer里的數(shù)據(jù)量
uint8_tserial_get_rx_buffer_count()S{
uint8_trtail=serial_rx_buffer_tail;
if(serial_rx_buffer_head>=rtail){return(serial_rx_buffer_head-rtail);}
return(RX_BUFFER_SIZE-(rtail-serial_rx_buffer_head));
)
//返回RXbuffer里完成的數(shù)據(jù)量
uint8_tserial_get_tx_buffer_count(){
uint8_tttail=serial_tx_buffer_tail;
if(serial_tx_buffer_head>=ttail){return(serial_tx_buffer_head-ttail);}
return(TX_BUFFER_SIZE-(ttail-serial_tx_buffer_head));
}
voidserial_init(){
//設(shè)置波特率
#ifBAUD_RATE<57600
uintl6_tUBRR0_value=((F_CPU/(8L*BAUD_RATE))-1)/2;
UCSROA&=-(1?U2X0);
#else
uintl6_tUBRR0_value=((F_CPU/(4L*BAUD_RATE))-1)/2;
UCSROA|=(1?U2X0);
#endif
UBRROH=UBRR0_value?8;
UBRROL=UBRR0_value;
UCSROB|=l?RXEN0;
UCSROB|=1?TXENO;
UCSROB|=1?RXCIEO;
)
voidserial_write(uint8_tdata){
uint8_tnext_head=serial_tx_buffer_head+1;
if(next_head==TX_BUFFER_SIZE){
next_head=0;
}
while(next_head==serial_tx_buffer_tail){
if(sys_rt_exec_state&EXEC_RESET){
return;
)
)
serial_tx_buffer[serial_tx_buffer_head]=data;
serialtxbufferhead=nexthead;
UCSROB|=(1?UDRIEO);
)
ISR(SERIAL_UDRE){
uint8_ttail=serial_tx_buffer_tail;
#ifdefENABLE_XONXOFF
if(flow_ctrl==SEND_XOFF){
UDRO=XOFF_CHAR;
flow_ctrl=XOFF_SENT;
)
elseif(flow_ctrl==SEND_XON){
UDRO=XON_CHAR;
flow_ctrl=XON_SENT;
}else
#endif{
//發(fā)送數(shù)據(jù)
UDRO=serial_tx_buffer[tail];
tail++;
if(tail==TX_BUFFER_SIZE){tail=0;}
serial_tx_buffer_tail=tail;
}
if(tail==serial_tx_buffer_head){
UCSROB&=~(1?UDRIEO);
}
)
//讀取buffer里隊(duì)首數(shù)據(jù)
uint8_tserial_read(){
uint8_ttail=serial_rx_buffer_tail;
if(serial_rx_buffer_head==tail){
returnSERIAL_NO_DATA;
)
else{
uint8_tdata=serial_rx_buffer[tail];
tail++;
if(tail==RX_BUFFER_SIZE){tail=0;}
serial_rx_buffer_tail=tail;
#ifdefENABLE_XONXOFF
if((serial_get_rx_buffer_count()<RX_BUFFER_LOW)&&flow_ctrl
XOFF_SENT)(
flow_ctrl=SEND_XON;
UCSROB|=(1?UDRIEO);//ForceTX
)
#endif
returndata;
)
//中斷
ISR(SERIAL_RX){
uint8_tdata=UDRO;
uint8_tnext_head;
switch(data){
caseCMD_STATUS_REPORT:
bit_true_atomic(sys_rt_exec_state,EXEC_STATUS_REPORT);
break;
caseCMD_CYCLE_START:
bit_true_atomic(sys_rt_exec_state,EXEC_CYCLE_START);
break;
caseCMD_FEED_HOLD:
bit_true_atomic(sys_rt_exec_state,EXEC_FEED_HOLD);
break;
caseCMD_RESET:
mc_reset();
break;
default:
next_head=serial_rx_buffer_head+1;
if(next_head==RX_BUFFER_SIZE){next_head=0;}
if(next_head!=serial_rx_buffer_tail){
serial_rx_buffer[serial_rx_buffer_head]=data;
serial_rx_buffer_head=next_head;
#ifdefENABLE_XONXOFF
if((serial_get_rx_buffer_count()>=RX_BUFFER_FULL)&&flow_ctrl
XON_SENT){
flow_ctrl=SEND_XOFF;
UCSROB|=(1?UDRIEO);
)
#endif
}
)
)
〃重置讀取buffer
voidserial_reset_read_buffer(){
serial_rx_buffer_tail=serial_rx_buffer_head;
#ifdefENABLE_XONXOFF
flow_ctrl=XON_SENT;
#endif
2.2.3指令隊(duì)列模塊相關(guān)代碼
//system.h
#ifndefsystem_h
#definesystem_h
#include"library.h"
//定義系統(tǒng)映射圖
#defineEXEC_STATUS_REPORTbit(0)//位掩碼00000001
#defineEXEC_CYCLE_STARTbit(1)//位掩碼00000010
#defineEXEC_CYCLE_STOPbit(2)//位掩碼00000100
#defineEXEC_FEED_HOLDbit(3)//位掩碼00001000
#defineEXEC_RESETbit(4)//位掩碼00010000
#defineEXEC_SAFETY_DOORbit(5)//位掩碼00100000
#defineEXEC_MOTION_CANCELbit(6)//位掩碼01000000
#defineEXEC_CRITICAL_EVENTbit(0)//位掩碼00000001
#defineEXEC_ALARM_ABORT_CYCLEbit(3)//位掩碼00001000
#defineEXEC_ALARM_PROBE_FAILbit(4)//位掩碼00010000
〃定義系統(tǒng)狀態(tài)圖
#defineSTATE_IDLE0
#defineSTATE_ALARMbit(0)
#defineSTATE_CHECK_MODEbit(1)
#defineSTATE_HOMINGbit(2)
#defineSTATE_CYCLEbit(3)
#defineSTATE_HOLDbit(4)
#defineSTATE_SAFETY_DOORbit(5)
#defineSTATE_MOTION_CANCELbit(6)
//定義系統(tǒng)暫停
#defineSUSPEND_DISABLE0
#defineSUSPEND_ENABLE_HOLDbit(0)
#defineSUSPEND_ENABLE_READYbit(1)
#defineSUSPEND_ENERGIZEbit(2)
#defineSUSPEND_MOTION_CANCELbit(3)
//系統(tǒng)全局變量
typedefstruct{
uint8_tabort;
uint8_tstate;
uint8_tsuspend;
int32_tposition[N_AXIS];
int32_tprobe_position[N_AXIS];
uint8_tprobe_succeeded;
}system_t;
externsystem_tsys;
volatileuint8_tsys_probe_state;
volatileuint8_tsys_rt_exec_state;
volatileuint8_tsys_rt_exec_alarm;
//初始化系統(tǒng)
voidsystem_init();
uint8_tsystem_execute_line(char*line);
voidsystem_execute_startup(char*line);
floatsystem_convert_axis_steps_to_mpos(int32_t*stepszuint8_tidx);
voidsystem_convert_array_steps_to_mpos(float*position,int32_t*steps)
#ifdefCOREXY
int32_tsystem_convert_corexy_to_x_axis_steps(int32_t*steps);
int32_tsystem_convert_corexy_to_y_axis_steps(int32_t*steps);
#endif
#endif
//system.c
#include"library.h"
voidsystem_init()
(
CONTROL_DDR&=-(CONTROL_MASK);//配置輸入弓|腳
#ifdefDISABLE_CONTROL_PIN_PULL_UP
CONTROL_PORT&=~(CONTROL_MASK);
#else
CONTROL_PORT|=CONTROL_MASK;
#endif
CONTROL_PCMSK|=CONTROL_MASK;
PCICR|=(1?CONTROL_INT);//修改中斷
)
ISR(CONTROL_INT_vect)
{
uint8_tpin=(CONTROL_PIN&CONTROL_MASK);
#ifndefINVERT_ALL_CONTROL_PINS
pinA=CONTROL_INVERT_MASK;
#endif
〃任何控制指令輸入都可以觸發(fā)
if(pin){
if(bit_istrue(pin,bit(RESET_BIT))){
mc_reset();
}elseif(bit_istrue(pin,bit(CYCLE_START_BIT))){
bit_true(sys_rt_exec_statezEXEC_CYCLE_START);
)
}
)
//執(zhí)行啟動(dòng)腳本
voidsystem_execute_startup(char*line)
uint8tn;
for(n=0;n<N_STARTUP_LINE;n++){
if(!(settings_read_startup_line(n,line))){
report_status_message(STATUS_SETTING_READ_FAIL);
}else{
if(line[0]!=0){
printstring(line);
report_status_message(gc_execute_line(line));
}
uint8_tsystem_execute_line(char*line)
{
uint8_tchar_counter=1;
uint8_thelper_var=0;
floatparameter,value;
switch(line[char_counter]){
case0:report_grbl_help();break;
case'$1:case*G':case1C*:case1X':
if(line[(char_counter+l)]!=0){return(STATUS_INVALID_STATEMENT);}
switch(line[char_counter]){
case1$'://打印設(shè)置
if(sys.state&(STATE_CYCLE|STATE_HOLD))
{return(STATUS_IDLE_ERROR);}
else{report_grbl_settings();}
break;
case*G*://打印GCode打印模式
report_gcode_modes();
break;
case://檢查GCode代碼模式
if(sys.state==STATE_CHECK_MODE){
mc_reset();
report_feedback_message(MESSAGE_DISABLED);
}else{
if(sys.state){return(STATUS_IDLE_ERROR);}//Requiresnoalarmmode,
sys.state=STATE_CHECK_MODE;
report_feedback_message(MESSAGE_ENABLED);
)
break;
casefX'://關(guān)閉警報(bào)鎖
if(sys.state==STATE_ALARM){
report_feedback_message(MESSAGE_ALARM_UNLOCK);
sys.state=STATEIDLE;
break;
break;
default:
if(!(sys.state==STATE_IDLE||sys.state==STATE_ALARM))
(return(STATUS_IDLE_ERROR);}
switch(line[char_counter]){
case:
if(line[++char_counter]!=0){return(STATUS_INVALID_STATEMENT);
else{report_ngc_parameters();}
break;
case11'://打印信息
if(line[++char_counter]==0){
settings_read_build_info(line);
report_build_info(line);
}else{//存儲(chǔ)啟動(dòng)行
if(line[char_counter++]!=*=?){return(STATUS_INVALID_STATEMENT);
helper_var=char_counter;
do{
line[char_counter-helper_var]=line[char_counter];
}while(line[char_counter++]!=0);
settings_store_build_info(line);
)
break;
case1R*://恢復(fù)默認(rèn)設(shè)置
if(line[++char_counter]!=S){return(STATUS_INVALID_STATEMENT);
if(line[++char_counter]!=T){return(STATUS_INVALID_STATEMENT);
if(line[++char_counter]!=,=,){return(STATUS_INVALID_STATEMENT);
if(line[char_counter+2]!=0){return(STATUS_INVALID_STATEMENT);
switch(line[++char_counter]){
casesettings_restore(SETTINGS_RESTORE_DEFAULTS);break;
case'#T:settings_restore(SETTINGS_RESTORE_PARAMETERS);break;
case***:settings_restore(SETTINGS_RESTORE_ALL);break;
default:return(STATUS_INVALID_STATEMENT);
}
report_feedback_message(MESSAGE_RESTORE_DEFAULTS);
mc_reset();
break;
case*N':
if(line[++char_counter]==0){
for(helper_var=0;helper_var<N_STARTUP_LINE;helper_var++){
if(!(settings_read_startup_line(helper_varzline))){
report_status_message(STATUS_SETTING_READ_FAIL);
}else{
report_startup_line(helper_varzline);
)
}
break;
}else{
if(sys.state!=STATE_IDLE){return(STATUS_IDLE_ERROR);}
helper_var=true;
)
default:
if(!read_float(line,&char_counter,¶meter))
{return(STATUS_BAD_NUMBER_FORMAT);}
if(line[char_counter++]!==){return(STATUS_INVALID_STATEMENT);
if(helper_var){
helper_var=char_counter;
do{
line[char_counter-helper_var]=line[char_counter];
}while(line[char_counter++]!=0);
helper_var=gc_execute_line(line);
if(helper_var){return(helper_var);}
else{
helper_var=trunc(parameter);
settings_store_startup_line(helper_var,line);
}
}else{
if(!read_float(line,&char_counterzSvalue))
{return(STATUS_BAD_NUMBER_FORMAT);}
if((line[char_counter]!=0)||(parameter>255))
{return(STATUS_INVALID_STATEMENT);}
return(settings_store_global_setting((uint8_t)parameter,value));
)
}
)
return(STATUS_OK);
)
floatsystem_convert_axis_steps_to_mpos(int32_t*steps,uint8_tidx)
(
floatpos;
#ifdefCOREXY
if(idx==X_AXIS){
pos=(float)system_convert_corexy_to_x_axis_steps(steps)/
settings.steps_per_mm[A_MOTOR];
}elseif(idx==Y_AXIS){
pos=(float)system_convert_corexy_to_y_axis_steps(steps)/
settings.stepspermm[BMOTOR];
}else{
pos=steps[idx]/settings.steps_per_mm[idx];
}
#else
pos=steps[idx]/settings.steps_per_mm[idx];
#endif
return(pos);
)
voidsystem_convert_array_steps_to_mpos(float“position,int32_t*steps)
(
uint8_tidx;
for(idx=0;idx<N_AXIS;idx++){
position[idx]=system_convert_axis_steps_to_mpos(steps,idx);
)
return;
)
//計(jì)算X/Y軸運(yùn)動(dòng)
#ifdefCOREXY
int32_tsystem_convert_corexy_to_x_axis_steps(int32_t*steps){
return((steps[A_MOTOR]+steps[B_MOTOR])/2);
}
int32_tsystem_convert_corexy_to_y_axis_steps(int32_t*steps){
return((steps[A_MOTOR]-steps[B_MOTOR])/2);
)
#endif
//protocol.h
#ifndefprotocol_h
#defineprotocol_h
//讀取隊(duì)列大小
#ifndefLINE_BUFFER_SIZE
#defineLINE_BUFFER_SIZE80
#endif
//啟動(dòng)主循環(huán)
voidprotocol_main_loop();
//實(shí)時(shí)命令執(zhí)行
voidprotocol_execute_realtime();
//執(zhí)行自動(dòng)循環(huán)
voidprotocol_auto_cycle_start();
//同步隊(duì)列
voidprotocol_buffer_synchronize();
#endif
//protocol.c
#includenlibrary.h"
//定義不同對(duì)話類(lèi)型
#defineCOMMENT_NONE0
#defineCOMMENT_TYPE_PARENTHESES1
#defineCOMMENT_TYPE_SEMICOLON2
staticcharline[LINE_BUFFER_SIZE];//執(zhí)彳亍彳亍號(hào)
//執(zhí)行一行
staticvoidprotocol_execute_line(char*line){
protocol_execute_realtime();
if(sys.abort){return;}
#ifdefREPORT_ECHO_LINE_RECEIVED
report_echo_line_received(line);
#endif
if(line[0]==0){
report_status_message(STATUS_OK);
}elseif(line[0]==T$'){
//系統(tǒng)指令
report_status_message(system_execute_line(line));
}elseif(sys.state==STATE_ALARM){
report_status_message(STATUS_ALARM_LOCK);
}else{
report_status_message(gc_execute_line(line));
}
)
voidprotocol_main_loop()
(
//打印初始信息
report_init_message();
//警報(bào)
if(sys.state==STATE_ALARM){
report_feedback_message(MESSAGE_ALARM_LOCK);
}else{
system_execute_startup(line);
)
uint8_tcomment=COMMENT_NONE;
uint8_tchar_counter=0;
uint8_tc;
for(;;){
while((c=serial_read())!=SERIAL_NO_DATA){
if((c==,\n,)||(c==f\rr)){//行結(jié)束的標(biāo)志
line[char_counter]=0;//設(shè)置字符終止標(biāo)志
protocol_execute_line(line);//執(zhí)行
comment=COMMENT_NONE;
char_counter=0;
}else{
if(comment!=COMMENT_NONE){//忽略無(wú)效對(duì)話
if(c尸){
if(comment==COMMENT_TYPE_PARENTHESES){comment=COMMENT_NONE;}
}
}else{
if(c<=11){
}elseif(c==*/*){
}elseif(c=='(*){
comment=COMMENT_TYPE_PARENTHESES;
}elseif(c==*;1){
comment=COMMENT_TYPE_SEMICOLON;
}elseif(char_counter>=(LINE_BUFFER_SIZE-1)){
report_status_message(STATUS_OVERFLOW);
comment=COMMENT_NONE;
char_counter=0;
}elseif(c>='a*&&c<=*z*){//大小寫(xiě)轉(zhuǎn)化
line[char_counter++]=c-'a,+*A*;
}else{
line[char_counter++]=c;
}
)
}
}
protocol_auto_cycle_start();〃自動(dòng)循環(huán)
protocol_execute_realtime();//實(shí)時(shí)執(zhí)行
if(sys.abort){return;}
)
return;
)
voidprotocol_execute_realtime()
(
uint8_trt_exec;
do{//系統(tǒng)暫停循環(huán)
rt_exec=sys_rt_exec_alarm;
if(rt_exec){
sys.state=STATE_ALARM;
if(rt_exec&EXEC_ALARM_HARD_LIMIT){
report_alarm_message(ALARM_HARD_LIMIT_ERROR);
}elseif(rt_exec&EXEC_ALARM_SOFT_LIMIT){
report_alarm_message(ALARM_S0FT_LIMIT_ERROR);
}elseif(rt_exec&EXEC_ALARM_ABORT_CYCLE){
report_alarm_message(ALARM_ABORT_CYCLE);
}elseif(rt_exec&EXEC_ALARM_PROBE_FAIL){
report_alarm_message(ALARM_PROBE_FAIL);
)
if(rt_exec&EXEC_CRITICAL_EVENT){
report_feedback_message(MESSAGE_CRITICAL_EVENT);
bit_false_atomic(sys_rt_exec_state,EXEC_RESET);
do(
}while(bit_isfalse(sys_rt_exec_statezEXEC_RESET));
)
bit_false_atomic(sys_rt_exec_alarmzOxFF);//情況警報(bào)
)
//檢查并執(zhí)行實(shí)時(shí)命令
rt_exec=sys_rt_exec_state;
if(rt_exec){
//系統(tǒng)終止
if(rt_exec&EXEC_RESET){
sys.abort=true;
return;
)
//執(zhí)行并報(bào)告串口填充
if(rt_exec&EXEC_STATUS_REPORT){
report_realtime_status();
bit_false_atomic(sys_rt_exec_state,EXEC_STATUS_REPORT);
}
//保持狀態(tài)
if(rt_exec&(EXEC_MOT
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 表彰大會(huì)活動(dòng)報(bào)告
- 七年級(jí)語(yǔ)文下冊(cè) 第二單元 8 少年愛(ài)因斯坦教學(xué)設(shè)計(jì) 語(yǔ)文版
- 初中英語(yǔ)人教新目標(biāo) (Go for it) 版九年級(jí)全冊(cè)Section A第4課時(shí)教學(xué)設(shè)計(jì)
- 初中信息技術(shù)大連版八年級(jí)下冊(cè)第一單元 探秘動(dòng)畫(huà)世界第十課 交互動(dòng)畫(huà)之魂-按鈕元件的應(yīng)用教學(xué)設(shè)計(jì)
- 初中體育華東師大版七年級(jí)全一冊(cè)邁向成熟的蛻變-青春期特點(diǎn)、常見(jiàn)問(wèn)題和預(yù)防教案
- 碧桂園項(xiàng)目總培訓(xùn)
- 九年級(jí)數(shù)學(xué)下冊(cè) 第二十九章 投影與視圖29.2 三視圖第2課時(shí) 由三視圖確定幾何體教學(xué)設(shè)計(jì) (新版)新人教版
- 房地產(chǎn)精裝裝修培訓(xùn)講師
- 抖音基礎(chǔ)教學(xué)培訓(xùn)
- 七年級(jí)語(yǔ)文下冊(cè) 第三單元 10 阿長(zhǎng)與《山海經(jīng)》教學(xué)設(shè)計(jì) 新人教版
- 生理學(xué)(全套課件)
- 路基石方破碎開(kāi)挖專(zhuān)項(xiàng)施工方案
- 二年級(jí)美術(shù)上冊(cè)課件 《3.我的手印畫(huà)》 贛美版 (共18張PPT)
- Q∕SY 126-2014 油田水處理用緩蝕阻垢劑技術(shù)規(guī)范
- 環(huán)保管理制度(適用于軟件企業(yè))
- 全國(guó)青少年機(jī)器人技術(shù)等價(jià)考試三級(jí)全套課件
- 適老化改造培訓(xùn)課件(PPT 31頁(yè))
- 鋼結(jié)構(gòu)門(mén)式剛架廠房設(shè)計(jì)土木工程畢業(yè)設(shè)計(jì)
- 光伏并網(wǎng)逆變器調(diào)試報(bào)告正式版
- 市政道路大中修工程管理指引
- SF_T 0097-2021 醫(yī)療損害司法鑒定指南_(高清版)
評(píng)論
0/150
提交評(píng)論