336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

자세한 의뢰는 ▶링크 클릭해주세요



Naver[FWDTEN] 





평행주차 졸업작품(=졸작) PIC32MX460기반

Design Contest Report_06_mai_2011.doc

AutomaticTrafficMovementsControl.pdf

AutomaticTrafficMovementsControl.ppt


Project.egg



▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼

#include <plib.h>

#include "standardtypes.h"

#include "configuration.h"



#ifndef OVERRIDE_CONFIG_BITS


#pragma config ICESEL   = ICS_PGx2 // ICE/ICD Comm Channel Select

#pragma config BWP      = OFF // Boot Flash Write Protect

#pragma config CP       = OFF // Code Protect

#pragma config FNOSC    = PRIPLL // Oscillator Selection

#pragma config FSOSCEN  = OFF // Secondary Oscillator Enable

#pragma config IESO     = OFF // Internal/External Switch-over

#pragma config POSCMOD  = HS // Primary Oscillator

#pragma config OSCIOFNC = OFF // CLKO Enable

#pragma config FPBDIV   = DIV_8 // Peripheral Clock divisor

#pragma config FCKSM    = CSDCMD // Clock Switching & Fail Safe Clock Monitor

#pragma config WDTPS    = PS1 // Watchdog Timer Postscale

#pragma config FWDTEN   = OFF // Watchdog Timer 

#pragma config FPLLIDIV = DIV_2 // PLL Input Divider

#pragma config FPLLMUL  = MUL_16 // PLL Multiplier

#pragma config UPLLIDIV = DIV_2 // USB PLL Input Divider

#pragma config UPLLEN   = OFF // USB PLL Enabled

#pragma config FPLLODIV = DIV_1 // PLL Output Divider

#pragma config PWP      = OFF // Program Flash Write Protect

#pragma config DEBUG    = OFF // Debugger Enable/Disable

    

#endif




/* ------------------------------------------------------------ */

/* Global Variables                */

/* ------------------------------------------------------------ */


//***FLAGS***//

char done_parking;

char parck;

char object2;

char object1;

char right_flag=0;

char left_flag=0;

char btn_flag=0;


//*** Counters***//

char few_reads;

int i=0;

int tur=0;

int rot=0;

unsigned int rightSensorA_impulseCount=0;

//The Hall sensors on both motors provide electrical pulses.

unsigned int leftSensorA_impulseCount=0;

//all pulses are counted, and used to calculate distances

//★The permanent magnets placed on the rotating shaft will interact with the Hall sensor, and square wave will be generated.



unsigned int old_rightCount=0;

unsigned int old_leftCount=0;

//these variabiles are used for the motor syncronize algorithm

//***Distances***//

unsigned int dist=0; //will hold the value of the distance between two objects, in order to decide if the car fits or not

int dmin_1; //will hold the minimum distance between the car and the object 

        int dmin_2; //(this helps when the surface of the object is irregular)

int d; // "d"[cm]-> is the distance obtained with a math function : get_function()

    int a; // "a"    -> holds the value provided by the Analog_To_Digital_Converter


int get_distance(void) //transform the result from ADC in a value that represents centimeters

{

d=((9500/(3*a+80))*(5/3))-3; // d=[cm]

return d;

}



void Delay(int dly)   //1ms if dly=1

{

TMR4=0;

T4CON=0x8070;

PR4=0xffff;

while(TMR4 < dly*16); 

}


void angle(int ang) //used when steering

{   tur=0;

rot=2*(3*ang)/7.78;

while(tur<=rot);

}


void distance(int dis) //based on the wheel diameter, this function indicates the distance that the car has to make

{   tur=0;

rot=dis*2.69;

while(tur<=rot);

}



//*** Movement commands***//


void speed(int sp) //sets the PWM Duty Cycle. 

{ //The range of sp is: 0...9999

OC2R=sp;

OC2RS=sp;

OC3R=sp;

OC3RS=sp;

}


void speed_and_direction(int x,int dir)

