Sei sulla pagina 1di 12

Codigo en microc para un pic 18f4550

Teniendo en cuenta la secuencia de trabajo de la fuente clase E se diseñó un pwm teniendo en


cuenta la entrada análoga AN0 en el pin 33 de pic basado en esto se generan los pwm’s y teniendo
en cuenta los pulsadores en las diferentes entradas en el puertob se genean rutinas diferentes
para cada sentido de giro y para el freno

float valor , valor2 , valor3 ,error ,pwm;

int i,j,k,der,stop_der,izq,stop_izq;

void main() {

TRISD=0; //salida

ADCON1 =0X0B; //

TRISB=1; //salida

TRISC=1; //salida

PORTD=0; //limpia

PORTB=0; //limpia

stop_der=0;der=0;stop_izq=0;izq=0; //limpia

while(1){

i=0;

valor=ADC_READ(0)/10; //lectura adc 0

valor2=ADC_READ(1)/10; //lectura adc 1

valor3=ADC_READ(2)/4.2; //lectura adc 2

PORTC=valor3; //test canales

error=valor-valor2; //calculo del error

if(error<=0){pwm=valor+error;} //proporcional

if(error>0){pwm=valor-error;} //proporcional

if(PORTB==1){der=1;stop_der=0;stop_izq=0;izq=0;} //asigna permanente secuencia derecha


if(PORTB==2 && der==1){stop_der=1;der=0;stop_izq=0;izq=0;} //asigna permanente
secuencia izquierda

if(PORTB==2 && izq==1){stop_izq=1;izq=0;stop_der=0;der=0;}//freno

if(PORTB==4){izq=1;stop_der=0;der=0;stop_izq=0;}//freno

if(der==1){

PORTD.RD1=0;//transistor Q3

PORTD.RD2=1; //transistor Q2

PORTD.RD3=0; //transistor Q4

i=0;

while(i<valor){

PORTD.RD0=1; //transistor Q1 pwm on

DELAY_US(100);

i=i+1;

i=0;

while(i<valor){

PORTD.RD0=0; //transistor Q1 pwm off

DELAY_US(100);

i=i+1;

i=0;

/*PORTD.RD0=0;

DELAY_US(20); */

if(izq==1){
PORTD.RD0=0; //transistor Q1

PORTD.RD2=0; //transistor Q2

PORTD.RD3=1; //transistor Q4

i=0;

while(i<valor){

PORTD.RD1=1; //transistor Q3 pwm on

DELAY_US(100);

i=i+1;

i=0;

while(i<valor){

PORTD.RD1=0; //transistor Q1 pwm off

DELAY_US(100);

i=i+1;

/*PORTD.RD1=0;

DELAY_US(20);*/

if(stop_der==1){

PORTD.RD1=0;

PORTD.RD2=1;

PORTD.RD3=1;

PORTD.RD0=0;

}
if(stop_izq==1){

PORTD.RD1=0;

PORTD.RD2=1;

PORTD.RD3=1;

PORTD.RD0=0;

i=0;

Montaje simulado en proteus de la parte de control


Derecha

Freno

izquierda

Bb lo del pid no se si colocarlo por que eso no me cuadra bn pero si el nos dice que lo metamos e
hacemos eso mañana

int PWM_MOSFET = A0;

int PotenciometroMos = 0;

int ArranquePin = A1;

int Arranque = 0;
int DerechaPin = A2;

int Derecha = 0;

int FrenadoPin = A3;

int Frenado = 0;

int IzquierdaPin = A4;

int Izquierda = 0;

int S1_4 = 9;

int S2_3 = 10;

int S3 =11;

int S4 =12;

int Retardo = 10000;

int i=0;

int FactorDeArranque=1;

void setup() {

Serial.begin(9600);

pinMode(S1_4, OUTPUT);

pinMode(S2_3, OUTPUT);

pinMode(S3, OUTPUT);

pinMode(S4, OUTPUT);

void loop()
{

digitalWrite(S1_4, LOW);

digitalWrite(S2_3, LOW);

Derecha = digitalRead(DerechaPin);

Izquierda=digitalRead(IzquierdaPin);

Frenado = digitalRead(FrenadoPin);

PotenciometroMos = analogRead(PWM_MOSFET);

Arranque = analogRead(ArranquePin);

while (Derecha==1){

Arranque = analogRead(ArranquePin);

i=1;

for (i==1;i<=Arranque;)

digitalWrite(S1_4, HIGH);

delayMicroseconds(i);

digitalWrite(S1_4, LOW);

delayMicroseconds(Arranque - i);

i=i+FactorDeArranque;

Frenado = digitalRead(FrenadoPin);
Derecha=digitalRead(DerechaPin);

while (Frenado == 0) {

PotenciometroMos = analogRead(PWM_MOSFET);

digitalWrite(S1_4, HIGH);

delayMicroseconds(PotenciometroMos);

if (PotenciometroMos <= 1021) {

digitalWrite(S1_4, LOW);

delayMicroseconds(1023 - PotenciometroMos);

Frenado = digitalRead(FrenadoPin);

Derecha = digitalRead(DerechaPin);

if (Frenado == 1 ) {

if (Derecha == 0 && Izquierda == 0) {

digitalWrite(S3, HIGH);

delay(102);
digitalWrite(S3, LOW);

delay(100);

Frenado = digitalRead(FrenadoPin);

delayMicroseconds(Retardo);

while (Izquierda==1){

Arranque = analogRead(ArranquePin);

i=1;

for (i==1;i<=Arranque;){

digitalWrite(S2_3, HIGH);

delayMicroseconds(i);

digitalWrite(S2_3, LOW);

delayMicroseconds(Arranque - i);

i=i+FactorDeArranque;

Frenado = digitalRead(FrenadoPin);

Izquierda=digitalRead(IzquierdaPin);

while (Frenado == 0) {
PotenciometroMos = analogRead(PWM_MOSFET);

digitalWrite(S2_3, HIGH);

delayMicroseconds(PotenciometroMos);

if (PotenciometroMos <= 1021) {

digitalWrite(S2_3, LOW);

delayMicroseconds(1023 - PotenciometroMos);

Frenado = digitalRead(FrenadoPin);

Izquierda = digitalRead(IzquierdaPin);

if (Frenado == 1 ) {

if (Derecha == 0 && Izquierda == 0) {

digitalWrite(S4, HIGH);

delay(102);

digitalWrite(S4, LOW);

delay(100);

}
Frenado = digitalRead(FrenadoPin);

delayMicroseconds(Retardo);

int inputPin1 = 7; // pulsador 1

int inputPin2 = 12; // pulsador 2

int inputPin3 = 4; //pulsador 3

int ledPin = 13; //SALIDA TRANSISTOR UNO

int ledPin1 = 5; //SALIDA TRAMSISTOR DOS

int ledPin2 = 8; //SALIDA TRANSISTOR TRES

int ledPin3= 9;

void setup() {

pinMode(inputPin1, INPUT);

pinMode(ledPin1,OUTPUT);

pinMode(ledPin, OUTPUT);

pinMode(ledPin2, OUTPUT);

pinMode(ledPin3, OUTPUT);

void loop(){

if (digitalRead(inputPin1) == HIGH) {

while(digitalRead(inputPin1)==HIGH){

analogWrite(ledPin,analogRead(A1)/4);
}

else if (digitalRead(inputPin2) == HIGH) {

digitalWrite(ledPin, LOW);

if (digitalRead(inputPin3) == HIGH) {

while(digitalRead(inputPin3)==HIGH){

analogWrite(ledPin1,analogRead(A1)/4);

else if (digitalRead(inputPin2) == HIGH) {

digitalWrite(ledPin1, LOW);

Potrebbero piacerti anche