ЗАКЛЮЧЕНИЕ
В данном дипломном проекте была разработана система управления скоростью и нагружением обкаточного испытательного стенда. Микропроцессорная система управления состоит из трех подсистем: управления скоростью, управления скоростной ударной нагрузкой и силовой нагрузкой. Основные результаты работы сводятся к следующему.
Проведен анализ существующих методов управления силовой электроникой. Сделан обзор методов частотного управления электроприводами. Был выбран метод векторного управления. Выбранный метод управления был исследован на модели в пакете SIMULINK, для требуемого типа двигателя.
Разработаны структурные и принципиальные схемы систем управления скоростью и нагружением. Для каждой из систем был сделан обзор и выбор датчиков обратных связей. Представлены подробные описания функционирования устройств.
Кроме этого, в дипломном проекте были разработаны алгоритмы работы и программное обеспечение управляющих микроконтроллеров. Разработано программное управление системами.
Произведен расчет затрат на проектирование и разработку как аппаратной, так и программной части устройств.
В разделе охраны труда произведен анализ опасных и вредных производственных факторов при работе на испытательном стенде, разработаны меры по снижению их воздействия на оператора.
СПИСОК ИСПОЛЬЗУЕМЫХ ИСТОЧНИКОВ
1 Аранчий, Г.В. и др. Тиристорные преобразователи частоты для регулируемых электроприводов. М., «Энергия», 1968. - 128 с.: ил.
2 Арустамов, Э.А. Охрана труда: Справочник. - Дашков и К°, 2008. - 588 с.
3 Архангельский, А.Я. Приемы программирования в C++ Builder. Механизмы Windows. Сети./А. Я. Архангельский, М. А. Тагин.- М.: БИНОМ, 2004 г. - 656 с.
4 Бочков, К.А., Серенков, А.Г., Кондрачук, В.Ф., Харлап, С. Н. Автоматика, телемеханика и связь на транспорте: Пособие по оформлению дипломных проектов по специальности «АТиС на транспорте» БелГУТ- Гомель:2001.- 74 с.
5 Герман-Галкин, С.Г. MATLAB & SIMULINK. Проектирование мехатронных систем на ПК. - Спб.: КОРОНА-Век., 2008. - 368 с.
Гульков, Г.И. и др. Системы автоматизированного управления электроприводами: учеб. пособие. 2-е изд., испр. и доп.- Минск: Новое знание, 2007. - 394с.: ил.
Драйвер шагового двигателя «ISD7050». Руководство по эксплуатации. [Электронный ресурс] - Режим доступа: http://www.imc.by/templates /imc/public/pdf/isd7050_um_ru.pdf
Емельянова, И.А. Технико-экономическое обоснование дипломных проектов: Пособие для студентов электротехнического факультета. - Гомель: УО «БелГУТ», 2005.- 50с.
Ляшко, М.Н., Маркевич, К.М. Основы радиоэлектроники: Учеб. пособие. - 2-е изд. перераб. - Мн.: Нар. асвета, 1991. - 175 с.: ил.
Рудаков, В.В. и др. Асинхронные электроприводы с векторным управлением. - Л.: Энергоатомидат, Ленингр. отд-ние, 1987. - 136с.: ил.
Соколовский, Г.Г. Электроприводы переменного тока с частотным регулированием: Учебное пособие. - Москва: ACADEMA, 2006. - 265c.: ил.
Справочник по среднему семейству микроконтроллеров PICmicro. [Электронный ресурс] - Режим доступа: http://ww1.microchip.com/downloads /rus/DeviceDoc/33023a.pdf
Усольцев, А.А. Частотное управление асинхронными двигателями/Учебное пособие. Спб: СПбГУ ИТМО, 2006. - 94 с.
Черных, И.В. Моделирование электротехнических устройств в MATLAB, SimPowerSystems и Simulink. - М.: ДМК Пресс; СПб.: Питер, 2008. - 288 с.: ил.
15 An Introduction to AC Induction Motor Control Using the dsPIC30F [Электронный ресурс] - Режим доступа: <http://ww1.microchip.com/downloads/en/AppNotes>
/AC%20Induction%20Motor%2000984a.pdf
16 Control of Stepping Motors. [Электронный ресурс] - Режим доступа: http://www.cs.uiowa.edu/~jones/step/
17 dsPIC30F2010 Data Sheet. [Электронный ресурс] - Режим доступа: <http://eicom.ru/pdf/datasheet/Microchip_PDFs/DSPIC30F2010_rev_E/DSPIC30F2010_rev_E.html>.
18 dsPIC30F Family Reference Manual. [Электронный ресурс] - Режим доступа:
<http://ww1.microchip.com/downloads/en/DeviceDoc/70046E.pdf>
Measuring Speed and Position with the QEI Module. [Электронный ресурс] Режим доступа: <http://ww1.microchip.com/downloads/en/DeviceDoc/93002A.pdf>
20 Using the dsPIC30F for Vector
Control of an ACIM. [Электронный
ресурс] - Режим доступа:
http://ww1.microchip.com/downloads/en/AppNotes/00908B.pdf
<:%20http:/www.mp3-converter.com/mp3codec/mp3_decoder.pdf>
ПРИЛОЖЕНИЕ А
(обязательное)
ЛИСТИНГ ПРОГРАММЫ УПРАВЛЕНИЯ ИСПЫТАНИЯМИ
PU.cpp
#include <vcl.h>
#pragma hdrstop
#include "PU.h"
#pragma package(smart_init)
#pragma link "CSPIN"
#pragma resource "*.dfm"*Form1;hour, min, sec, step_time, porti, read1, read2, read3 = 0;V;send_data = false;com1, com2, com3;pi;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}__fastcall TForm1::FormCreate(TObject *Sender)
{_search();_Start->Enabled = false;_Stop->Enabled = false;_Clear->Enabled = false;
_strtime(current_time);_current_time->Caption = current_time;->Cells[0][0] = "шаг №";->Cells[1][0] = "время, мин";
StringGrid1->Cells[2][0] = "скорость, об/мин";->Cells[3][0] = "ударная скорость, об/мин";->Cells[4][0] = "перемещение, мм";->Cells[5][0] = "прогресс выполнения";
}__fastcall TForm1::B_enterClick(TObject *Sender)
{->Cells[0][StringGrid1->RowCount - 1] = StringGrid1->RowCount - 1;->Cells[1][StringGrid1->RowCount - 1] = StrToInt(edit_h->Text)*60 + StrToInt(edit_m->Text);->Cells[2][StringGrid1->RowCount - 1] = edit_speed->Text;->Cells[3][StringGrid1->RowCount - 1] = edit_speed2->Text;->Cells[4][StringGrid1->RowCount - 1] = edit_angle->Text;->Cells[6][StringGrid1->RowCount - 1] = StrToInt(edit_h->Text)*60 + StrToInt(edit_m->Text);->RowCount = StringGrid1->RowCount + 1;_Clear->Enabled = true;_Start->Enabled = true;
}__fastcall TForm1::Timer1Timer(TObject *Sender)
{buf1, buf2, buf3;
_strtime(current_time);_current_time->Caption = current_time;(start)
{(step_time == 0)
{->Cells[5][Step] = "ВЫПОЛНЕНО";(Step == StringGrid1->RowCount)
{_Stop->Click();;
}Step++;_time = StrToInt(StringGrid1->Cells[6][Step])*60;->Cells[5][Step] = "Выполняется";.Send((char *)StringGrid1->Cells[2][Step].c_str(),2);.Send((char *)StringGrid1->Cells[3][Step].c_str(),2);.Send((char *)StringGrid1->Cells[4][Step].c_str(),1);
}_time--;++;(min < 60 && sec == 60)
{++; sec = 0;_go_time->Caption = IntToStr(hour)+" час "+IntToStr(min)+ " мин";_change_time->Caption = "через "+ IntToStr(step_time) + " мин";
}(min == 60)
{++;= 0;_go_time->Caption = IntToStr(hour)+" час "+IntToStr(min)+ " мин";_change_time->Caption = "через "+IntToStr(step_time)+" мин";
}readCount3 = com3.Recv(&buf3, 1); // 1 byte for read(readCount3 == 10)
{_Stop->Click();
Application->MessageBoxA("ИСПЫТАНИЯ НЕВОЗМОЖНЫ: линейное перемещение не соответствует заданному", "Ошибка во время испытаний", MB_ICONERROR);
return;
}(readCount3 == 20)
{_Stop->Click();
Application->MessageBoxA("ИСПЫТАНИЯ НЕВОЗМОЖНЫ: испытываемый образец разрушен", "Ошибка во время испытаний", MB_ICONERROR);
return;
}
}
}__fastcall TForm1::B_StartClick(TObject *Sender)
{(!com_open())
{;
}.Send((char*)0xFFFF, 2);.Send((char*)0xFFFF, 2);.Send((char*)0xFF, 1);->Enabled = true;->Enabled = false;->Enabled = false;->Enabled = false;
_strtime(start_time);_start_time->Caption = start_time;= 0; min =0; hour = 0;= 1;_time = StrToInt(StringGrid1->Cells[6][Step]) * 60;_change_time->Caption = "через "+StringGrid1->Cells[6][Step]+" мин";->Cells[5][Step] = "Выполняется";_Start->Enabled = false;_Stop->Enabled = true;_go_time->Caption = "<1 мин";
}__fastcall TForm1::B_StopClick(TObject *Sender)
{= false;
_strtime(start_time);_stop_time->Caption = start_time;_Start->Enabled = true;_Stop->Enabled = false;(int c=1; c < StringGrid1->ColCount; c++)(int z=1; z < StringGrid1->RowCount; z++)->Cells [c] [z] = ' ';->RowCount = 2;.Send((char *)0,2);.Send((char *)0,2);.Send((char *)0,1);
}__fastcall TForm1::B_ExitClick(TObject *Sender)
{(0);
}__fastcall TForm1::B_ClearClick(TObject *Sender)
{(StringGrid1->RowCount>2)->RowCount--;
}TForm1::com_search()
{.GetPortsInfo(&pi);(int i = 0; i < pi.koll; i++)
{(pi.p[i].Availbl == true)
{->Items->Add(AnsiString(pi.p[i].Id));->Items->Add(AnsiString(pi.p[i].Id));->Items->Add(AnsiString(pi.p[i].Id));
}
}
}TForm1::com_open()
{b1,b2,b3;
{= com1.Open(StrToInt(ComboBox1->Text),9600);= com2.Open(StrToInt(ComboBox2->Text),9600);= com3.Open(StrToInt(ComboBox2->Text),9600);
}(EConvertError&)
{>MessageBoxA("ИСПЫТАНИЯ НЕВОЗМОЖНЫ: не удалось открыть порт. Проверьте назначенные порты", "Ошибка", MB_ICONERROR);false;
}(b1 == false || b2 == false || b3 == false)
{>MessageBoxA("ИСПЫТАНИЯ НЕВОЗМОЖНЫ: не удалось открыть порт. Проверьте назначенные порты", "Ошибка", MB_ICONERROR);false;
}return true;
}__fastcall TForm1::Timer2Timer(TObject *Sender)
{->Enabled = false;buf1, buf2, buf3;readCount1 = com1.Recv(&buf1, 1);readCount2 = com1.Recv(&buf2, 1);readCount3 = com1.Recv(&buf3, 1);(readCount1 > 0)= (unsigned char)buf1;(readCount2 > 0)= (unsigned char)buf2;(readCount3 > 0)= (unsigned char)buf3;(read1 == 255 && read2 == 255 && read3 == 255)
{= true;.Send(( char* )StringGrid1->Cells[2][1].c_str(), 2);.Send(( char* )StringGrid1->Cells[3][1].c_str(), 2);.Send(( char* )StringGrid1->Cells[4][1].c_str(), 2);
}(read1 != 255)
{>MessageBoxA("Устройство управления скоростью не работает", "Ошибка инициализации устройств", MB_ICONERROR);
B_Stop->Click();
}(read2 != 255)
{>MessageBoxA("Устройство управления ударной нагрузкой не работает", "Ошибка инициализации устройств", MB_ICONERROR);
B_Stop->Click();
}(read3 != 255)
{>MessageBoxA("Устройство управления силовой нагрузкой не работает", "Ошибка инициализации устройств", MB_ICONERROR);
B_Stop->Click();
}= 0;
}.h
#ifndef PUH
#define PUH
#define MAX_WIN_PORT 255
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Grids.hpp>
#include <Time.h>
#include <ExtCtrls.hpp>
#include "SerialGate.h"TForm1 : public TForm
{
__published: // IDE-managed Components*GroupBox1;*StringGrid1;*GroupBox2;*Timer1;*edit_angle;*edit_speed;*edit_speed2;*GroupBox3;*Label1;*label_current_time;*Label2;*Label4;*Label3;*label_start_time;*label_change_time;*label_stop_time;*B_enter;*label_go_time;*Label6;*edit_m;*edit_h;*Label5;*Label7;*Label8;*Label9;*Label10;*Label11;*Label12;*Label13;*GroupBox4;*B_Start;*B_Stop;*ComboBox1;*Label14;*Label15;*ComboBox2;*Label16;*ComboBox3;*B_Exit;*B_Clear;*Timer2;__fastcall B_enterClick(TObject *Sender);__fastcall Timer1Timer(TObject *Sender);__fastcall B_StartClick(TObject *Sender);__fastcall B_StopClick(TObject *Sender);__fastcall B_ExitClick(TObject *Sender);__fastcall B_ClearClick(TObject *Sender);__fastcall FormCreate(TObject *Sender);__fastcall Timer2Timer(TObject *Sender);__fastcall StringGrid1Enter(TObject *Sender);: // User declarations: // User declarations
__fastcall TForm1(TComponent* Owner);com_search();com_open();init_units();x, y, i, Step;current_time[9], start_time[9];start, stop;hFile1, hFile2, hFile3;
};PACKAGE TForm1 *Form1;
#endif
ПРИЛОЖЕНИЕ Б
(обязательное)
ЛИСТИНГ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ДЛЯ УПРАВЛЕНИЯ СКОРОСТЬЮ
MAIN.C
#define INITIALIZE
#include <dsp.h>
#include "UserParms.h"
#include "general.h"
#include "Motor.h"
#include "Parms.h"
#include "Encoder.h"
#include "SVGen.h"
#include "ReadADC.h"
#include "MeasCurr.h"
#include "CurModel.h"
#include "FdWeak.h"
#include "Control.h"
#include "PI.h"
#include "Park.h"
#include "UserParms.h"
_FWDT(WDT_OFF);
_FBORPOR(PBOR_ON & BORV_20 & PWRT_64 & MCLR_EN);{Long;Word[2];Short[2];Byte[4];
} DataUnion;PIParmQ;PIParmQref;PIParmD;ReadADCParm;iRPM,iRPM_old;iMaxLoopCnt;iLoopCnt;iDispLoopCnt;InitUserParms(void);SetupPeripherals();RcvVel;RunMotor, StopMotor;main(void)
{();= 0;();.qdSum = 0;.qdSum = 0;.qdSum = 0;= 0;bits.ADIF = 0;bits.ADIE = 1;(1)
{
}
}SetupPeripherals()
{= 0x003B;= 0x4000;= 0x0080;= 0x0000;= 0x0004;
// ============= Interrupts ===========bits.ADIP = 7;bits.U1RXIP = 5;bits.INT0IP = 6;bits.INT0IE = 1;
// ============= UART =================MODE = 0;MODEbits.WAKE = 1;MODEbits.WAKE = 1;STA = 0;STAbits.UTXEN = 1;STAbits.URXISEL = 1;BRG = 47;bits.U1RXIE = 1;MODEbits.UARTEN = 1;
// ============= Encoder ===============( InitEncoderScaling() )
// ErrorTrue;
// ============= Current Model ===============(InitCurModelScaling())
// ErrorTrue;
// ============= SVGen ===============.iPWMPeriod = dLoopInTcy;
// ============= TIMER #1 ======================= 0xFFFF;CONbits.TON = 1;CONbits.TCKPS = 1;
// ============= Motor PWM ======================= 0;= 0;= 0;
// Center aligned PWM.= dLoopInTcy/2; // Setup PWM period to Loop Time defined in parms.h= 0x0077; // Enable PWM 1,2,3 pairs for complementary mode= dDeadTime; // Dead time= 0;= 0x8002; // Enable PWM for center aligned operation= 2;.SEVTDIR = 0;
// ============= Encoder ================ MotorParm.iCntsPerRev;= 0;= 0;.QEIM = 7;.POSRES = 0;.SWPAB = 1;= 0;
// ============= ADC - Measure Current ======================= 0;bits.FORM = 3;bits.SSRC = 3;bits.SIMSAM = 1;bits.ASAM = 1;= 0;bits.CHPS = 1;= 0;bits.ADCS = 15;= 0;.CH0SA = 1;.CH123SA = 0;= 0xFFFF;.PCFG0 = 0; // AN0 analog.PCFG1 = 0; // AN1 analog= 0;bits.ADON = 1;False;
}InitUserParms(void)
{.SATA = 0;.iScaleMechRPM = diNomRPM;.iPoles = diPoles ;.iCntsPerRev = diCntsPerRev;.fRotorTmConst = dfRotorTmConst;.fLoopPeriod = dLoopInTcy * dTcy;.fVelIrpPeriod = MotorParm.fLoopPeriod;.iIrpPerCalc = diIrpPerCalc;.fScaleMechRPS = MotorParm.iScaleMechRPM/60.0;.fScaleFluxRPS = MotorParm.iPoles*MotorParm.fScaleMechRPS;.fScaleFluxPeriod = 1.0/MotorParm.fScaleFluxRPS;.fScaleFracRevPerLoop = MotorParm.fLoopPeriod * MotorParm.fScaleFluxRPS;.fScaleFluxSpeed = 6.283 * MotorParm.fScaleFluxRPS;.lScaleCntRate = MotorParm.iCntsPerRev * (MotorParm.iScaleMechRPM/60.0);.qK1 = dqK1;
// ============= PI D Term ===============.qKp = dDqKp;.qKi = dDqKi;.qKc = dDqKc;.qOutMax = dDqOutMax;.qOutMin = -PIParmD.qOutMax;(&PIParmD);
// ============= PI Q Term ===============.qKp = dQqKp;.qKi = dQqKi;.qKc = dQqKc;.qOutMax = dQqOutMax;.qOutMin = -PIParmQ.qOutMax;(&PIParmQ);
// ============= PI Qref Term ===============.qKp = dQrefqKp;.qKi = dQrefqKi;.qKc = dQrefqKc;.qOutMax = dQrefqOutMax;.qOutMin = -PIParmQref.qOutMax;(&PIParmQref);
// ============= ADC - Measure Current ======================.qK = dqK;.qKa = dqKa;.qKb = dqKb;( 450, 730 );
}DoControl( void )
{i;.qVelRef = RcvVel;.qdImag = ParkParm.qId;.qVelMech = EncoderParm.qVelMech;();.qAngle = CurModelParm.qAngFlux;();(EncoderParm.iVelCntDwn == EncoderParm.iIrpPerCalc)
{();.qInMeas = EncoderParm.qVelMech;.qInRef = CtrlParm.qVelRef;(&PIParmQref);.qVqRef = PIParmQref.qOut;
}
// PI control for Q.qInMeas = ParkParm.qIq;.qInRef = CtrlParm.qVqRef;(&PIParmQ);.qVq = PIParmQ.qOut;
// PI control for D.qInMeas = ParkParm.qId;.qInRef = CtrlParm.qVdRef;(&PIParmD);.qVd = PIParmD.qOut;
}__attribute__((__interrupt__)) _ADCInterrupt(void)
{bits.ADIF = 0;();( !StopMotor )
{
// Calculate qIa,qIb();
// Calculate qId,qIq from qSin,qCos,qIa,qIb();
// Calculate control values();
// Calculate qSin,qCos from qAngle();
// Calculate qValpha, qVbeta from qSin,qCos,qVd,qVq();
// Calculate Vr1,Vr2,Vr3 from qValpha, qVbeta();
// Calculate and set PWM duty cycles from Vr1,Vr2,Vr3();( !RunMotor )
{= 1;
}
}
{bits.ADIE = 0;= 0;
}
}__attribute__((__interrupt__)) _U1RXInterrupt(void)
{RcvVelLsb;RcvVelMsb;RcvVel1;bits.U1RXIF = 0;= U1RXREG;= U1RXREG;( RcvVelLsb == 0xFF && RcvVelMsb == 0xFF )TXREG = 0xFF;
{= RcvVelMsb << 8;+= RcvVelLsb;= RcvVel1;= 1;
}
}__attribute__((__interrupt__)) _INT0Interrupt(void)
{= 0;= 0;
}.h
#ifndef UserParms_H
#define UserParms_H
#define dFoscExt 7372800
#define dPLL 8
#define dLoopTimeInSec 0.00005 // PWM Period - 50 uSec, 20Khz PWM
#define dDeadTimeSec 0.000002 // Deadtime in seconds
#define dFosc (dFoscExt*dPLL) // Clock frequency (Hz)
#define dFcy (dFosc/4)
#define dTcy (1.0/dFcy) // Instruction cycle period (sec)
#define dDeadTime (int)(dDeadTimeSec*dFcy)
#define dLoopInTcy (dLoopTimeInSec/dTcy)
//************** Motor Parameters **************
#define diPoles 1
#define diCntsPerRev 2000
#define diNomRPM 3450
#define dfRotorTmConst 0.078
#define diIrpPerCalc 40
//************** PI **************
#define dDqKp Q15(0.3125);
#define dDqKi Q15(0.0625);
#define dDqKc Q15(0.0625);
#define dDqOutMax Q15(0.7071);
#define dQqKp Q15(0.3125);
#define dQqKi Q15(0.0625);
#define dQqKc Q15(0.0625);
#define dQqOutMax Q15(0.7071);
#define dQrefqKp Q15(0.375);
#define dQrefqKi Q15(0.0625);
#define dQrefqKc Q15(0.0625);
#define dQrefqOutMax Q15(0.5);
//************** ADC Scaling **************
#define dqK Q15(0.5);
#define dqKa Q15(0.5);
#define dqKb Q15(0.5);
//************** Field Weakening **************
#define dqK1 Q15(0.114); // Flux reference value
#endif
ПРИЛОЖЕНИЕ В
(обязательное)
ЛИСТИНГ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ДЛЯ УПРАВЛЕНИЯ НАГРУЖЕНИЕМ
MY.C
#include <16F76.h>
#device adc=10
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //External resonator on OSC1-OSC2
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES BROWNOUT //Reset when brownout detected
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, parity=N, stream=PC)
#byte T1CON = 0x10
#byte INTCON = 0x0Binit_state();set_state( int8 step );tmr_overflow;global_step;
#INT_TIMER1tmr1_isr()
{adc_value_moment;adc_value_current_moment;temp;_overflow++;( tmr_overflow == 10 )
{_us(20);_adc_channel(0);_value_current_moment = read_adc();= abs(adc_value_current_moment - adc_value_moment);( temp < (adc_value_moment * 0.2))
{_overflow = 0;;
}
{( 97, PC); //код ошибки - уничтожение образца превышение момента на 20%_high(PIN_C3);_high(PIN_C4);_state();;
}
}_us(20);_adc_channel(0);_value_moment = read_adc();
}
#INT_RDAusart_isr()
{in_byte1;in_byte2;adc_value_shift;shift_difference;temp;error_code;_byte1 = fgetc( PC );_byte2 = fgetc( PC );( in_byte1 == 0xFF )
{( 0xFF, PC );;
}
{= set_state(in_byte1);( temp == 1 )
{_us(20);_adc_channel(1);_value_shift = read_adc();_difference = adc_value_shift - in_byte2;( abs(shift_difference) < 2 )
{_timer1( 65536 );_overflow = 0;_interrupts(INT_TIMER1);CON |= 0x08;;
}{ init_state(); error_code = 98; }
}error_code = 99;( error_code, PC); //код ошибки ШД или драйвера ISD_high(PIN_C3);_high(PIN_C4);
}
}main()
{_low(PIN_C3);_low(PIN_C4);_interrupts(GLOBAL);_spi(FALSE);_timer_0( RTCC_INTERNAL | RTCC_DIV_1 );_timer_1( T1_INTERNAL | T1_DIV_BY_8 );CON |= 0x08;_timer1( 65536 );_timer_2( T2_DISABLED,0,1 );_ccp1( CCP_OFF );_tris_a( 0xFF );_tris_c( 0x83 );_tris_b( 0x07 );_adc(ADC_CLOCK_DIV_8 );_adc_ports( RA0_RA1_RA3_ANALOG );_ms( 1000 );_interrupts( INT_EXT );_interrupts( INT_TIMER0 );_interrupts( INT_SSP );_interrupts( INT_AD );_interrupts( INT_RDA );_state();_interrupts( INT_RDA );_adc(ADC_START_ONLY);( 1 ) ;
}init_state()
{( input_state(PIN_A4) != 1 || input_state(PIN_B2) != 1)
{_low( PIN_B6 );_high( PIN_B7 );_us(0.5);_low( PIN_B7 );_us(0.5);
}( input_state(PIN_B2) ==1 )
{_interrupts(INT_TIMER1);_interrupts(GLOBAL);( 99, PC);_high(PIN_C3);_high(PIN_C4);_interrupts(GLOBAL);
};
}set_state( int8 step )
{step1;dir;( global_step < step )
{= step - global_step;_step = step;= 1;
}( global_step > step)
{= global_step - step;_step = step;= 0;
}( global_step == 0 )
{= step;_step = step;
}( input_state(PIN_B2) != 1 || step1 != 0 )
{( dir > 0)_high( PIN_B6 );output_low( PIN_B6 );_high( PIN_B7 );_us(0.5);_low( PIN_B7 );_us(0.5);--;
}( input_state(PIN_B2) == 1)0;1;
}