TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: AceCaster en 09 de Noviembre de 2009, 14:46:11
-
Me presento soy Julian, estamos armando un proyecto final en el colegio, que es una maquina de hacer pizzetas automatizada, estamos usando el pic-16f877, y ademas de la programacion ya hecha nos estan pidiendo que hagamos el control de velocidad del motor de la cinta transportadora. Ya me han dicho que tengo que emplear interrupciones del programa, lei sobre el tema en PBP, pero me mezclo al querer aplicar el control de pwm con las mismas interrupciones. :oops:
Aca les dejo parte de la progragmacion y les indico donde quiero poner el control de velocidad con interrupciones:
TRISA=%111111
TRISB=%00000000
TRISC=%00000000
TRISD=%11111111
TRISE=%111
Inicio: if portA.0=1 then 'Detecta paraencender la cinta
portB.0=1 'Enciende la cinta
else goto Inicio 'Traba el programa hasta que detecta para encender la cinta
Sensado1: if portA.1=1 and portd.0=1 then 'Detecta en el primer sensor
portB.0=0 'Apaga la cinta
portB.1=1 'Enciende el circuito de volcado de ingradiente
esle goto Sensado1 'Traba el programa hasta que se detecte en el primer sensor
Digamos que siempre que la cinta este prendida quiero que haya interrupcion cada cierto tiempo que controle la velocidad con pwm, alli se encuentra mi problema.
Muchas gracias, espero respuesta, Julian!
-
Para ello debes utulizar el módulo CCP del PIC, este se encarga de generar la PWM, en la ayuda de MikroBasic y MikroC te muestran como utilizarlo más algunos ejemplos. Basicamente son las siguientes funciones las que debes utilizar:
PWM1_Init
PWM1_Set_Duty
PWM1_Start
PWM1_Stop
y aquí un código de ejemplo
unsigned short current_duty, old_duty, current_duty1, old_duty1;
void InitMain() {
ANSEL = 0; // Configure AN pins as digital I/O
ANSELH = 0;
PORTA = 255;
TRISA = 255; // configure PORTA pins as input
PORTB = 0; // set PORTB to 0
TRISB = 0; // designate PORTB pins as output
PORTC = 0; // set PORTC to 0
TRISC = 0; // designate PORTC pins as output
PWM1_Init(5000); // Initialize PWM1 module at 5KHz
PWM2_Init(5000); // Initialize PWM2 module at 5KHz
}
void main() {
InitMain();
current_duty = 16; // initial value for current_duty
current_duty1 = 16; // initial value for current_duty1
PWM1_Start(); // start PWM1
PWM2_Start(); // start PWM2
PWM1_Set_Duty(current_duty); // Set current duty for PWM1
PWM2_Set_Duty(current_duty1); // Set current duty for PWM2
while (1) { // endless loop
if (RA0_bit) { // button on RA0 pressed
Delay_ms(40);
current_duty++; // increment current_duty
PWM1_Set_Duty(current_duty);
}
if (RA1_bit) { // button on RA1 pressed
Delay_ms(40);
current_duty--; // decrement current_duty
PWM1_Set_Duty(current_duty);
}
if (RA2_bit) { // button on RA2 pressed
Delay_ms(40);
current_duty1++; // increment current_duty1
PWM2_Set_Duty(current_duty1);
}
if (RA3_bit) { // button on RA3 pressed
Delay_ms(40);
current_duty1--; // decrement current_duty1
PWM2_Set_Duty(current_duty1);
}
Delay_ms(5); // slow down change pace a little
}
}