Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

11
voti

IL DAC del 16F1705

Indice

Introduzione

Eccomi ancora una volta a parlarvi di una mia recente esperienza che desidero condividere con voi. Si tratta di alcune prove fatte con un nuovo pic, nuovo almeno per me, la cui sigla è 16F1705, un piccoletto da 7+7 pin, ma con un cuore così grande da rimanerne sbalordito. Il mio interesse per questo piccolo gigante è nato per caso, dopo essermi accorto spulciando il sito ufficiale della Microchip, che tra tutte le altre cose, a bordo ospita anche un DAC ossia un convertitore digitale analogico da 8 bit. Poca cosa direbbero in tanti ma a me è subito piaciuto, soprattutto per le sue piccole dimensioni e per la sua grande flessibilità. Immediatamente ho anche fantasticato sulle possibili applicazioni offerte da tale opportunità, pensando ad uno scrambler, ad un oscillatore seno-coseno, ad un generatore di forme d’onda programmabile ed altro ancora.

L’ interno

Elencarvi i vari blocchi interni che sono davvero tanti non credo sia il caso, chi lo desidera può scaricarsi il datasheet dal sito della Microchip che ho trovato molto chiaro, completo ed esaustivo. Quindi come prima cosa, me ne sono procurato subito uno, ed ho fatto alcune prove, con risultati che a me sembrano molto interessanti e di cui vi illustro più avanti i vari aspetti, sperando di non tralasciare nulla. Lo schema utilizzato per le mie prove, se di schema si può parlare, è visibile nella figura che segue, come vedete è davvero ridotto all’osso, infatti non c’è niente oltre al pic, nemmeno il quarzo per il clock da 32 Mhz, che viene generato internamente e più avanti vedremo come.

16F1705_schema-300x213

16F1705_schema-300x213

16F1705_breadboard-300x234.png

16F1705_breadboard-300x234.png

Così come suggerito nel datasheet, vista l’alta impedenza d’uscita del DAC, è consigliabile usare un buffer, ed in questo caso ho preferito utilizzare uno dei due amplificatori operazionali interni al chip, seguito da un semplice filtro passa basso RC, che rende la già molto precisa sinusoide, quasi perfetta, eliminando la leggera gradinatura del segnale presente sul pin 8. Vedi foto.

16F1705_out_bf-300x240.png

16F1705_out_bf-300x240.png

La parte che ci interessa approfondire l’ho copiata dal datasheet, ed è rappresentata nello schema a blocchi che segue, dove nella parte centrale è visibile il convertitore DAC vero e proprio; nel lato sinistro la parte che riguarda la selezione della tensione di riferimento positiva e negativa per il DAC, a destra in basso le uscite utilizzabili ed in alto gli otto bit da convertire.

16F1705_DAC.png

16F1705_DAC.png

Software

Per la scrittura e la simulazione del software ho usato “MPLAB V8.92”, mentre per la scrittura del pic ho usato “propic2“ abbinato al software “melabs Programmer 4.52 beta”.A fine articolo troverete anche il file ASM che ho corredato di alcune indicazioni per renderlo più leggibile, ma se qualcosa ho dimenticato me ne scuso ed eventualmente su richiesta cercherò di rimediare. Voglio solo precisare che la tabella dei dati nel file ASM, contiene solo i valori del seno compresi tra 0° e 90°, gli altri valori tra 90° e 180° essendo speculari ai precedenti, li ho ottenuti leggendo la tabella al contrario da 90° a 0°. Lo stesso discorso vale per la parte negativa della sinusoide, dove i dati ricavati dalla tabella sono di volta in volta sottratti al valore 254, ottenendo in questo mado anche i valori da 180° fino a 360°.

Sinusoide

