AD9833 met PIC en MikroBasic

Arco

Special Member

Controller van TS heeft comparators aan boord, die zijn uitstekend geschikt om frequentie te meten...

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

Golden Member

Op woensdag 25 december 2024 09:50:11 schreef rew:
Als de TS een comparator kan/wil gebruiken dan heb ik gemist waar ie mee bezig is.

Ik heb een digitaal frequentiemetertje, waarmee ik snel de opgewekte signaalfrequentie kan zien. Die verlangt ttl achtige niveaus. Ik voed hem via een Schmitt trigger HCT132.
Maar de output van de AD9833 is voor bloksignalen nét genoeg, voor de sinus en triangle niet,
Vandaar dat ik de output wat op wil krikken.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

De MCP6002's zijn besteld. Maar omdat de PIC16F1847 comparators aan boord heeft, is dit een leuke oefening voor mij.

Ik heb het programma inmiddels wat uitgebreid en er een OLED schermpje aan toegevoegd die de ingestelde waarde toont. Was ook een leuke, hiervoor gebruik ik de interne SPI module, terwijl ik voor de AD9833 de softwarematige SPI gebruik. Dat werkt mooi.

Volgende toevoeging is om met een potmeter de frequentie instelbaar te maken.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Op woensdag 25 december 2024 01:02:00 schreef Arco:
Je kunt de min van de comparator aan Gnd leggen, en het signaal via een condensator aan de plus van de comparator leggen.
(met een hoogohmige pull-down aan de comparator plus (1M of zo) om de juiste offset te hebben.)

Pin op analoog zetten, comparator enablen, en kiezen welke pinnen je wilt gebruiken. (de min van de comparator blijft intern)
De uitgang van de comparator is ook direct intern beschikbaar (met interrupt indien gewenst)

Ik heb gekozen voor Comparator2 van de PIC16F1847.
A.3 is de +Vin.
A.2 is de -Vin.
A.4 is de VOut

A.2 naar GND, A.3 via een C van 103K naar de output van de AD9833.
Pull down weerstand van de Vin+ naar Gnd (680k).

De registers:



ANSELA     =  %00001100                   'A2 A3 Analog
TRISA      =  %00001100                   'Port A2, A3 input
CM2CON0    =  %10100111
CM2CON1    =  %00000000

Er komt evenwel niets uit de output, behalve wat 'gepruttel' met een heel lage spanning.

Ik doe dus ergens iets fout...

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

De plus van de comparator hoef je niet naar buiten te brengen, kun je intern aan Vss hangen (of aan de DAC voor een andere offset spanning)

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

Golden Member

Dit begrijp ik even niet...

Ik las:

Je kunt de min van de comparator aan Gnd leggen, en het signaal via een condensator aan de plus van de comparator leggen.
(met een hoogohmige pull-down aan de comparator plus (1M of zo) om de juiste offset te hebben.)

Pin op analoog zetten, comparator enablen, en kiezen welke pinnen je wilt gebruiken. (de min van de comparator blijft intern)

Maar nu:

De plus van de comparator hoef je niet naar buiten te brengen, kun je intern aan Vss hangen (of aan de DAC voor een andere offset spanning)

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Daarbij twijfel ik zelf of ik de pinnen wel goed heb:

Ik vind deze datasheet wat lastig te lezen omtrent die comparators.

Hieruit destilleerde ik

A3 = Vin+
A2 = Vin -
A4 = Vout

Maar helemaal zeker ben ik er dus niet van.
Waarschijnlijk verkeerd, krijg het niet aan de praat...

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Op woensdag 25 december 2024 14:44:12 schreef Arco:
De plus van de comparator hoef je niet naar buiten te brengen, kun je intern aan VSS hangen (of aan de DAC voor een andere offset spanning)

[bijlage]

Ik zie nu wat je bedoelt.

Je kunt met deze PIC16F1847 de input kiezen op de + en - ingangen.
Dat wordt dan geregeld in het CM2CON1 register.
En voor de + ingang kun je instellen dat hij aan VSS hangt.
Voor de - ingang heb ik gekozen voor C12IN0-
In dit geval is dat Poort A.0, pin 17.

Dus hoef ik in principe het signaal aan te bieden tussen GND en pin 17.
De pull-down weerstand heb ik dus ook tussen pin 17 en GND geplaatst.
Ik test met een signaal van 18 KHz, spanning varieert tussen -2v en +2V

