Mostrando entradas con la etiqueta NE555. Mostrar todas las entradas
Mostrando entradas con la etiqueta NE555. Mostrar todas las entradas

lunes, 22 de octubre de 2012

Diseño de un pulsador con C++

Diseño de un pulsador utilizando el circuito integrado NE555.

Categoría: 1. Programación y electrónica.

Se desarrolló un programa en C++ que calcula la frecuencia, el tiempo del ciclo o periodo (T, en s), el tiempo en HIGH (t1, en s) y el tiempo en LOW (t2, en s). Genera una tabla que se despliega en la consola de Visual C++ y al mismo tiempo genera un archivo, pulsda06.txt, con un formato separado por tabuladores. Este archivo de texto puede abrirse con el programa Excel, de manera que se pueden manejar sus valores para elaborar diferentes tipos de gráficos.
El diagrama del circuito es el siguiente:



Las ecuaciones de diseño según la hoja de datos para este circuito integrado son las siguientes:
t1 = 0.693*(RA+RB)*C
t2 = 0.693*(RB)*C
T = t1+t2 = 0.693*(RA+2RB)*C
f = 1.44 / (RA+2RB)*C
Output driver duty cycle = t1 / (t2+t1) = RB / (RA+2RB)

El programa se corre con un valor inicial de 2200ohm para Ra y termina con 10Mohm con incrementos de 50000ohm en cada ciclo. Para Rb se toma un valor inicial de 2200ohm y se incrementa en 1000ohm en cada ciclo. Se utilizó un capacitor de 2.2uF.
En el archivo de salida la primera columna corresponde al número de ciclo de cálculo, la segunda columna es el valor de Ra (ohm), la tercera columna es el valor de Rb (ohm), la cuarta columna es el valor de t1 (s), la quinta columna es el valor de t2 (s), la sexta columna es el valor de T (s), la séptima columna es el valor de f (s-1) y la octava columna es el valor del ciclo de trabajo (número fraccionario).
El código del programa es el siguiente:



// PulsadorNE555_04.cpp: define el punto de entrada de la aplicación de consola.
//
// PulsadorNE555_03.cpp: archivo de proyecto principal.
// despliega los valores de #corrida, Ra, Rb, t1, t2, T, freq y dutyCycle separados por punto y coma
// se trata que el archivo de texto pueda ser leido por el programa Excel con columnas
// separadas por tabulador

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
using namespace std;

int main() {
 float t1;
 float t2;
 float Time;
 float freq;
 float dutyCycle;
 float Ra = 2200;
 float Rb = 2200;
 float c = 0.0000022;
 int caso = 1;
 ofstream out("D:\\pulsda06.txt");
 while (Ra < 10000000)  {
 t1 = 0.693*(Ra + Rb)*c;
 t2 = 0.693*Rb*c;
 Time = t1+t2;
 freq = 1/Time;
 dutyCycle = (Ra + Rb) / (Ra + 2*Rb);

 cout << caso;
 cout << ";\t";
 cout << Ra;
 cout << ";\t";
 cout << Rb;
 cout << ";\t";
 cout << t1;
 cout << ";\t";
 cout << t2;
 cout << ";\t";
 cout << Time;
 cout << ";\t";
 cout << freq;
 cout << ";\t";
 cout << dutyCycle;
 cout << ";\n";
 // escribeArchivo:
 if (!out)  {
  cout << "cannot open file...\n";
  return 1; }
 out << caso;
 out << "\t";
 out << Ra;
 out << "\t";
 out << Rb;
 out << "\t";
 out << t1;
 out << "\t";
 out << t2;
 out << "\t";
 out << Time;
 out << "\t";
 out << freq;
 out << "\t";
 out << dutyCycle;
 out << "\n";
 Ra = Ra + 50000;
 Rb = Rb + 1000;
 caso++;  }
 out.close();
 system("pause");
 return 0; }

Para este ejemplo se registran 200 ciclos de cálculo que quedan guardados en el archivo pulsda06.txt. Este archivo se abrió desde Excel donde se generaron tres gráficos que se muestran a continuación:


 Gráfico 1. Valores de t1 y t2 en función del valor de Ra
 Gráfico 2. Valor de la frecuencia en función de Ra
Gráfico 3. Valor del ciclo de trabajo en función de Ra

Con los datos generados se puede obtener para un ciclo de 1.04s, un ciclo de trabajo de 0.978, con duración de t1 de 1.018s y t2 de 0.022s. Para ello se requiere valores de Ra= 652200ohm y para Rb= 15200ohm. El valor de f será de 0.96 s^-1.

Por lo pronto es todo. Saludos y hasta la próxima.

Referencias bibliográficas:
2010. Texas Instruments. NA555, NE555, SA555, SE555. Data Sheet. USA.
1998. STMicroelectronics NE555, SA555, SE555. Data Sheet. USA.
2004. Applied digital circuits: 555 timer, analog to digital (ADC) and digital to analog (DAC) conversion (DAC). University of California at Berkeley. Physics 111 Laboratory. Basic semiconductor circuits. Lab 11 & 12. USA.
http://www.bgsu.edu/departments/compsci/docs/write.html








