Convertir entrada analogica de un pic en pulsos

amigos estoy tratando de convertir los valores que obtengo en una entrada analogica de un pic en pulsos es decir no en pwm sino pulsos para contar por un automata ,por ejemplo si obtengo un valor determinado ya convertido en digital asignarle un pulso ,al siguiente valor asignarle dos pulsos,al siguiente tres pulsos asi sucesivamente asta que termine la ultima lectura de la entrada analogica solo quiero que me den una idea de como sumar cada pulso,pues no puedo construir cada cantidad de pulsos pues por cada paso se incrementa un pulso y es asta 200 pulsos en total el final de la lectura bueno mis agradecimientos desde ya
 
No entiendo bien que es lo que querés hacer, lo que interpreto es esto:

Lees un valor del modulo AD, en base a ese valor das una determinada cantidad de pulsos en una salida del pic no?.

No quiero escribir demás por un error de interpretación mío, confirmame si es eso u otra cosa lo que querés hacer.
Saludos
 
es exactamente lo que usted entendio y muchas gracias por su atensión amigo le esplicare mas explisitamente mire voy a medir con un pic por una de sus entradas analogicas un valor de 0-5v porque el rango de trabajo es de 0-50 el span con una preccion de 0.25 ,entonces la conversion entre la entrada anaogica y la salida didigital es por conteo de pulsos en un interbalo de tiempo fijo con una sona de cilencio entre valores sucesivos este formato se envia de forma repetitiva es decir para 0v un pulso para 5v 200pulsos


volt #pulsos
0 1

0.5 21


1 41


1.5 61


5 200

creo que con esto entienda la idea y nuevamente gracias amigo
 
Ahora sí entiendo .

Ya que se trata de generar pulsos con un tiempo en on (1 lógico -> 5V) y en off (0 lógico->0V) lo primero que se me ocurre es utilizar un puerto serie del pic (síncrono o asíncrono, no importa).
Entonces cada pulso se podría formar escribiendo 01 en el registro de transmisión.

Por ejemplo si uso el modulo usart para mandar 4 pulsos tendría que escribir en TXREG 01010101; para mandar 3 pulsos 01010100; para dos 01010000; y para uno 010000000.
Primero se transmitirían de a 4 pulsos, luego de a 3, de a 2 y de a 1.

Supongamos que queremos transmitir 57 pulsos (por decir algo).
  • Cantidad de escrituras de 4 pulsos = 57 div 4 (división entera, es decir redondeando para abajo). Incluso se puede hacer desplazando 2 bits a izquierda->
    Cantidad escrituras de 4 pulsos = nro de pulsos >>2 = 14
    Cantidad de pulsos restantes = 57 - 4 * cantidad de escrituras de 4 pulsos = 1
    Escribir 01010101 (cantidad escrituras de 4 pulsos) veces
  • Cantidad de pulsos restantes = 3? -> escribir 3 pulsos; fin rutina de transmisión
  • Cantidad de pulsos restantes = 2? -> escribir 2 pulsos; fin rutina de transmisión
  • Cantidad de pulsos restantes = 1? -> escribir 1 pulsos; fin rutina de transmisión
  • Cantidad de pulsos restantes = 0? -> fin rutina de transmisión
La idea sería algo así:
  1. Leer entrada analógica
  2. Calcular cantidad de pulsos total
  3. Llamar a rutina de escritura
¿Cuál pic vas a utilizar?, ¿en que lenguaje vas a programar?.
Lo de disponer un modulo de comunicación serie facilitaría mucho, pero también se puede hacer por software (sin disponer de un módulo de comunicación serie).
Todo lo anterior valdría si el tiempo en alto de cada pulso es igual al tiempo en bajo, sino habría que pensar en otra cosa.
De que tiempos estamos hablando?->
  • cada cuanto tiempo tenés que transmitir el tren de pulsos?
  • cuanto tiempo tiene que estar en alto cada pulso?
Saludos
------------------
Al fin aprendí a usar listas ; y solo me tomó algo más de 2 años! ops: ops:
 
amigo perdon la demora me quede sin maquina por eso no pude responder priemro queria decirle que muchas gracias por su amabilidad es usted muy atento bueno le dire que resolvi el codi en micrbaasic pero tengo el sigt problema a continuacion le pongo el problem
en realidad trabaja bien pues la simule en proteus y quedo muy bien pero....cuando la paso al pic ahi es donde no trabaja nada y me hace algo raro cuando le acerco la mano al pic se pone a encender un Led que le puse por donde deve entregar los pulsos pero a lo loco no es nada de lo que tiene programado y cuando le alejo la mano se para y se apaga,entonces hice un programita para testear un Led por esa misma puerta un blink para el Led pero lo hice en pic pasic y trabajo perfectamente despues lo hice en Mikrobasic el mismo blink y me da el mismo defecto que podra ser amigo le agradeceria que me ayudarna desde ya les agradesco mucho a todo el que se detenga a leer mi problema aunque no tenga la solucion el pic es 16f873a
aqui esta el codigo:

program ConVVoltFrec