En een heel simpel testprogrammaatje gemaakt, dat hoeft eigenlijk niks te doen, behalve de register-settings.



Program Comp

main:

  ANSELA     =  %00001111                   'A0 A1 A2 A3 analog
  TRISA      =  %00001111                   'Port A0, A1, A2, A3 input
  OSCCON     =  %01110000                   '8Mhz internal

  CM2CON0    =  %10100111
  CM2CON1    =  %00110000                   '- To C12IN0-, + to VSS

While True Wend


end.

Echter, niet geheel onbelangrijk, komt er helemaal niets op C2OUT (Poort A.4, pin 3)...

Fouten zijn het bewijs dat je het probeert..

Comparator hysteresis is typ 45mV, misschien is het beter om deze uit te zetten

Guus@Sint-Michielsgestel
Bavelt

Golden Member

Op donderdag 26 december 2024 13:09:04 schreef Waters:
Comparator hysteresis is typ 45mV, misschien is het beter om deze uit te zetten

Heb ik geprobeerd, helpt niet.

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

De COUT pin heb ik nog nooit gebruikt, verwerk het resultaat altijd intern... ;)

Maar de A4 pin geeft om de een of andere reden niet de staat weer, LATB.0 = CMOUT.1 doet dat wel? :?
(leest de interne staat van de comparator en geeft die via LATB.0 weer...)


Program Comp

main:

  ANSELA     =  %00001111                   'A0 A1 A2 A3 analog
  TRISA      =  %00001111                   'Port A0, A1, A2, A3 input
  TRISB      =  %00000000
  OSCCON     =  %01110000                   '8Mhz internal

  CM2CON0    =  %10110111
  CM2CON1    =  %00010000                   '- To C12IN0-, + to DAC
  DACCON0    =  %11000000
  DACCON1    =  %00000111

While True
  Latb.0 = CMOUT.1
Wend
end.
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Arco

Special Member

Probleem(oorzaak) wel gevonden...

Jij zet het CM2CON0.0 bit op '1' (default = 0). Dit synchroniseert de comparator output met timer1.
Daar timer1 niet aan staat, gebeurt er nooit meer iets op de comparatoroutput (die wacht eeuwig op timer1... :+ )

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

Golden Member

Wow, datga ik vanavond proberen. Ben nu niet thuis..

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Na de kerstverplichtingen maar weer eens aan de slag.

Het programma is nu:



Program Comp

main:

  ANSELA     =  %00001111                   'A0 A1 A2 A3 analog
  ANSELB     =  %00000000                   'All Port B Digital
  TRISA      =  %00001111                   'Port A0, A1, A2, A3 input
  TRISB      =  %00000000                   'All Poert B Output
  OSCCON     =  %01110000                   '8Mhz internal

  CM2CON0    =  %10110111
  CM2CON1    =  %00010000                   '- To C12IN0-, + to DAC
  DACCON0    =  %01110000
  DACCON1    =  %00000111

While True
  LATB.0 = CMOUT.1
Wend
end.

@Arco, ik zie dat je de +in van comparator 2 nu aan een DAC hebt gehangen ipv Vss.

Vin blijft A.0 ( pin 17).

Het verhaal met die Timer snapte ik al niet in de Datasheet.
Maar alles is nu volgens mij aangepast.

Toch blijft het helemaal dood op zowel A.4 en LATB.0... ;(

Edit: moet bit 7 van DACCON0 niet op enabled staan?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Bit 7 moet inderdaad '1' zijn. (Vss kun je ook gebruiken, maar meestal wordt de DAC gebruikt, omdat je het nivo dan in kunt stellen)
Met een schakelaar als test aan de input werkt 't hier prima...

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

Golden Member

Als ik naar DACCOCON1 kijk, %00000111, en uit de datasheet de formule

bit 4-0 DACR<4:0>: DAC Voltage Output Select bits
VOUT = ((VSOURCE+) - (VSOURCE-))*(DACR<4:0>/(2^5)) + VSOURCE-

invul, dan kom ik uit op 5 - 0/32 + 0 = 5V uit.
Was dat de bedoeling? Waarom dan die '00111' in bit 4:0?

Edit: Ik heb een ledje gehangen aan B.0. En als ik dan een schakelaar met pull-up weerstand aansluit op pin 17 (A.0), dan gaat het ledje inderdaad uit.
bij het sluiten.
Dat is al hoopvol.

Maar nu is blijkbaar de +5V de referentie?

[Bericht gewijzigd door Bavelt op vrijdag 27 december 2024 13:17:17 (28%)

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Referentie zomaar even gekozen: met een schakelaar als test maakt de exacte spanning weinig uit.
In dit geval: 7 * 0.15625v = 1.09v.
%00000111 is 7/32
1 stap is dan 5v/32 = 0.15625v

Als je DACCON0.5 op '1' zet komt de spanning ook nog naar buiten (op de DACOUT pin) om te kunnen controleren/meten.

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

Golden Member

Niet te geloven..
Het werkt nu ook nog... :) :)

