Está en la página 1de 7

Generacin de seales con microcontrolador PIC

Aqu se pretende disear el hardware y el software necesario para producir una onda
seno con un microcontrolador PIC16F877 de Microchip y un conversor digital / anlogo
DAC0808 de National Semiconductor, como se ve en la figura.

R1
0R1

U1
13
14
1
2
3
4
5
6
7
8
9
10

OSC1/CLKIN
OSC2/CLKOUT
MCLR/Vpp/THV

DAC1
RB0/INT
RB1
RB2
RB3/PGM
RB4
RB5
RB6/PGC
RB7/PGD

RA0/AN0
RA1/AN1
RA2/AN2/VREFRA3/AN3/VREF+
RA4/T0CKI
RA5/AN4/SS
RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2
RE0/AN5/RD
RC2/CCP1
RE1/AN6/WR
RC3/SCK/SCL
RE2/AN7/CS
RC4/SDI/SDA
RC5/SDO
RC6/TX/CK
RC7/RX/DT
RD0/PSP0
RD1/PSP1
RD2/PSP2
RD3/PSP3
RD4/PSP4
RD5/PSP5
RD6/PSP6
RD7/PSP7

33
34
35
36
37
38
39
40
15
16
17
18
23
24
25
26

D0
D1
D2
D3
D4
D5
D6
D7
LE

VOUT
VREF+
VREF-

B1
5.1V

DAC_8

19
20
21
22
27
28
29
30

PIC16F877

Figura 1.
Dado que con el conversor DAC0808 no es posible producir voltajes negativos vamos a
producir la onda seno montada sobre un nivel DC de dos voltios, dicha onda se generar
con una frecuencia de 100 Hz, con una frecuencia de muestreo de 10.000
muestras/segundo. La amplitud de la onda seno ser de 2 voltios de tal forma que la
ecuacin analtica ser:
V(n) = 2*sin(2*pi*100*n/10000) + 2
de donde la frecuencia digital ser
f = 100/10000 = 1/100
de donde el periodo mnimo de esta seno es N = 100.
Es decir, necesitamos generar una tabla de 100 valores los cuales pueden ser obtenidos
con el siguiente programa en Matlab:

n = 0:99
v = 2*sin(2*pi*n/100)+2 %estos 100 valores se muestran en tabla 1-1

2
3.1756
3.9021
3.9021
3.1756
2.0000
0.8244
0.0979
0.0979
0.8244

2.1256
3.2748
3.9372
3.8596
3.0717
1.8744
0.7252
0.0628
0.1404
0.9283

2.2507
3.3691
3.9646
3.8097
2.9635
1.7493
0.6309
0.0354
0.1903
1.0365

2.3748
3.4579
3.9842
3.7526
2.8516
1.6252
0.5421
0.0158
0.2474
1.1484

2.4974
3.5410
3.9961
3.6887
2.7362
1.5026
0.4590
0.0039
0.3113
1.2638

2.6180
3.6180
4.0000
3.6180
2.6180
1.3820
0.3820
0
0.3820
1.3820

2.7362
3.6887
3.9961
3.5410
2.4974
1.2638
0.3113
0.0039
0.4590
1.5026

2.8516
3.7526
3.9842
3.4579
2.3748
1.1484
0.2474
0.0158
0.5421
1.6252

2.9635
3.8097
3.9646
3.3691
2.2507
1.0365
0.1903
0.0354
0.6309
1.7493

3.0717
3.8596
3.9372
3.2748
2.1256
0.9283
0.1404
0.0628
0.7252
1.8744

TABLA 1-1 DATOS ALMACENADOS EN ORDEN POR FILAS


Como se puede ver en la figura 1, el voltaje de referencia del conversor es 5.1 voltios, por
lo tanto la resolucin es:
Resolucin = 5.1/(2exp(8) 1) = 5.1/(256 1)
voltios/pasos = 0.02 voltios/paso
Luego el equivalente digital de los valores de la tabla 1-1 , se calculan tomando el
entero mas cercano de la divisin entre el valor correspondiente de la tabla 1-1 y la
resolucin.
De tal forma que si el valor es 2 entonces el equivalente digital es:
Valor digital = 2/resolucin = 2/ 0.02 = 100
y as para todos los valores, obtenindose los valores de la tabla 1-2.Estos valores
son los que deben entregarse al DAC0808.
100
159
195
195
157
100
41
5
5
41

106
164
197
193
154
94
36
3
7
46

113
168
198
190
148
87
32
2
10
52

119
173
199
188
143
81
27
1
12
57

125
177
200
184
137
75
23
0
16
63

131
181
200
181
131
69
19
0
19
69

137
184
200
177
125
63
16
0
23
75

143
188
199
173
119
57
12
1
27
81

148
190
198
168
113
52
10
2
32
87

154
193
197
164
106
46
7
3
36
94
2

TABLA 1-2 VALOR DIGITAL DE la tabla 1-1


