Дипломная (вкр): Микропроцессорное устройство управления скоростью и нагружением обкаточного испытательного стенда

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

ЗАКЛЮЧЕНИЕ

В данном дипломном проекте была разработана система управления скоростью и нагружением обкаточного испытательного стенда. Микропроцессорная система управления состоит из трех подсистем: управления скоростью, управления скоростной ударной нагрузкой и силовой нагрузкой. Основные результаты работы сводятся к следующему.

Проведен анализ существующих методов управления силовой электроникой. Сделан обзор методов частотного управления электроприводами. Был выбран метод векторного управления. Выбранный метод управления был исследован на модели в пакете 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;

}

Источник: https://www.bibliofond.ru/detail.aspx?id=867647