{

if(dir==1)

{

prtMtrLeftDirSet  = (1<<bnMtrLeftDir); // Left Motor direction

prtMtrRightDirClr  = (1<< bnMtrRightDir); //Right Motor direction

}else if(dir==0)

{

prtMtrLeftDirClr  = (1<<bnMtrLeftDir); //Left Motor direction

prtMtrRightDirSet  = (1<< bnMtrRightDir); //Right Motor direction

}


speed(x);


}


void go_forward(int dx)

{


//  }

prtMtrLeftDirSet   = (1<<bnMtrLeftDir); //    }=> car goes forward (the DC motors are antiparallel)

prtMtrRightDirClr  = (1<< bnMtrRightDir); //  }

speed(5000);

right_flag=1;

distance(dx);

right_flag=0;

speed(0);

}


void go_back(int dy)

{


prtMtrLeftDirClr  = (1<<bnMtrLeftDir);

prtMtrRightDirSet = (1<< bnMtrRightDir);

speed(5000);

right_flag=1;

distance(dy);

right_flag=0;

speed(0);

}


void stop(int brk) //used to slow down, until the car stops

{

for(i=brk;i>=0;i--)

speed_and_direction(i,1);


}


void go_right(int d_right)

{


// Left Motor direction

prtMtrLeftDirClr  = (1<<bnMtrLeftDir);


//Right Motor direction

prtMtrRightDirSet  = (1<<bnMtrRightDir);

OC2R=0;

OC2RS=0;

OC3R=5000;

OC3RS=5000;


right_flag=1;

angle(d_right);

right_flag=0;

speed(0);

}


void go_left(int d_left)

{

// Left Motor direction

prtMtrLeftDirClr  = (1<<bnMtrLeftDir);

//Right Motor direction

prtMtrRightDirClr  = (1<<bnMtrRightDir);

OC2R=5000;

OC2RS=5000;

OC3R=0;

OC3RS=0;

left_flag=1;

angle(d_left);

left_flag=0;


speed(0);

}


//*** Interrupt Service Routines***//


void __ISR(_INPUT_CAPTURE_3_VECTOR,ipl1) IC3_Interrupt_handler(void)

