TODOPIC
Otros Microcontroladores / Dispositivos programables => Arduino => Mensaje iniciado por: Bukanan en 16 de Septiembre de 2015, 12:54:00
-
Hola a todos, haber si me podeis ayudar por aqui. Necesito una señal PWM a una frecuencia de 56.5 Hz y un periodo de 17,7ms y con un duty cycle que va del 90% al 92%, es decir, va de 15.93 ms a 16,3ms aprox. La cuestion es que el duty cycle lo tiene que controlar una emisora RC que funciona a otra frecuencia exactamente 62,5 Hz y un periodo de 16ms con un duty cycle que va de 1ms a 2 ms. He escrito algo de codigo para generar la señal y mas o menos consigo ver la señal en el osciloscopio pero no consigo que varie el ciclo de trabajo. Os pego el codigo.
=================================================================
static const int pin_in = 2; // pin entrada emisora
static const int pinPWM = 9; // pin salida señal
unsigned long duty = 0;
int escalado = 0;
int iteraciones = 1922; // con estas iteraciones tenemos T = 17.7ms y F = 56,5 Hz
int umbral = 0; //iteraciones / 11; // variando en +- 1 o 2 unidades el divisor se tendria la variacion del duty deseado
int cont = 0; // pero no consigo hacerlo de una forma dinamica
boolean estado = 0;
void setup() {
Serial.begin(9600);
pinMode(pin_in,INPUT);
pinMode(pinPWM, OUTPUT);
}
void loop(){
duty = pulseIn(pin_in,HIGH);
escalado = map(duty,1000,2000,10,13);
umbral = iteraciones/escalado;
if(cont > umbral)
{
estado = 1;
}
else
{
estado = 0;
}
digitalWrite(pinPWM, estado);
cont ++;
if (cont > iteraciones)
{
cont = 0;
}
====================================================================
Para calcular las iteraciones he generado una señal cuadrada al 50% escribiendo un valor alto y seguidamente una bajo en un pin para ver la frecuencia maxima de salida del pin. De ahi he cogido el tiempo en estado ON y he dividido el prediodo que quiero conseguir entre tiempo en estado ON de la onda cuadrada, es dedir, iteraciones= 17.7ms / T_ON.
En cuanto al codigo, es cencillo de entender, pero me gustaria buscar otra alternativa en los Timers si esto no me llega a funcionar bien.
Por otra parte, he estado leyendo por ahi que el Timer 1 de Arduino tambien se utiliza para generar señales de frecuencia y/o duty cycle variables pero no controlo los Timers, aunque parece que no es muy dificil, pero me lio.
Os agradeceria vuestra ayuda.
posdata: No se si he cometido algun error a la hora de publicar en el foro, si es asi, pido disculpas por adelantado.
Gracias.