vrijdag 20 juli 2012

ad9850 dds

Op ebay kun je voor rond de 5 euro een module kopen met de ad9850 dds van analog
Met deze module zou je een meetzender of een vfo voor een ontvanger kunnen maken.
De aansluitingen van de module zijn wel te vinden op internet.
Het lastige is het berekenen van de data wat de ad9850 in moet voor het zetten van de frequentie.
Volgens de datasheet,
freq_out = (data-dds * clockfreq) / 2^32

Het probleem om het in 1 keer te bereken is de 2^32, hier kunnen we in proton niks mee.
Dit zijn namelijk 33 bitjes. De oplossing is om het bit voor bit te doen.
Op de volgende manier:

dds = 0
calfreq = freq
For teller = 31 To 0 Step -1      ' 32 bits berekenen
calfreq = calfreq // clock << 1  ' restant *2
calbit = calfreq / clock             ' volgende bit
If calbit = 1 Then SetBit dds,teller
Next  teller

waarbij freq de gewenste freq is.
clock de klokfrequentie van de ad9850, Op de module zit een oscillator van 125mhz.
en in dds de output wat naar de ad9850 toemoet.
alle variabelen zijn 32 bits breed.
we kunnen nu dus op de hertz nauwkeurig de data voor de ad9850
berekenen.


Op de foto zien we het resultaat, we moeten wel 10mhz van de frequentie aftrekken.
dus de dds gaat draaien op 4.169 mhz. De kleinste stap word 10hz.
De bedoeling is om in eerste instantie de dds te laten draaien van 4.0 tot 4.35 mhz
voor mijn qrp transceiver voor de 20m, De taurus van sp5ddj.
waarbij een mf van 10mhz wordt gebruikt.Het nadeel van de dds is wel dat er
nog al wat rommel geproduceerd word. Een extra bandfilter achter de dds
zal zeker nodig zijn.
Nu nog de software verder afmaken en de module testen.


zondag 8 juli 2012

DHT11

Op EBAY kun je voor rond de €1,50 de DHT11 aantreffen, deze sensor meet
de temperatuur en de luchtvochtigheid., temperatuur bereik 0-50 graden vochtigheid van 20-95% nauwkeurigheid +/-2 graden en +/- 5% vochtigheid. De sensor werkt min of meer zoals een onewire van dallas. De resolutie is 1, het vreemde is wel dat de decimalen wel mee worden verstuurd maar die zijn dus altijd 0. De luxere uitvoering is de DHT21 of DHT22 met een betere resolutie en bereik.
De datasheet is hier te vinden.



Op de foto heb ik naast de DHT11 ook een SHT11, de bovenste regel is de DHT11 de onderste
de SHT11

En hier de software voor de DHT11, aansluitingen voor het lcd en DHT11 vind je in de software,
De pic is in mijn geval een 18f2620, maar andere typen werken ook, alleen we maken gebruik van "pulsin"
dus de xtal freq moet 20mhz zijn. Anders dien je de waarden aan te passen.
De sensor is vrij traag en heeft een 1 seconde nodig om op te starten.
Is er een probleem met de sensor krijgen we een foutmelding,
Is er een bitje omgevallen van de 40 bits die worden ingelezen dan krijgen we een bit error.

Device 18F2620
Xtal 20   
                  
LCD_DTPin PORTC.0
LCD_ENPin PORTC.4
LCD_RSPin PORTC.5

All_Digital = On

Dim hygro As Byte
Dim hygrodec As Byte
Dim temp As Byte
Dim tempdec As Byte
Dim checksum As Byte
Dim dhtin As Byte
Dim teller As Byte
Dim checkchks As Byte
Dim dataout As Byte


DelayMS 100

Print  $FE, $40, $08, $14, $08, $03, $04, $04, $03, $00 ' celcius
Print  $FE, $48, $04, $0E, $0E, $1F, $1F, $1F, $0E, $00 ' drupje
Print  $FE, $50, $1F, $0E, $04, $00, $04, $0E, $1F, $00 ' temp binnen

Start:

Cls

Print At 1,1,"DHT11"

DelayMS 1500

main:

checksum = 0

TRISB = 000000

PORTB.0 = 1                       
DelayMS 50                       
PORTB.0=0:DelayMS 20             'start data cycles min 18ms
PORTB.0=1:DelayUS 30             ' port weer hoog, min 20 us
dhtin = PulsIn PORTB.0,1

If dhtin < 20 Or dhtin > 60 Then GoTo senserror  ' sensor error

GoSub datain
hygro = dataout

GoSub datain
hygrodec = dataout

GoSub datain
temp = dataout

GoSub datain
tempdec = dataout

GoSub datain
checksum = dataout

checkchks = (hygro + hygrodec + temp + tempdec)
If checkchks <> checksum Then
Print At 1,1, "Bit error"
Else
Print At 1,1,2," ",Dec2 temp,".",Dec1 tempdec,0," ",1," ",Dec2 hygro,".",Dec1 hygrodec,"%"
EndIf

DelayMS 1000
GoTo main

datain:       
dhtin = 0
For teller = 7 To 0 Step -1
dhtin = PulsIn PORTB.0,1           
If dhtin >30 Then    
SetBit dataout,teller
Else
ClearBit dataout,teller
EndIf
Next teller
Return

senserror:
Print At 1,1,"Sensor error     "
DelayMS 2000
GoTo Start