PIC 16F887 naar DAC

Hallo allemaal,

ter voorbereiding op een complexer project wil ik eens wat experimenteren met het via SPI aansturen van "iets" vanuit een PIC 16F887. Het programmeren van een PIC heb ik wel al onder de knie.

Ik dacht zelf aan een DAC-chip of zo, omdat je dan simpel de uitgangsspanning kunt meten als functie van de aansturing uit de PIC. Gemakkelijk om te controleren of de SPI aansturing werkt en het programma goed is.
Ik zoek dus een DAC-chip met SPI. Hebben jullie een advies, er is zo veel te vinden op internet ....

Dirk

Arco

Special Member

Je kunt ook een SPI diplay nemen als start. Zie je meteen als 't goed gaat... :)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Je zou de MCP4725 eens kunnen probreren.
Deze is 12 bit. Daar is op internet ook wel het e.e.a over te vinden, en bij veel leveranciers verkrijgbaar.

Ik heb inmiddels een MCP4921 beschikbaar. Dat is een 12-bit DAC. Ik begrijp uit de datasheets dat ik 12 bits moet sturen die het gewenste uitgangsniveau bepalen. Betekent dit dat ik stapjes met een resolutie van +5V/4096 kan nemen ?
Verder moeten er nog 4 bits volgen
Bit 15 moet LOW blijven.
Ik wil voorlopig even experimenteren met de Vref gelijk aan de +5V dus met bit 13 HIGH kan ik dan volgens mij stappen van 0 V tot 4095/4096*5V.
Bit 12 HIGH
Bit 14 maakt volgens mij niet uit voor een simpel experiment.

Is deze gedachte goed tot zover ?

Dirk

Ik stuur de DAC zo aan (code is voor de MCP4725, dat is de I2C versie).
Je moet Wire dan even vervangen door het SPI equivalent.

Je gedachte klopt, elk stapje dat je zet is 1/4096 * VRef

c code:


void Setout(int value)
{
  Wire.beginTransmission(MCP4725_ADDR);
  Wire.write(64);                     // cmd to update the DAC
  Wire.write(value >> 4);             // the 8 most significant bits...
  Wire.write((value & 15) << 4);      // the 4 least significant bits...
  Wire.endTransmission();
}

Ik ben wel benieuwd naar je resulaten. Met name hoe hij zich onderin gedraagd, bij heel kleine waardes. En hoe lineair hij is?

Je voelt hem wel, denk ik :)

Ik ben aan de slag gegaan met onderstaand programmaatje. Het programma stuurt voortdurend de waarde "2000" naar de DAC MCP4921, voorafgegaan door "0011" om de config-bits van de DAC correct te zetten. Zo kom ik dus op "001111111010000" = 8144. Deze waarde zou er volgens mij toe moeten leiden dat de output-pin 8 van de DAC ongeveer de halve waarde heeft, dus ca. +2,5V.
Niet dus. Ik doe blijkbaar iets fout .... Maar wat ? Zien jullie het ?

pic basic code:

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : Dirk Lammers                                      *
'*  Notice  : Copyright (c) 2013 Dirk Lammers                   *
'*          : All Rights Reserved                               *
'*  Date    : 8-5-2013                                          *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

Device 16F628A                ;We gebruiken een 16F628A type
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
Xtal 4
All_Digital TRUE

Symbol LED = PORTA.1
Symbol DataPin = PORTA.2
Symbol ClockPin = PORTA.3
Symbol CSPin = PORTA.0


PORTA = %00000000
TRISA = %11111111

Clear

; Nu begint het eigenlijke programma met de hoofdlus

While 1=1

;Even een lEDje bijzetten om te kijken of het programma en
;de PIC wel draaien
;High LED
;DelayMS 1000
;Low LED
;DelayMS 1000

Low CSPin
DelayMS 10
SHOut DataPin, ClockPin, 0, [8144\16]
;Opbouw BIT 15=0, BIT14=0, BIT 12 en 13=1, Bit 11 t/m 1 = 11111010000 (2000 dec) 
High CSPin

Wend
Arco

Special Member

Als je met SPI begint, is iets als een seriele eeprom een stuk makkelijker. Die geeft ook antwoord terug, dus kun je zien of de communicatie goed gaat...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Misschien goed idee, maar dit moet toch ook niet heel ingewikkeld zijn ?

Het schema is recht-toe-recht-aan, de commando's ook, ik zie vast iets "doms" over het hoofd.

Dirk

Op 24 april 2015 11:45:55 schreef JBerg54:
Ik ben wel benieuwd naar je resulaten. Met name hoe hij zich onderin gedraagd, bij heel kleine waardes. En hoe lineair hij is?

Je voelt hem wel, denk ik :)

Ehhh. Is zo'n special purpose DAC ook zo ontzettend a-lineair onderin? De DAC in de STM32 familie is een onding wat dat betreft. De onderste 50mV zijn onbereikbaar. Tenzij je de opamp uitschakelt, en dan heeft ie weer een ontzettend hoge uitgangsimpedantie. (die reduceer je met de opamp tot ongeveer 10k: Nog steeds fors. )

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Ik heb bijgaand een stukje van de code en de output op de scope bijgevoegd. Volgens mij geeft het programma de juiste output. Op de scope zijn de clockpulsen in geel te zien en de data in blauw.
De CS kan ik niet meer laten zien maar die is al die tijd LAAG.

Uitgaande van LSB eerst worden eerst de configuratiebits gezet en daarna 12 bits data. Ik zou nu een uitgangsspanning op pin 8 van de DAC verwachten. 110000000000 binair = 3072 dec. Dus ongeveer 3072/4096 X +5V = ca. 3,75 V. Maar nee, geen output op pin 8.

http://www.uploadarchief.net/files/download/resized/mcp4921.jpg

http://www.uploadarchief.net/files/download/printscreen001.jpg

StijnN

Golden Member

Ik denk dat je eens heel goed moet kijken naar de volgorde waarin je de bitjes naar de DAC stuurt.
Volgens het scope beeld stuur je dit naar de DAC:

b15....................b0
1110_0000_0000_0011

ipv.

b15....................b0
0111_1100_0000_0000

Dit eerste komt volgens de datasheet overeen met:
Write to DACb
Buffered
1x (Vout=Vref*D/4096)
Output buffer disabled, Output is high impedance !!!!!!

en de uitgangwaarde D is gelijk aan 3

A person who never made a mistake never tried anything new.
Arco

Special Member

Ik begrijp het niet helemaal meer. Je zegt dat je een 16F887 gebruikt, en de geplaatste code is voor een 16F628A? (Een 887 heeft HW SPI, de 628A niet)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Ik denk dat je eens heel goed moet kijken naar de volgorde waarin je de bitjes naar de DAC stuurt.

Inderdaad, daar zat de fout !! Bedankt voor de opmerking.

Ik snap de verwarring. Ik gebruik inderdaad een 16F628A in de schakeling.
Met onderstaande instellingen werkt het nu.

http://www.uploadarchief.net/files/download/pscreen.jpg

De lineariteit valt me ook niet tegen:

50 -> 0,060V
100 -> 0,119V
200 -> 0,238V
400 -> 0,472
2000 -> 2,37V
4000 -> 4,72V