void pwm_duty (int8 p1, int8 p2) { pwm1_duty_percent = p1; set_pwm1_duty (percent_to_pwm (p1)); pwm2_duty_percent = p2; set_pwm2_duty (percent_to_pwm (p2)); }
void main() { setup_timer_2(T2_DIV_BY_16,255,1); //4.0 ms overflow, 4.0 ms interrupt setup_ccp1(CCP_PWM); setup_ccp2(CCP_PWM); set_pwm1_duty((int16)200); set_pwm2_duty((int16)200); enable_interrupts(INT_SSP); enable_interrupts(GLOBAL); SET_TRIS_B(0); stop(); //delay_ms(500); while(TRUE) { if(hasCommand) { hasCommand= FALSE; if(buffer[0] == 's'){ show(); } else switch(buffer[1]) { case 1: go_forward(); break; case 2: go_backward(); break; case 3: turn_right(); break; case 4: turn_left(); break; case 5: stop(); break; default : break; } } } }
//Incluye las cabeceras antes descritas void main(){ //Rutina principal output_high(LED); //Enciende el LED indicador lcd_init(); //Rutina de incializacion del LCD lcd_putc("\fListo \n"); //Despliega el mensaje "Listo" en el LCD setup_adc_ports(AN0); //Fija el pin 0 del puerto A como entrada analogica setup_adc (adc_clock_internal); //El tiempo para la conversion AD esta dado por el oscilador //interno set_adc_channel(0); //El puerto AD activo es el 0 enable_interrupts(INT_EXT); //Habilita la interrupcion externa en RB0 ext_int_edge(L_to_H); //Fija la interrupcion por flanco de subida. setup_timer_2(T2_DIV_BY_16,129,16); //El tiempo de oscilacion del timer 2 sirve tanto para la //interrupcion por timer2 como para el PWM. setup_ccp1(CCP_PWM); //Da de alta el modulo CCP1 como PWM //y lo inicializa en duty cycle 0 set_pwm1_duty(0); setup_ccp2(CCP_PWM); //Da de alta el modulo CCP2 como PWM //y lo inicializa en duty cycle 0 set_pwm2_duty(0); enable_interrupts(GLOBAL); //Habilita las interrupciones globales output_low(LED); //Apaga el led antes encendido. while(TRUE){ //Esta rutina espera a la interrupcion y parpadea el LED //indicador output_low(LED); delay_ms(100); output_high(LED); delay_ms(100); } }
void main() { setup_adc_ports(NO_ANALOGS); setup_adc(ADC_CLOCK_DIV_2); setup_psp(PSP_DISABLED); setup_spi(SPI_SS_DISABLED); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DIV_BY_16,155,1); setup_ccp1(CCP_PWM); setup_ccp2(CCP_PWM); set_pwm1_duty(312); // Inicia el Ciclo de Trabajo PWM1 en 50%. set_pwm2_duty(312); // Inicia el Ciclo de Trabajo PWM2 en 50%. setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); set_tris_a(0b11100000); // set_tris_c(0b10000000); //Pone RC7 como input y RC6 como output (y de 5 a 0 también) set_tris_b(0b00000000); // Habilita como salidas los pines B0, B1,...,B7 set_tris_e(0b010); // ************************ CONFIGURACIÓN PWM1 y PWM2: ************************ int32 brillo=0; int32 exposicion=500; //Tiempo de exposición de la cámara en [ms] int32 der_steps=0; int32 izq_steps=0; int32 led=0; int32 motor=0; int32 direccion=0; int32 pasos=0; int32 velocidad=0; char leido_pantalla[5]; output_low(PIN_B0); output_low(PIN_B1); output_low(PIN_B2); output_low(PIN_B3); output_low(PIN_B4); output_high(PIN_B6); // Siempre en 5V para conectar pull up 10kOhm de RA4 para SLEEP MOTOR 3 (altura) set_pwm1_duty(0); // Mantiene Ciclos en 0 para reducir consumo al iniciar. set_pwm2_duty(0); //*************** INICIO *************** while(true) { char seleccionar=0; output_low(PIN_A2); output_low(PIN_A3); output_low(PIN_A4); printf("Set parameters: e=exposicion(%Ld), v=velocidad(%Ld)\n\r",exposicion,velocidad); printf(" b=brillo(%Ld), d=direccion(%Ld), p=pasos(%Ld)\n\r",brillo,direccion,pasos); printf(" l=led(%Ld), m=motores(%Ld) \n\r",led,motor); seleccionar=getc(); switch(seleccionar) { case 'v': printf("Ingrese Velocidad en [ms] y [ENTER]\n\r"); fgets(leido_pantalla); velocidad=atoi32(leido_pantalla); break; case 'e': printf("Ingrese tiempo de exposicion en [ms] y [ENTER]\n\r"); fgets(leido_pantalla); exposicion=atoi32(leido_pantalla); break; case 'b': printf("Ingrese Ciclo de Trabajo para PWM1 (0-100) (brillo) y [ENTER]:\n\r"); fgets(leido_pantalla); brillo=atoi(leido_pantalla); set_pwm1_duty(brillo*20000000/(100*2000*16)); set_pwm2_duty(brillo*20000000/(100*2000*16)); break; case 'l': printf("Ingrese Led a encender: 0 a 7 y [ENTER]\n\r"); fgets(leido_pantalla); led=atoi32(leido_pantalla); break; case 'd': printf("Ingrese direccion 1=Derecha, 0=Izquierda y [ENTER]\n\r"); fgets(leido_pantalla); direccion = atoi32(leido_pantalla); break; case 'p': printf("Ingrese el numero de pasos a utlizar y [ENTER]\n\r"); fgets(leido_pantalla); pasos = atoi32(leido_pantalla); break; case 'm': printf("Ingrese el numero de motor a utlizar: 1,2 o 3 y [ENTER]\n\r"); fgets(leido_pantalla); motor = atoi32(leido_pantalla); break; case '1': led_on(led); break; case '2': led_off(); break; case '3': motor_move(motor,pasos,direccion); break; case '4': led_on_off(led,exposicion); break; case '5': int32 pasos_restantes; int32 steps; int dir; dir = direccion; steps = pasos; pasos_restantes = pasos; motor_on(motor); while(pasos_restantes > 0){ printf("pasos_restantes: %Ld\n\r",pasos_restantes); delay_us(200); steps = motores4(pasos_restantes,dir,velocidad); pasos_restantes = pasos_restantes - steps; if (pasos_restantes <=0) break; delay_us(200); dir = (dir == 0)?1:0; motores2(2000,dir); } break; case '6': int32 pasos_restantes2; int32 steps2; int dir2; dir2 = direccion; steps2 = pasos; pasos_restantes2 = pasos; motor_on(motor); while(true){ printf("pasos restantes: %Ld\n\r",pasos_restantes2); delay_us(200); steps2 = motores4(pasos_restantes2,dir2,velocidad); delay_us(200); dir2 = (dir2 == 0)?1:0; motores2(2000,dir2); pasos_restantes2 = pasos_restantes2 - steps2; if (pasos_restantes2 <=0) pasos_restantes2 = pasos; } break; case '7': int32 steps3; motor_on(motor); steps3 = motores4(pasos,direccion,velocidad); if (steps3 - pasos < 0){ direccion = (direccion == 0)?1:0; motores2(2000,direccion); delay_us(200); motores3(2147483640,direccion); direccion = (direccion == 0)?1:0; motores2(2000,direccion); } break; case '8': printf("Setup Calibracion Quick\n\r"); motor_on(motor); motores3(2147483640,DERECHA); delay_us(200); motores2(2000,IZQUIERDA); delay_us(200); izq_steps = motores3(2147483640,IZQUIERDA); delay_us(200); motores2(2000,DERECHA); delay_us(200); der_steps = motores3(2147483640,DERECHA); printf("izq_steps ->%Ld<- \n\r",izq_steps); printf("der_steps ->%Ld<- \n\r",der_steps); while(true){ motores2(izq_steps,IZQUIERDA); delay_us(200); motores2(der_steps,DERECHA); delay_us(200); } case '9': printf("Setup Velocidad ...\n\r"); output_high(PIN_A4); motores2(2000,IZQUIERDA); delay_us(200); izq_steps = motores3(2147483640,IZQUIERDA); delay_us(200); motores2(2000,DERECHA); delay_us(200); der_steps = motores3(2147483640,DERECHA); printf("izq_steps ->%Ld<- \n\r",izq_steps); printf("der_steps ->%Ld<- \n\r",der_steps); motores4(izq_steps,IZQUIERDA,velocidad); delay_us(200); motores4(der_steps,DERECHA,200); delay_us(200); break; } } } //FIN MAIN
//Interrupcion por TIMER2 //Donde el ciclo de trabajo de los PWM se ajusta en relacion a la //temperatura actual y deseada void TIMER2_isr(void){ delay_us(20); //Espera el tiempo suficiente para el fin de conversion AD val=read_adc(); // El valor obtenido se guarda t=val*.5; // El sensor usado mantiene esta relacion funcional lcd_gotoxy(6,2); //Despliega el valor de la temperatura leido como valor OUT printf(lcd_putc,"OUT"); lcd_gotoxy(6,1); printf(lcd_putc,"%.2f",t); if (t<vn) { //Si la temperatura es menor a la deseada se definen "pasos" //proporcionales a la diferencia de temperaturas. STEPU=(vn-t); STEP2U=(vn-t); if (ds<MAX-STEPU){ //Aumentan el valor ds (duty cycle) en la electrobomba y //despliegan el aumento en el LCD ds=ds+STEPU; lcd_gotoxy(4,2); printf(lcd_putc,">"); lcd_gotoxy(10,2); printf(lcd_putc," +");} else if (ds2<MAX-STEP2U) { //Aumentan el valor de ds (duty cycle 2) en el calentador //y despliegan el aumento en el LCD ds2=ds2+STEP2U; set_pwm2_duty(ds2); lcd_gotoxy(10,2); printf(lcd_putc,"HT"); lcd_gotoxy(14,2); res=ds2; res=(res/MAX)*10; printf(lcd_putc,"%f",res); } else { lcd_gotoxy(10,2); //Si se da el caso que ningun valor puede ser aumentado //mas pues han llegado al limite, se despliega OL //(OVERLOAD) printf(lcd_putc,"OL"); } } else if (t>vn){ //Al contrario, si la temperatura es superior a la requerida //por el usuario, se reduce el ciclo de trabajo en pasos //proporcionales a la diferencia de temperaturas. if (ds>STEPD) { STEPD=(t-vn); ds=ds-STEPD; lcd_gotoxy(4,2); printf(lcd_putc,"<"); lcd_gotoxy(10,2); printf(lcd_putc," -");}} else if (t==vn){ lcd_gotoxy(4,2); printf(lcd_putc,"="); if (ds2>2) { ds2=ds2-1; set_pwm2_duty(ds2); lcd_gotoxy(10,2); printf(lcd_putc,"CD"); lcd_gotoxy(14,2); res=ds2; res=(res/MAX)*10; printf(lcd_putc,"%f",res);} else{ //Al alcanzar la temperatura deseada el controlador //despliega "i" de idle lcd_gotoxy(10,2); set_pwm2_duty(0); printf(lcd_putc," i"); lcd_gotoxy(14,2); printf(lcd_putc," ");} } set_pwm1_duty(ds); lcd_gotoxy(14,1); res=ds; res=(res/MAX)*10; printf(lcd_putc,"%f",res); }