Zowel op een blok-signaal blok-ingangetjes als een sinus

@Arco, Mijn dank!

Twee dagen peinzen (en af en toe hem even smeren uit het kerstgeweld) uiteindelijk toch beloond...

[Bericht gewijzigd door Bavelt op vrijdag 27 december 2024 14:18:07 (12%)

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Op vrijdag 27 december 2024 14:17:22 schreef Bavelt:
Niet te geloven..
Het werkt nu ook nog... :) :)

Ik gebruik de comparators al ruim 20 jaar, dus aan de werking twijfelde ik niet echt... :+
Mooi dat 't werkt...

Met de referentiespanning kun je dus de 'drempel' (omslagpunt) van de comparator instellen...

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

Golden Member

Op vrijdag 27 december 2024 14:47:08 schreef Arco:
[...]
Ik gebruik de comparators al ruim 20 jaar, dus aan de werking twijfelde ik niet echt... :+
Mooi dat 't werkt...

Met de referentiespanning kun je dus de 'drempel' (omslagpunt) van de comparator instellen...

Ja, dat werkt geweldig!

Met onderstaand testje kan ik het zien werken:



For i1 = 7 to 15
   Daccon1 = i1
   Delay_ms(1500)
  Next i1

En dan meten op A.2, pen 1.

Omdat ik nu B.0 gebruik om de CMOUT uit te lezen, ben ik wel een extra poort kwijt. Die had ik hard nodig omdat er naast de AD9833 ook een Oled SPI-displaytje aan hangt.

Maar ik heb gezien dat ik Poort A.1 en Poort A.3 kan gebruiken als gewone poort als ik alleen maar Comparator 2 gebruik.

Voor het displaytje gebruik ik dan nu ook een softwarematige SPI, omdat bij gebruik van de hardware SPI en SPI1_Init() sommige poorten configureert.

Dus ga ik nu maar eens alles in elkaar knutselen. Die PCI16F1847 krijgt het heel druk... :)

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

O ja, en wanneer/waarbij zet je nu de 'Hysteresis' Aan?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Dat is de afstand in mV tussen in en uitschakelen (om 'zenuwachtig' gedrag te voorkomen)
Als je de comparator output extern niet nodig hebt kun je die ook uitzetten (heb je weer een pin over...)

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

Golden Member

Nou, het loopt allemaal als een tierelier.
Dat geef een hoop voldoening. Veel tijd in gestoken, veel hulp gehad, veel geleerd.

Het is dus een projectje geworden dat een signaal als output geeft, instelbaar tussen 0 en 12 Mhz.
Het signaal wordt geleverd door een AD9833 generator-printje. De ingestelde frequentie is af te lezen op een 0,96"OLED schermpje.
De vorm van het signaal is te kiezen uit sinus, triangel of blok.
De microcontroller is PIC 16F1847 en het programma is gemaakt in MikroBasic van Mikroe.

Edit: omwille van de omvang van de code en de post heb ik het project als .zip toegevoegd.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Alles werkt nu. En nog een beetje verder onderzoekend:

Ik gebruik Poort A.4 als output door de interne output van comparator 2 naar A.4 te brengen:


---
 Dim CMP2_OUT    As sbit At LATA.4       'pin 3                  'Output Comparator

CM2CON0    =  %10010111                    'CMOUT pin disabled
---
---
While True 
    LATA.4 = CMOUT.1
  Wend                                     'Dummy endless loop

Dit werkt.

Nu is A.4 ook de natuurlijke pin voor CM2OUT.

Dus dacht ik in mijn onschuld, als ik nu de CMOUT pin
enable, zou het effect hetzelfde moeten zijn:


---
CM2CON0    =  %10110111                   'CMOUT pin enabled
---
---
While True Wend

Maar op die output pin komt dan niks. Dat zou toch moeten werken?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

TRISA en ANSELA staan wel op output resp. digital voor de A4 pin?

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