Está en la página 1de 4

UNIVERSIDAD POLITECNICA SALESIANA

CONVERSION DIGITAL ANALOGICO

Integrantes: Jairo Castillo

Jorge Morales

Jonathan Tipán

En el siguiente conversor se hace un tratamiento digital mediante la


programación en el pic y desde él generar trenes de pulsos por el puerto D
desde el pin menos significativo a el más significativo irá generando pulsos
variando su ancho de pulso dependiendo de qué pin sea (MSB ó LSB) estos
pines irán conectados al dac0808 el cual transformara esos trenes de pulso
en una señal analógica a través de un amplificador operacional LM741 que se
observará en el osciloscopio.

ESQUEMA
Implementación del circuito

Código Señal Rampa


program DAC
sub procedure init
trisd=0
end sub
dim i as byte
dim j as byte
dim a as byte
a=0
i=0
main:
init
while true
a=0
i=0
j=0
for i=0 to 255
a=a-1
portd=a
next i
for i=0 to 254
a=a+1
portd=a
next i
wend
end.
Código Señal Senoidal
El siguiente código crea una señal senoidal a partir de muestras cargadas en el programa para el
pic el cual ira tomando muestra a muestra para ir formando la onda senoidal utilizando el puerto d
para los bits menos significativos y el puerto b para los dos bits mas significativos faltantes.

program SineGen

' Estas son 100 muestras para una señal seno


' Samples[i] = Round(1000*sine(x))
' Donde x E [0, pi/2]
' y i E [0..99]
const Samples as word[100] = ( 0, 16, 31, 47, 63, 78, 94, 110, 125, 141, 156,
172, 187, 203, 218, 233, 249, 264, 279, 294,
309, 324, 339, 353, 368, 382, 397, 411, 426,
440, 454, 468, 482, 495, 509, 522, 536, 549,
562, 575, 588, 600, 613, 625, 637, 649, 661,
673, 684, 696, 707, 718, 729, 739, 750, 760,
770, 780, 790, 799, 809, 818, 827, 836, 844,
852, 860, 868, 876, 884, 891, 898, 905, 911,
918, 924, 930, 935, 941, 946, 951, 956, 960,
964, 968, 972, 976, 979, 982, 985, 988, 990,
992, 994, 995, 997, 998, 999, 999, 1000)

const Delta = 20 ' paso de frecuencia

dim SineValue as word


dim i as byte
dim T1 as word

sub procedure Interrupt


SineValue = samples[i] ' toma una muestra
inc(i) ' prepara la siguiente muestra
if i >= 100 then ' tener cuidado de no sobrepasar la matriz [0..99]
i=0
end if
ClearBit(T1CON, TMR1ON) ' para el timer por un momento
TMR1H = Hi(T1) ' pone TMR1 en un valor de inicio
TMR1L = Lo(T1)
SetBit(T1CON, TMR1ON) ' arranca el Timer1
ClearBit(PIR1, TMR1IF) ' limpia la bandera
end sub

sub procedure ProcessValue(dim Value as word)


' se utiliza los valores
PORTD = Lo(Value) ' bits menos significativos
PORTB = Hi(Value) 'bits mas significativos
end sub

sub procedure Init


INTCON = $00 ' desabilita la interrupcion
TRISB = $00 ' PORTB: todo como salida
TRISD = $00 ' PORTD: todo como salida
TRISC = %11000000 ' poner RC6 y RC7 como entradas
T1 = 0
TMR1H = 0
TMR1L = 0

SineValue = 0

SetBit(PIE1, TMR1IE) ' abilitar la interrupcion en timer1

T1CON = $29 ' poner el reloj interno, arrancar el Timer1, prescaler 1:4,
INTCON = $C0 ' abilita interrupcion
end sub

main:
Init ' prepare PIC para operacion
_loop:
ProcessValue(SineValue)

if Button(PORTC, 7, 2, 1) <> 0 then ' incrementa frecuencia de interrupcion


' si el pulsador es precionado
if T1 < (65535-Delta) then
T1 = T1 + Delta

end if
end if

if Button(PORTC, 6, 2, 1) <> 0 then ' decrementa la frecuencia de la interrupcion


' si el pulsador es presionado
if T1 > Delta then
T1 = T1 - Delta

end if
end if

goto _loop
end.

También podría gustarte