Controller van TS heeft comparators aan boord, die zijn uitstekend geschikt om frequentie te meten...
Special Member
Controller van TS heeft comparators aan boord, die zijn uitstekend geschikt om frequentie te meten...
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.
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.
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...
Special Member
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)
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)...
Comparator hysteresis is typ 45mV, misschien is het beter om deze uit te zetten
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.
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.
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... )
Golden Member
Wow, datga ik vanavond proberen. Ben nu niet thuis..
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?
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...
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%)
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.
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%)
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...
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...
Golden Member
O ja, en wanneer/waarbij zet je nu de 'Hysteresis' Aan?
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...)
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.
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?
Special Member
TRISA en ANSELA staan wel op output resp. digital voor de A4 pin?