I valori che leggete in tabella sono ottenuti moltiplicando il seno dell’angolo per 100 e sommando il risultato ottenuto a 127, in questo modo la sinusoide sarà centrata a circa ½ della VCC. In questo caso ho considerato tutti i valori tra 0° e 360° ottenendo una frequenza della sinusoide di circa 556 Hz, ma i risultati sarebbero ancora accettabili anche prendendo solo i valori pari, o solo i dispari, ottenendo ovviamente un valore di frequenza doppio. Insomma, come accade sempre in questi casi, non ci sono limiti alla fantasia, e si possono implementare con questo DAC anche le cose più stravaganti, come generare un segnale di forma prestabilita ed assolutamente originale.

Nella figura seguente è invece visibile lo schema a blocchi che genera il clock, con evidenziato il percorso della logica che permette di generare 32 MHz partendo da un riferimento di appena 500 kHz, si capisce come seguendo logiche diverse si possa scendere fino a 31,25 kHz.

16F1705_osc_clock

16F1705_osc_clock

Per qualunque chiarimento non esitate a contattarmi.
Saluti e buon divertimento.

Francesco.
it9dpx #135

File asm

*************************
sinusoide 280415 1132
*************************
  PROCESSOR       16F1704
  RADIX           DEC
  INCLUDE         "P16F1704.INC" 
  ERRORLEVEL      -302
  ERRORLEVEL      -305
      ORG     130H

GRADI RES 1

SENO RES 1

SETTORE RES 1

   __CONFIG  H'8007', H'3FA4'
   __CONFIG  H'8008', H'1FFF'
      ORG 00 
 GOTO   VIA
----INTERRUPT---------
   ORG 04
 MOVLB   0
 MOVLW   240
 MOVWF   TMR0
 MOVLB   2
 MOVFW   SENO  
 MOVWF   DAC1CON1
 BTFSS  SETTORE,0
 GOTO   INCREMENTA
 GOTO   DECREMENTA

INCREMENTA

 INCF    GRADI
 MOVFW   GRADI
 XORLW   90
 BTFSS   STATUS,Z
 GOTO    FINE_LAVORO
 INCF    SETTORE
 GOTO    FINE_LAVORO

DECREMENTA

 DECF    GRADI
 BTFSS   STATUS,Z
 GOTO    FINE_LAVORO
 INCF    SETTORE

FINE_LAVORO

 MOVFW   GRADI
 CALL    ONDA
 BTFSS   SETTORE,1
 SUBLW   254  ;SEMIONDA NEGATIVA
 MOVWF   SENO
 BCF     INTCON,2
 RETFIE
----FINE INTERRUPT---------

VIA

 MOVLB  1
 MOVLW  B'11110000'
 MOVWF  OSCCON 
 MOVLW  B'10100000'
 MOVWF  INTCON 
 CLRF   OPTION_REG
 MOVLB    2
 MOVLW    B'10000000'
 MOVWF    DAC1CON0
 CLRF     GRADI
 CLRF     SETTORE
 MOVLB    10
 MOVLW    B'10010010'
 MOVWF    OPA1CON
 MOVLB    0
 MOVLW    240
 MOVWF    TMR0

ATTESA

 NOP
 NOP
 NOP
 GOTO    ATTESA  

ONDA

 ADDWF PCL