{

asm("ei");

rightSensorA_impulseCount++;

if(right_flag==1)

{

tur++;

mIC3ClearIntFlag(); 

}//end IC3 handler


void __ISR(_INPUT_CAPTURE_2_VECTOR,ipl1) IC2_Interrupt_handler(void)

{

asm("ei");

leftSensorA_impulseCount++;

if(left_flag==1)

{

tur++;

}

if(dist>0)

{

dist++;

}

if(dist >= 95 && btn_flag==1) 

{

parck=fTrue;

}

if(dist >=140  && btn_flag==2) 

{

parck=fTrue;

}


mIC2ClearIntFlag(); 

}//end IC2 handler


void __ISR(_TIMER_1_VECTOR, ipl1) Timer1_Interrupt_handler(void)

{

asm("ei");

if( right_flag==0 && left_flag==0 )

{

if( (leftSensorA_impulseCount-old_leftCount) < (rightSensorA_impulseCount-old_rightCount) )

{

OC3R-=50;

OC3RS-=50;

}

else if( (leftSensorA_impulseCount-old_leftCount) > (rightSensorA_impulseCount-old_rightCount) )

{

OC3R+=50;

OC3RS+=50;

}

}

old_rightCount=rightSensorA_impulseCount;

old_leftCount=leftSensorA_impulseCount;


mT1ClearIntFlag();

}//end T1 handler



//***All stars here***//


main(void)

{

    

//---INITIALIZATIONS---//


init_all();

parck=fFalse;

done_parking=fFalse;

object1=fFalse;

object2=fFalse;

a=0;

d=0;

dmin_1=0;

dmin_2=0;

// Enable multi-vector interrupts.

INTEnableSystemMultiVectoredInt();

 

initADC( 0xfffe); 

TRISB=0x00ff;

IC2CON=0x8081;

IC3CON=0x8081;



mIC3ClearIntFlag(); 

mIC3SetIntPriority( 1);

mIC3IntEnable( 1);


mIC2ClearIntFlag(); 

mIC2SetIntPriority( 1);

mIC2IntEnable( 1);

mT1ClearIntFlag(); 

mT1SetIntPriority(1);

mT1IntEnable(1);


INTEnableInterrupts();


LATBbits.LATB10=0;

LATBbits.LATB11=0;

LATBbits.LATB12=0;

LATBbits.LATB13=0;

//starts searching for a parking space



while (1)

{

if(button1==1)

{

Delay(20);

if(button1==1)

{

btn_flag=1;

Delay(2000);

speed_and_direction(4000,1);

T1CON=(1<<15);

}

}

if(button2==1)

{

Delay(20);

if(button2==1)

{

btn_flag=2;

Delay(2000);

speed_and_direction(4000,1);

T1CON=(1<<15);

}

}

while( !done_parking && btn_flag )

{

a=readADC();

d=get_distance();

if(d>0 && d<=15)

{

dmin_1=d;

while(d>0 && d<=15)

{

LATBbits.LATB10=1;

if(d<dmin_1) dmin_1=d;

a=readADC();

d=get_distance();

}

object1=fTrue;

LATBbits.LATB11=1;

speed(2500);

dist=1;

}//end if


a=readADC();

a=readADC();

a=readADC();

d=get_distance();


if(d>0 && d<=15 && object1) 

{

few_reads=3;

dmin_2=d;

while(few_reads>=0)

{

a=readADC();

d=get_distance();

if(dmin_2<d)dmin_2=d;

few_reads--;

}

LATBbits.LATB12=1;

object2=fTrue;

}

if (parck && object2)

{

dist=0;

parck=fFalse;

T1CON&=0x7fff;

speed(0);

Delay(500);

if(btn_flag==1)

{

go_back(9); //cm

Delay(500);

go_left(140);

Delay(500);

go_back(dmin_2);//cm

Delay(500);

go_right(170);

Delay(500);

go_forward(14);//cm

}else if(btn_flag==2)

{

go_back(4);

Delay(800);

go_left(70);

Delay(800);

go_back(1.41*dmin_2+16);//cm

Delay(800);

go_right(100);

Delay(800);

go_forward(20);//cm

}

done_parking=1;

}else if(object2)

{

dist=0;

object2=0;

dmin_1=dmin_2;

speed(4000);

}

}// end while(!oparcat)

}//end while(1);

}//end main

▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲


Posted by ElectricShock
:
BLOG main image
잡동사니들(지극히 개인취향인...) (다른글에도 댓글 부탁해요♥) You May Leave English Messages on GuestBook. by ElectricShock

공지사항

카테고리

분류 전체보기 (782)
Programming(=프로그래밍) (3)
MiDi (2)
Animation (4)
Blender (3D Graphic Program.. (10)
Blendtuts.com (Series) (1)
Blender 기초 팁들 (2)
Processing (디지털미디어과) (2)
Music (1)
Books in the world (0)
Communication(CAN, UART, et.. (12)
MCU Examples (PIC 기반) (7)
Transistor (1)
Mikro C Pro (11)
Mikro Pascal (1)
Proton IDE (0)
Robot (0)
Swift 3D (1)
Dummies Series (1)
All about Hacking (0)
제2 외국어 (1)
PIC 해외서적들 (3)
AVR (25)
PIC (MikroC) (MPLAB) (4)
Assembly (2)
ARM (3)
Arduino (26)
PSpice (1)
Proteus ISIS (14)
CodeVision (2)
FPGA (15)
MPLAB (24)
PCB (the Procedure) (15)
3D Printer (5)
PICKIT3 (6)
Matlab (11)
RaspBerry PI (15)
BeagleBone (1)
Android Studio (17)
졸업작품 (172)
Korea History (0)
Issue(사회) (73)
Multimeter 리뷰 (1)
Oscilloscope (1)
A (34)
B (19)
J (6)
C (32)
P (12)
T (37)
H (12)
I (12)
M (44)
R (5)
E (5)
F (2)
D (9)
O (2)
L (7)
S (9)
W (2)
V (6)
G (14)
Visual C++ or Visual Studio (2)
Android App Development (0)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백