TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: newells5 en 24 de Marzo de 2006, 10:39:00
-
Bueno os cuento lo que pasa...
Tengo que hacer un programa que dependiendo del estado de 8 interruptores varie la velocidad de un motor de corriente continua, y tengo que hacerlo con el PWM.
Este ejercicio ya le hice en assembler y funcionó perfectamente pero en C soy incapaz de hacerle andar.
Yo me manejo bastante bien en ensamblador pero quiero aprender C y me cuesta, ya que hago las cosas con instrucciones en C pero sigo pensando con 1 y 0.
Aqui os dejo el código que he hecho, que yo creo que no hace falta más, pero no se... tampoco pondria la mano en el fuego.
#include "C:SJD2OSCARPIC C 5 velocidad motorPWM.h"
#byte PORTB = 0x06
void main()
{
int B;
set_tris_B(11111111);
set_tris_C(11111011);
SET_TIMER2(0xAA);
SETUP_TIMER_2(T2_DIV_BY_4,0xF0,1);
SETUP_CCP1(CCP_PWM);
do{
B = PORTB;
SET_PWM1_DUTY(B);
}while(true);
}
-
Me parece que va a funcionar.
Sólo leerá el estado de los interruptores una vez, el programa no es cíclico. Tienes que reiniciar el PIC o cortarle la energía para que se cambie la velocidad del motor.
Talvez si agregas...
while(1)
{
B=PORTB;
SET_PWM1_DUTY(B);
}
Eso leerá el puerto B y actualizará la velocidad del motor.
Si no te interesa que el motor actualice su velocidad, el programa está bien.
Otra cosa, talvez quieras subir el pwm.h que estás incluyendo, ese no lo he visto.
-
ya me di cuenta del bucle, lo edite a la vez que respondiste ^_^
en el PCW.h solo tengo los fuses y la frecuencia
#include <16F877.h>
#FUSES NOWDT, XT, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
P
:: con el bucle creado sigue sin rular...
-
Ya me acordé... la instrucción...
SET_PWM1_DUTY(B);
utiliza un dato del tipo de 16bits.
Declara B como int 16:
int16 B;
Prueba y avísame que pasa.
-
No sus lo vais a creer, estoy empleando 3 tarjetas, una con un motor, otra con interruptores y la picdem.
me faltaba referenciar la masa de los interruptores.... lalalalala
-
He probado con "int" y con "long int" y funciona exactamente igual.
Voy a seguir haciendo ejercicios en C con CCP en comparacion, si me atasco me asomo x aki 


-
Solo se me ocurre que los cálculos de tu PWM estén mal.
O la conexión de tu motor ande fallando.
O que haya que hacer un casting...
B=(int16)PORTB;
¿Qué es exactamente lo que hace?
-
Que ya esta solucionado, funciona perfectamente, el problema (a parte de que no hice el bulce) es que no habia referenciado la masa de la tarjeta de los interruptores.
El ejercicio funciona perfectamente. Ahora estoy haciendo lo mismo pero metiendo el valor al PWM con un potenciómetro a traves del conversor A/D.
-
Ahh pensaba que no funcionaba. Qué bien.
-
Arriba esta el programa para controlar la velocidad de un motor CC dependiendo del estado de 8 interruptores. Aqui os dejo el siguiente que he hecho, que es tambien para controlar la velocidad de un motor CC, pero esta vez con un potenciometro.
Ya se que es muy basico y tal, pero si a alguien le interesa, pos ahi lo tiene...
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
///// /////
///// Hacer un programa que varie la velocidad de un motor de CC dependiendo /////
///// del estado de un potenciometro. Emplear el conversor A/D y el PWM. /////
///// /////
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
#include "C:SJD2OSCARPIC C 7 ADC2ADC02.h" //fuses y frecuencia de reloj
#include <lcd_picdem.c> //libreria del LCD
void main() //PROGRAMA PRINCIPAL
{
unsigned int i = 0x00;
float const c = 5.0/256.0; //constante para la conversion A/D
float final;
set_TRIS_C(11111011); //RC2 salida
SETUP_CCP1(CCP_PWM); //CCP1 como PWM
SET_TIMER2(0xAA); //cargo 0xAA en el timer 2
SETUP_TIMER_2(T2_DIV_BY_4,0xF0,1);
RA0_ANALOG;
setup_ADC(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
delay_us(50);
do
{
i = read_adc(); //lee el valor del potenciometro
final = i*c; //pasa el valor a un rango de 0 a 5
lcd_init();
lcd_gotoxy(1,1);
printf(lcd_putc,"Valor: %u",i); //muestro la lectura 0-256
lcd_gotoxy(1,2);
printf(lcd_putc,"%fV",final); //muestro la lectura 0-5
SET_PWM1_DUTY(i); //cargo el valor 0-256 al PWM
delay_ms(100);
}while(true);
}
El archivo ADC02.h
#include <16F877.h>
#FUSES NOWDT, XT, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)