TODOPIC
Simuladores, editores de PCB, etc => Simuladores de circuitos => Proteus ISIS => Mensaje iniciado por: Fulguitron en 26 de Noviembre de 2013, 03:18:48
-
Buenos días, estoy comenzando a mirar el tema de los acelerómetros y no encuentro la librería del MMA7260 ni ningún acelerómetro en proteus. He buscado en San Google y no hay manera. Tengo el Proteus 8, alguien sabe donde están o como los puedo conseguir???
Muchas gracias.
-
No se si habra, pero yo supongo que no es facil simular un acelerometro virtual. Un pulsador es facil de simular, pero un acelerometro... ¿como haces para moverlo? A lo mejor no tiene mucho sentido. Prueba a usar un componente que te de la misma salida que un acelerometro.
-
Hola, Simularlo es muy sencillo, sólo basta con poner un potenciómetro y en los extremos le colocas dos voltajes, a un lado le pones una fuente DC con 1.3V al otro lado le pones otra fuente DC con 1.9V, el cursor del potenciómetro es la salida.
Saludos.
-
Bueno bueno, perdón por mi ignorancia pero no me salgo, he hecho esta simulación pero me da a mi que no es lo que quiero (más bien porque no funciona)
(http://thumbs.subefotos.com/dbcad3dc116c76250310db3278a1bbc9o.jpg) (http://subefotos.com/ver/?dbcad3dc116c76250310db3278a1bbc9o.jpg)
Alguna pista de como hacer ese potenciómetro con los voltajes???
Muchas gracias y muy agradecido como siempre.
-
Ensaya con esto.
Saludos
-
Muchas gracias por la foto y el ejemplo, pues ya lo he puesto en mi proyecto y ahora si que todo funciona. Os paso una fotito de lo que he hecho.
(http://thumbs.subefotos.com/4c4c7c94c23cdc15b8e6f3b363524994o.jpg)
Simplemente quiero manejar un servo mediante pulsos a traves de una resistencia variable. Pero siguen mis problemas, por más que miro no se que pasa pero aunque la resistencia se mueve y el lcd lee la mediciçon , el ancho del pulso del servo no cambia. Por que?? Os paso el código por si alguno le ve algo. No seais muy críticos con el código, empiezo con C y basicamente son un par de programas que he cazado por internet y los he modificado a mis posibilidades.
Como siempre, muyyyyyyyyyyyyyyyyyy agradecido.
#use delay(clock=4000000)
#include <LCD.C>
void main()
{
setup_adc_ports(AN0); //Canal 0 analógico
setup_adc(ADC_CLOCK_INTERNAL); //Fuente de reloj RC
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
setup_adc_ports(AN0); //Canal 0 analógico
setup_adc(ADC_CLOCK_INTERNAL); //Fuente de reloj RC
output_low(PIN_C2); //CCP1
setup_ccp1(CCP_PWM);
setup_timer_2(T2_DIV_BY_16, 255, 1);
int16 q;
float p;
lcd_init();
for (;;) {
set_adc_channel(0); //Habilitación canal0
delay_us(20);
q = read_adc(); //Lectura canal0
p = 5.0 * q / 1024.0; //Conversión a tensión
printf(lcd_putc, "\fADC = %4ld", q);
printf(lcd_putc, "\nVoltage = %01.2fV", p);
delay_ms(100);
}
while(1)
{
for(q=0; q < 255)
{
set_pwm1_duty(q);
delay_ms(5);
}
}
}
-
lo primero que veo es que en tu ciclo for te falta incrementar q
for(q=0; q < 255; q++)
-
Buenos días, gracias Rivale por el dato, estoy todavía muy pez en esto del C++ y es cierto, a la secuencia for le faltaba algo. Lo que pasa es que al ponerlo no me hacía el efecto que quería. Ahora, lo que he hecho es simplificar más el código y el esquema para no complicarme la vida y la cosa empieza a ir mejor. Actualmente el motor ya se mueve por pulsos y dependiendo de la resistencia se mueve más o menos. :( :( pero mis problemas siguen, ahora me falta optimizar los tiempos del timer para que el motor vaya de parado al 100% de su velocidad y no me salgo.
Os cuelgo mi código y una foto del esquema al que he añadido un puente h para el movimiento del motor.
Creo que ya me falta poco para conseguirlo.
Como siempre, muy agradecido por las respuestas.
#include "F:\Monobike\Programa\Monobike 281213.h"
#use delay(clock=4000000)
void main()
{
setup_adc_ports(AN0); //Canal 0 analógico
setup_adc(ADC_CLOCK_INTERNAL); //Fuente de reloj RC
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
setup_adc_ports(AN0); //Canal 0 analógico
setup_adc(ADC_CLOCK_INTERNAL); //Fuente de reloj RC
output_low(PIN_C2); //CCP1
setup_ccp1(CCP_PWM);
setup_timer_2(T2_DIV_BY_16, 255,1);
int P;
set_adc_channel(0); // elegimos el canal que vamos a leer.
output_low(PIN_C2);
while(1)
{
P=read_adc(); // leemos la tension en el canal que elegimos.
set_pwm1_duty(P);
}
}
(http://thumbs.subefotos.com/88f9a2e03415d10fe2dc3e9840a6082bo.jpg)
-
Cual es el error que tienes, como se comporta?, no alcanzo a ver bien tu diagrama, lo podrías poner mas grande. aunque te recomiendo que uses alguno de los integrados de puente H, como el L293 o el L298
lo que veo en tu código es que tienes algunas intrucciones repetidas, pero eso no debería afectar, otra cosa que veo es que lees el puerto ADC constantemente dentro de tu while, te recomiendo ponerle un retardo entre cada actualización.
Saludos
-
Muchas gracias rivale por tus consejos. Efectivamente habían cosas duplicadas y las he eliminado (creo que también puedo eliminar algo más, pero no me preocupa y no quiero tocar lo que no debo) Además, he puesto un delay para que no esté constantemente leyendo y la verdad es que el programa va cogiendo forma. Perdón por la foto, pero intentaré buscar otro sitio a ver si la hago más grande, aunque te adelantaré que si he usado un puente H (aunque en la foto apensa se aprecia) y la verdad es que el programa ha mejorado bastante.
Ahora solo me falta mejorar los tiempos para que el motor vaya de parado al máximo, actualmente va de muy lento a rápido, pero no se como mejorarlo. Como siempre os paso el código y una foto del esquema.
#include "F:\Monobike\Programa\Monobike 281213.h"
#use delay(clock=4000000)
void main()
{
setup_adc_ports(AN0); //Canal 0 analógico
setup_adc(ADC_CLOCK_INTERNAL); //Fuente de reloj RC
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
output_low(PIN_C2); //CCP1
setup_ccp1(CCP_PWM);
setup_timer_2(T2_DIV_BY_16, 255,1);
int P;
set_adc_channel(0); // elegimos el canal que vamos a leer.
output_low(PIN_C2);
while(1)
{
P=read_adc(); // leemos la tension en el canal que elegimos.
delay_ms(5);
set_pwm1_duty(P);
}
}
(http://sia1.subirimagenes.net/img/2014/02/18/140218092031290300.jpg)
Ahora si se ve bien, quizás un poco grande, la próxima la mejoro :) :) :)
-
no entiendo bien a que te refieres con mejorar los tiempos para que vaya de parado al máximo. la velocidad se la asignas desde lo que lees del ADC, el cual viene de un potenciómetro, entonces el tiempo para que pase del mínimo al máximo depende de que tan rápido gires el potenciómetro.
-
A ver si se explicarme mejor. Mi intencion es que a un lado del potenciómetro el motor este parado y conforme voy moviendo el potenciómetro hacia el otro, el motor se va revolucionando hasta llegar a su máximo. Mi idea es hacer un robot equilibrista con el acelerómetro MMA7260, pero antes de liarme en serio deberia poder controlar un motor con pwm correctamente.
Rivale, he visto que has hecho uno a lo grande, algún consejo para alguien que empieza? Muy chulo tu trasto, poco a poco me leere tu mensaje que tiene un buen rato de lectura.
-
ha, ya entendí hacia donde vas.
puede que tengas algo de ruido en tu señal y por eso varia tu velocidad del motor, podrías hacer que se actualice cada segundo
tambien podrias enviar tu lectura del ADC a una lcd o hacía una hiperterminal.
esto te serviria como prueba, porque para hacer el robot equilibrista tienes que filtrar la señal del acelerómetro y combinarla con la de un giroscopio para evitar el ruido.
Espero nos cuentes como te va con tu proyecto y aca ando por si tienes dudas
Saludos
-
como? ruidos? giroscopios? jjajajaja ya veo que tengo faena por delante.de momento montare otra simulacion con una lcd y a ver que pasa. ya os irecontando.quizas hasta abra otro hilo con mis progresos.
un saludo a todos y especialmente a rivale.
-
el acelerómetro te mide la aceleración en todos sus ejes, por lo que es muy sensible a las vibraciones.
como adelanto te podría decir que solo con el acelerómetro no puedes medir la inclinación de un robot si este esta sujeto a aceleraciones diferentes a la de la gravedad, por eso se hace uso de un giroscopio que mide la velocidad angular.
Pero creo que podemos ver eso mas a detalle cuando termines tus pruebas con el acelerómetro
Saludos
-
Pues gracias por la info, no tenía ni idea de lo que hacía un giroscopio. De momento empezaré por poder controlar la señal del acelerómetro y verla a través de una LCD. El que mucho abarca poco hace, así que iremos poco a poco.
Muchas gracias por todo.
-
Para cerrar este hilo correctamente, por fin he empezado con el hardware y he creado un nuevo tema más acorde con el título con nuevas dudas y avances. Dejo el link por si alguien quiere echarle un vistazo, un saludo.
http://www.todopic.com.ar/foros/index.php?topic=43094.0 (http://www.todopic.com.ar/foros/index.php?topic=43094.0)