dati da 0° a 90°
 RETLW 127
 RETLW 129
 RETLW 130
 RETLW 132
 RETLW 134
 RETLW 136
 RETLW 137
 RETLW 139
 RETLW 141
 RETLW 143
 RETLW 144
 RETLW 146
 RETLW 148
 RETLW 149
 RETLW 151
 RETLW 153
 RETLW 155
 RETLW 156
 RETLW 158
 RETLW 160
 RETLW 161
 RETLW 163
 RETLW 164
 RETLW 166
 RETLW 168
 RETLW 169
 RETLW 171
 RETLW 172
 RETLW 174
 RETLW 175
 RETLW 177
 RETLW 179
 RETLW 180
 RETLW 181
 RETLW 183
 RETLW 184
 RETLW 186
 RETLW 187
 RETLW 189
 RETLW 190
 RETLW 191
 RETLW 193
 RETLW 194
 RETLW 195
 RETLW 196
 RETLW 198
 RETLW 199
 RETLW 200
 RETLW 201
 RETLW 202
 RETLW 204
 RETLW 205
 RETLW 206
 RETLW 207
 RETLW 208
 RETLW 209
 RETLW 210
 RETLW 211
 RETLW 212
 RETLW 213
 RETLW 214
 RETLW 214
 RETLW 215
 RETLW 216
 RETLW 217
 RETLW 218
 RETLW 218
 RETLW 219
 RETLW 220
 RETLW 220
 RETLW 221
 RETLW 222
 RETLW 222
 RETLW 223
 RETLW 223
 RETLW 224
 RETLW 224
 RETLW 224
 RETLW 225
 RETLW 225
 RETLW 225
 RETLW 226
 RETLW 226
 RETLW 226
 RETLW 226
 RETLW 227
 RETLW 227
 RETLW 227
 RETLW 227
 RETLW 227
 RETLW 227
fine dati

END .

File hex

020000040000FA
020000001F28B7
080008002000F03095002200F9
1000100031089900321C0D281428B00A30085A3AC9
10002000031D1828B20A1828B003031D1828B20AA5
1000300030083420B21CFE3CB1000B110900210035
10004000F0309900A0308B0095012200803098009C
10005000B001B2012A00923091002000F0309500EA
10006000000000000000302882077F348134823491
1000700084348634883489348B348D348F3490348E
10008000923494349534973499349B349C349E3410
10009000A034A134A334A434A634A834A934AB3496
1000A000AC34AE34AF34B134B334B434B534B73423
1000B000B834BA34BB34BD34BE34BF34C134C234B6
1000C000C334C434C634C734C834C934CA34CC3455
1000D000CD34CE34CF34D034D134D234D334D434FC
1000E000D534D634D634D734D834D934DA34DA34B3
1000F000DB34DC34DC34DD34DE34DE34DF34DF3476
10010000E034E034E034E134E134E134E234E23448
10011000E234E234E334E334E334E334E334E33429
06026000FF3FFF3FFF3FDE
020000040001F9
02000E00A43F0D
02001000FF1FD0
00000001FF

5

Commenti e note

Inserisci un commento

di ,

Questo PIC è spettacolare!

Rispondi

di ,

Ciao. Credo che la rampa che ti serve possa essere realizzata anche molto facilmente. Ovviamente se deve durare 20 minuti cioè 1200 secondi, e disponendo di soli 256 gradini, ogni gradino avrà una durata pari a 4,7 secondi circa. Per quanto riguarda mplab la scelta è obligata, perchè le versioni precedenti alla 8.92 non includono il 16f1705; versione che puoi scaricare facilmente dal sito. Mi riferisco alla versione a 32 bit che trovi sempre nella stessa pagina dove hai trovato la versione 3 a 64 bit, nella sottocartella "Downloads Archive" Saluti. Francopic.

Rispondi

di ,

Molto interessante Francopic. Sembrerebbe una possibile soluzione ad un mio problema, devo realizzare una rampa di tensione molto lenta, da 0 a 6V che duri 20min in salita e altrettanti in discesa. Ma il mio problema piu' grande e' usare MPLAB. Ho visto che hai usato la ver. 8.92 ma quello attualmente disponibile sul sito Microchip e' MPLAB X IDE V3.00. Puoi darmi qualche consiglio su come "affrontare" l'uso di MPLAB e su quale versione (freeware) usare ? grazie

Rispondi

di ,

Grazie.

Rispondi

di ,

Analisi interessante! Bravo.

Rispondi

Inserisci un commento

Per inserire commenti è necessario iscriversi ad ElectroYou. Se sei già iscritto, effettua il login.