sábado, 1 de septiembre de 2012

Registro de datos a una micro SD

Registro de un generador de pulsos a un archivo de texto (pulsedat.txt).

Categoría: 1. Programación y electrónica.

El programa generador de pulsos funciona registrando los momentos en que un generador de pulsos, un botón pulsador conectado a una resistencia de 10K o, como en este ejercicio, un circuito electrónico generador de pulsos. Este circuito está basado en un circuito integrado NE555 o NE556.

El circuito astable es como sigue:



El programa EjercicioPulseDat04 lee la salida digital del vibrador astable (pin 3 en el NE555 o pines 5 o 9 del NE556), registra en el monitor serial los tiempos de encendido (HIGH) y de apagado (LOW) utilizando la instrucción millis(); y también registra el número de pulsos acumulado. De esta manera es posible medir el tiempo de duración en HIGH y el tiempo de duración en LOW.
Estos mismos datos se registran en un archivo llamado pulsedat.txt, almacenado en la tarjeta de datos micro SD contenida en el Shield Ethernet de Arduino. Como se sabe, esta tarjeta va acoplada con la tarjeta electrónica Arduino UNO.

Las siguientes imágenes muestran la salida en el monitor serial y la ventana del ambiente Arduino con parte del programa a la vista.





El programa se desarrolló tomando como base el ejemplo 'state change detection' (edge detection) que proorciona el ambiente Arduino para la tarjeta electrónica Arduino UNO. También se utilizó parte del código del ejemplo 'datalogger' para la tarjeta Ethernet Shield.

/*
EjercicioPulseDat04
*/
/*
  State change detection (edge detection)

 Often, you don't need to know the state of a digital input all the time,
 but you just need to know when the input changes from one state to another.
 For example, you want to know when a button goes from OFF to ON.  This is called
 state change detection, or edge detection.

 This example shows how to detect when a button or button changes from off to on
 and on to off.

 The circuit:
 * pushbutton attached to pin 2 from +5V
 * 10K resistor attached to pin 2 from ground
 * LED attached from pin 13 to ground (or use the built-in LED on
   most Arduino boards)

 created  27 Sep 2005
 modified 30 Aug 2011
 by Tom Igoe
This example code is in the public domain.

 http://arduino.cc/en/Tutorial/ButtonStateChange

 */
#include <SD.h>
const int  buttonPin = 2;   
const int ledPin = 13;      
int buttonPushCounter = 0; 
int buttonState = 0;       
int lastButtonState = 0; 
File dataFile;
void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
  pinMode(10, OUTPUT);
 
    if (!SD.begin(4))  {
    Serial.println("card failed, or not present...");
    return;  }
  Serial.println("card initialized...");
 
  Serial.println("removing pulsedat.txt...");
  SD.remove("pulsedat.txt");
  if (SD.exists("pulsedat.txt"))  {
    Serial.println("pulsedat.txt exists...");  }
  else  {
    Serial.println("pulsedat.txt doesn't exist...");  }  }

void loop()
{
  buttonState = digitalRead(buttonPin);
  if (buttonState != lastButtonState)
  {
    if (buttonState == HIGH)
    {
      buttonPushCounter++;
      Serial.print("number of button pushes:  ");
      Serial.println(buttonPushCounter);
      Serial.print("time on= ");
      Serial.println(millis());
 
  dataFile = SD.open("pulsedat.txt", FILE_WRITE);
  if (dataFile) 
      {
    Serial.println("writing to pulsedat.txt...");
    dataFile.print("number of button pushes:  ");
    dataFile.println(buttonPushCounter);
    dataFile.print("time on= ");
    dataFile.println(millis());   
    dataFile.close();
    Serial.println("action done..."); 
      }
  else 
      {
    Serial.println("error opening pulsedat.txt"); 
      }   
    }
 
   
    else
      {
      Serial.print("time off= ");
      Serial.println(millis());
     
  dataFile = SD.open("pulsedat.txt", FILE_WRITE);
  if (dataFile) 
        {
    Serial.println("writing to pulsedat.txt...");
    dataFile.print("time off= ");
    dataFile.println(millis());
   
    dataFile.close();
    Serial.println("action done..."); 
        }
  else 
        {
    Serial.println("error opening pulsedat.txt"); 
        }
      }
 
  lastButtonState = buttonState;
  if (buttonPushCounter % 4 == 0)
      {
    digitalWrite(ledPin, HIGH);
      }
  else
      {
   digitalWrite(ledPin, LOW);
      }
  }
}
Este programa con algunas modificaciones puede adaptarse para medir variables de uno o más sensores (temperatura, humedad, presión atmosférica, intensidad lumínica, voltaje, etc) conectados a las entradas analógicas de la tarjeta electrónica.

Por lo pronto es todo. Saludos.

Bibliografía.

Stengel, Lester. 2006. El ABC de la electrónica. Steren Electrónica SA de CV. México.
Arduino. Sitio web: http://www.arduino.cc/. Consulta el 31 de julio de 2012.