Lo que nos queda ahora es escribir un programa en microcontrolador PIC, que entregue
los datos de la tabla 1-2, a una rata de 10.000 muestras/segundo. Para esto vamos a
generar una rutina de tiempo de 100 microsegundos, que es el tiempo de muestreo a esta
velocidad.
Supngase que el cristal opera a 4 MHz, o sea que la frecuencia bsica de operacin es
1 MHz.
;******************************************************************************************
;EL SIGUIENTE PROGRAMA GENERA UNA ONDA SENOIDAL DE 100 HZ
;DE 2 VOLTIOS PICOS MONTADA SOBRE UN NIVEL DC DE 2 VOLTIOS
;CON UNA FRECUENCIA DE MUESTREO DE 10.000 M/S UTILIZANDO
;******************************************************************************************
tmr0
EQU
1
pcl equ
02h
status
equ
03
ptoa
equ
05
ptob
equ
06
ptoc
equ
07
ptod
equ
08
ptoe
equ
09
pclath
equ
0ah
intcon
equ
0bh
pir1equ
0ch
rcsta
equ
18h
txreg
equ
19h
rcreg
equ
1ah
adresh
equ
1eh
adcon0
equ
1fh
trisa
equ
85h
trisb
equ
86h
trisc
equ
87h
trisd
equ
88h
trise
equ
89h
txsta
equ
98h
spbrg
equ
99h
adresl
equ
9eh
adcon1
equ
9fh
;Definicion de bits utilizados
rp0
rp1
irp
z
c
txif
go

equ
equ
equ
equ
equ
equ
equ

5
6
7
2
0
4
2

;Variables del usuario


loops
loops2
buffer
contador
cuenta

equ
equ
equ
equ
equ

30h
31h
32h
43h
44h
3

; ************ Configuracion para el simulador Proteus


list p=16f877
_CP_ALL
_CP_HALF
_CP_UPPER_256
_CP_OFF
_DEBUG_ON
_DEBUG_OFF
_WRT_ENABLE_ON
_WRT_ENABLE_OFF
_CPD_ON
_CPD_OFF
_LVP_ON
_LVP_OFF
_BODEN_ON
_BODEN_OFF
_PWRTE_OFF
_PWRTE_ON
_WDT_ON
_WDT_OFF
_LP_OSC
_XT_OSC
_HS_OSC
_RC_OSC

EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU

H'0FCF'
H'1FDF'
EQU H'2FEF'
H'3FFF'
H'37FF'
H'3FFF'
EQU H'3FFF'
EQU H'3DFF'
H'3EFF'
H'3FFF'
H'3FFF'
H'3F7F'
H'3FFF'
H'3FBF'
H'3FFF'
H'3FF7'
H'3FFF'
H'3FFB'
H'3FFC'
H'3FFD'
H'3FFE'
H'3FFF'

__CONFIG _CP_OFF & _WDT_OFF & _XT_OSC & _PWRTE_ON


ORG
0
GOTO inicio
retardo
repite

movlw
movwf
nop
nop
nop
decfsz
goto
return

d'15'
45h

;retardo de 100 usec

45h,1
repite

;*******************************************************************************
;EL SIGUIENTE CODIGO ARMA LOS DATOS DE LA TABLA
;********************************************************************************
tabla
ADDWF
pcl,1
RETLW .100
RETLW.106
RETLW.113
RETLW.119
RETLW.125
RETLW.131
RETLW.137
RETLW .143
RETLW.148
RETLW.154
RETLW.159
RETLW.164
4

RETLW.168
RETLW.173
RETLW .177
RETLW.181
RETLW.184
RETLW.188
RETLW.190
RETLW.193
RETLW.195
RETLW .197
RETLW.198
RETLW.199
RETLW.200
RETLW.200
RETLW.200
RETLW.199
RETLW .198
RETLW.197
RETLW.195
RETLW.193
RETLW.190
RETLW.188
RETLW.184
RETLW .181
RETLW.177
RETLW.173
RETLW.168
RETLW.164
RETLW.159
RETLW.154
RETLW .148
RETLW.143
RETLW.137
RETLW.131
RETLW.125
RETLW.119
RETLW.113
RETLW .106
RETLW.100
RETLW.94
RETLW.87
RETLW.81
RETLW.75
RETLW.69
RETLW .63
RETLW.57
RETLW.52
RETLW.46
RETLW.41
RETLW.36
RETLW.32
RETLW .27
RETLW.23
RETLW.19
RETLW.16
RETLW.12
RETLW.10
RETLW.7
5

RETLW .5
RETLW.3
RETLW.2
RETLW.1
RETLW.0
RETLW.0
RETLW.0
RETLW .1
RETLW.2
RETLW.3
RETLW.5
RETLW.7
RETLW.10
RETLW.12
RETLW .16
RETLW.19
RETLW.23
RETLW.27
RETLW.32
RETLW.36
RETLW.41
RETLW .46
RETLW.52
RETLW.57
RETLW.63
RETLW.69
RETLW.75
RETLW.81
RETLW .87
RETLW.94
inicio

ciclo

clrf
bsf
movlw
movwf
movlw
movwf
movlw
movwf
movlw
movwf
movlw
movwf
movlw
movwf
bcf

status
status,rp0
b'11111111'
trisa
b'00000000'
trisb
b'11111111'
trisc
b'11111111'
trisd
b'11101111'
trise
b'00000010'
adcon1
status,rp0

;poner status en cero para asegurar banco 0


;pasar al banco 1

clrf

cuenta

;inicia contador de 100 lecturas

movf
call
movwf
call
incf
movlw
xorwf
btfss
goto
goto

cuenta,0
tabla
ptob
retardo
cuenta,1
d'100'
cuenta,0
status,z
ciclo
inicio

;inicia contador de 100 muestras


;llama datos de la tabla de 100 valores
;saca al puerto B
;llama retardo de 100 usec
;incrementa contador de 100 lecturas
;compara con 100 para saber si leyo todos los datos

;puerto A entradas
;puerto B salidas
;puerto C entradas
;puerto D entradas
;puerto E entradas
;
;pasar al banco 0

end

También podría gustarte