dim ValConvADC as word
dim VoltADC as float
dim NumPulsos as word
dim dataStr as string [17]

dim periodo as float
dim SemiPeriodo as float
dim i as byte
'************ Inicializa ADC *****************
'* Canal 0 por defecto *
'*********************************************
sub procedure ADCInit()
TRISA = %111111 ' Port A is input
ADCON1 = %10000000 ' Port A is in analog mode,
ADCON0 = %00000001 '
end sub

sub function ADC(dim c as byte) as word
'Dim Con as word
Dim TmpH as word
Dim TmpL as byte
'dim ConFinal as word

TmpH=0
TmpL=0

ADCON0 = %00000001 ' Activa el ADC; divisor 0
ADCON1 = %10000000 ' Todo el puerto A es analógico

c = c << 3
ADCON0 = ADCON0 or c

ADCON0.2 = 1 ' Conversion starts
wait:
Delay_us(10)
if ADCON0.2 = 1 then
goto wait
end if

TmpH= ADRESH ' Set lower 8 bits on port D
'TmpL= ADRESL

TmpH=TmpH << 8
TmpH=TmpH or ADRESL
result = TmpH
end sub


'sub procedure genera1pulso()
' dim SemiPeriodo as float
'
' 'SemiPeriodo=periodo/2
' PORTB.0=1
' Vdelay_ms(50)
' PORTB.0=0
' Vdelay_ms(50)
'end sub

' ***************************************
'
sub procedure ConvAPulsos(dim NumPulsos as byte)
dim periodo as float
dim SemiPeriodo as word
dim i as byte


for i=1 to NumPulsos
'genera1pulso(periodo)
PORTB.0=1
Vdelay_ms(50)
PORTB.0=0
Vdelay_ms(50)
next i

delay_ms(200)


end sub


main:
Usart_Init(9600)

TRISB=$00
ADCInit

while (1)

ValConvADC=ADC(0) 'Lee el canal 0 del conversor

VoltADC=0.0048*ValConvADC 'Convierte el valor a Volts

NumPulsos=ceil((199/5)*VoltADC) 'Convierte de Volts a Num de pulsos

ConvAPulsos(NumPulsos) ' Genera los pulsos incluyendo el tiempo de
' Silencio de 200 ms

wend

end.
 
cuando le acerco la mano al pic se pone a encender un Led que le puse por donde deve entregar los pulsos pero a lo loco no es nada de lo que tiene programado y cuando le alejo la mano se para y se apaga

Lo estás haciendo en un protoboard?, pusiste capacitores cerámicos en la alimentación de los integrados, resistencia limitadora de corriente para el led?.
Eso de que las cosas funcionen al pasar la mano me pasa cuando armo algo en la protoboard y hay algo que no está haciendo buen contacto.

Otra cuestión podría ser que el reloj del CAD sea demasiado rápido (sección 11.2 de la hoja de datos, pág 133 del pdf) . Qué frecuencia de oscilador usa el pic?.

sub procedure ConvAPulsos(dim NumPulsos as byte)
dim periodo as float
dim SemiPeriodo as word
dim i as byte


for i=1 to NumPulsos
'genera1pulso(periodo)
PORTB.0=1
Vdelay_ms(50)
PORTB.0=0
Vdelay_ms(50)
next i

delay_ms(200)


end sub

Esta parte de código genera un "paquete de pulsos" de duración variable. Es decir, si generamos 5 pulsos entonces se tardaría 5 * (100) + 200 = 700 milisegundos en enviar el paquete.
Si transmitimos 250 pulsos sería 250 * 100 + 200 = 25200 milisegundos = 25,2 segundos.
¿Se supone que tiene que trabajar así?, es decir, el tiempo de transmisión puede ser variable?.

Saludos
 
mi hermanito si supieras que eras te reiras, era simplemente que como uso un cristal de 20mhz declare a la hora de programar que era XT y no HS y me puse a leer el pdf y me di cuenta ademas de tener wdt activado tambien pero bueno ya resolvi ojala esto sirva para alguien como yo que empiece en esto. chaoo gracias amigo por su pronta atensión
 
si puede ser variable pues asta 200 pulso el automata puede medir eso los ultimos 200msg son para indicar que termino esa cantidad de pulsos enviados ademas temperatura es lenta la medicion te dejare un documento en word para que lo entiendas mejor
 

Adjuntos

  • conversor_ad_105.doc
    34.5 KB · Visitas: 84
yo pregunto....

como puedo captar la señal analoga y que la duracion de esa señal la pueda interpretar como un 1. intente con variables en PBP. que pause se = a la veriable de entrada pero me oxcila segun la entrada. la idea es prender 2 pines del puerto B 16F628. cuando la frecuencia desaparesca se apaguen. si me hago entender?

ejemplo: [500hz] o [cualquier HZ] prenden los led durante el tiempo que dura la onda de entrada. es como un sistema audioritmico solo que no quiero que los led titilen cada vez que una onda sea cuadrada o sinosoidal pasa de 0 a 1.
 
Atrás
Arriba