PIC, Analoog naar Frequentie converter (0...10V -> 0...4000Hz)

Analoog naar frequentie converter,
van 0 tot 10V omzetten naar 0 tot 4000 Hz

Is dit mogelijk met een PIC 16F676 ?

Ik denk eraan om de 0..10V te delen, naar 0...5V.
De ze via een AD Converter omzetten.

Wie heeft er tips ?

-de interne timer gebruiken voor het frequentiesignaal.
-een externe DDS eraan hangen (bijv AD5933 en dan alleen het generatordeel misbruiken)

AD5933 - 1 MSPS, 12 Bit Impedance Converter Network Analyzer
Hoe werkt zo'n AD5933 ?

Is het niet mogelijk om alles in een PIC te programmeren, dus zonder zo'n AD5933 ?

Wat voor signaal wil je ? sinus/blok.
DC2PCC gaf al aan: interne timer gebruiken voor het frequentiesignaal.

Een Blok signaal is waarschijnlijk voldoende

Als je de 10-bit ADC gebruikt krijg je 4000/1024=3.9 Hz per stapje, bij 8-bit 4000/256=15.6Hz per stapje.
Met een opamp kan de spanning downscalen.

[Bericht gewijzigd door RES op ]

Stel ik schrijf een stukje code dat continu een uitgangs (waarde afhankelijk) met een bepaalde freq. aanstuurt.

Op bepaalde momenten schakel ik de AD Converter in !
Zodra ik deze AD Converter inschakel, dan heeft dit waarschijnlijk invloed op de freq. omdat de processor dan met 2 processen bezig is.

Hoe kan dat opgelost worden ?

Op 23 november 2005 22:39:37 schreef MMSoft:
Stel ik schrijf een stukje code dat continu een uitgangs (waarde afhankelijk) met een bepaalde freq. aanstuurt.

Op bepaalde momenten schakel ik de AD Converter in !
Zodra ik deze AD Converter inschakel, dan heeft dit waarschijnlijk invloed op de freq. omdat de processor dan met 2 processen bezig is.

Hoe kan dat opgelost worden ?

Telkens tussen het schakelen van de uitgangpin kan je wat doen.
Je hebt telkens T/2 de tijd, bij 4000 Hz dus telkens 125usec.
In die tijd kan je een heleboel instructies uitvoeren.

Op 23 november 2005 23:33:08 schreef RES:
[...]
Telkens tussen het schakelen van de uitgangpin kan je wat doen.
Je hebt telkens T/2 de tijd, bij 4000 Hz dus telkens 125usec.
In die tijd kan je een heleboel instructies uitvoeren.

En bij 3999 Hz ?
Maar even zonder grappen en grollen, je moet interrupts en timers gebruiken. Een software DDS is een oplossing (beetje overkill maar daar kan je ook b.v. sinussen me opwekken).
Google eens op "Direct Digital Synthesizer".

Is lastig om dit zo even 1 2 3 te maken denk ik.
Wil je van 0 t/m 4000Hz in 1Hz stapjes regelen?
Ik zou gaan voor 16-bit fast PWM en een RC erachter, dan via een sinustabel, dus de interne PWM functies benutten.
Een DDS chip is het simpelste als output... maar ook nog een input nodig.
Als je van 0 - 10V (terug naar 0 - 5V) gaat inlezen op de ADC heb je minimaal 12-bit resolutie nodig om die 4000 stapjes in te krijgen (als je 1Hz stapjes wilt) Een 12-bit ADC lijkt hier dus nodig te zijn.
Alles 16-bit zou het mooiste zijn, dan 4000Hz/65535=0.06Hz per stapje, dan wordt het als het ware weer analoog. (gebruiker merkt het niet meer.)
Geen simpel project.

PS. Je kan wel 12-bit resolutie behalen door 16x oversampling van de 10-bit ADC van de PIC (weet niet of er PIC's zijn met een 12-bit ADC?)

Ik denk eraan om het eerst met 256 stappen te maken.

Als je het datablad van die AD-chip opgehaald hebt (heb je blijkbaar) en er eens in gesnuffeld hebt, dan zie je dat dat chipje een DDS-synthesizer aan boord heeft, die van 0Hz tot 100 kHz te programmeren is. Me dunkt dat je daar een signaal van 0 tot 4 kHz uit kunt peuteren. het hele analysergedeelte gebruik je gewoon niet. Zo'n chipje is goedkoop en simpel te gebruiken. je kunt natuurlijk ook voor een 'normale' DDS van analog dev. nemen, maar da's misschien overkill.

Als het niet exact hoeft te zijn, dan een max038 of een ander VCO-chipje. Nadeel is dat die wat driften.

Er is nog een manier mogelijk, kwam ik vandaag ineens op terecht. Dat is een digital potmeter ipv een DDS chipje. (minder snel.)
Ik heb hier een AD5231, de clockcycle daarvan is 20nsec, dus 4000Hz red je makkelijk.
Je kan de RDAC (de loper) daarvan rechtreeks beschrijven, dus kan je sinus (of wat dan ook voor signaal, max. 10bit resolutie) getallen vanuit een tabel in een microcontroller erin laden.
Ik weet niet wat die DDS chipjes kosten maar zo'n digipot kost ook niet al te veel. (anders even een monster aanvragen. :) )

Ik dacht gewoon alles in 1 PIC programmeren, zou dat niet mogelijk zijn ?

Op 26 november 2005 17:16:24 schreef MMSoft:
Ik dacht gewoon alles in 1 PIC programmeren, zou dat niet mogelijk zijn ?

Jawel, dat is mogelijk.

Domme vraag misschien, maar misschien beter analoog?

Ik ben nu bezig met een PIC16F876A.
Daarin zet ik de Analoge waarde om in een waarde 0...255
Ook maak ik een Blok signaal met de PWM (50/50%).

Ik ben nu aan het stoeien, om de waarde 0...255 te koppelen aan de PWM, zodat ik een freq. 0...4000Hz krijg, maar dat lukt nog niet !

Gegevens:
PWM: Gestuurd door Timer2
Timer2: Prescaler=1:4, Postscale=1:1, Periode=D'255'

Wie kan mij een zetje ik de juiste richting geven ?

Op 29 november 2005 11:55:11 schreef MMSoft:
Ik ben nu aan het stoeien, om de waarde 0...255 te koppelen aan de PWM, zodat ik een freq. 0...4000Hz krijg, maar dat lukt nog niet !

Met de Hardware PWM module gaat dat ook niet lukken.

Je hebt het jezelf nogal moeilijk gemaakt door van 0..4000 Hz te willen. Van 4000 tot 8000 Hz zou veel makkelijker zijn. Dit omdat in de laatste situatie de hoogste frequentie maal twee maal de laagste frequentie is. In jouw geval is dat 4000X (laten we de 0 Hz even vergeten.

Maar reken eens uit wat met TMR2 + PWM module de hoogst (periode = 2) en de laagst (periode = 255) mogelijke frequentie is. Het resultaat hangt trouwens wel van je kristalfrequentie af.

Ik ben nu aan het stoeien, om de waarde 0...255 te koppelen aan de PWM, zodat ik een freq. 0...4000Hz krijg, maar dat lukt nog niet !

Dan krijg je dus 4000 / 256 = 15.625 Hz per stapje.
15.625 Hz betekent een periodetijd van precies 64 msec.

Het nieuwe PWM getal per stapje kan je zo laten berekenen.
Van 4000 een 16bits getal van maken (2 registers), van 256 ook (nog 2 registers), dan die twee 16 bits getallen op elkaar delen, dan krijg je exact 15.625 Hz verschil per stapje. (0 - 255)

Ok, maar hoe pak ik dat aan ?
Ik bedoel wat stel ik in bij Timer2:
Prescaler = ?, Postscale = ?, Periode = ? Etc. Etc.

Op 29 november 2005 13:08:55 schreef MMSoft:
Ok, maar hoe pak ik dat aan ?
Ik bedoel wat stel ik in bij Timer2:
Prescaler = ?, Postscale = ?, Periode = ? Etc. Etc.

Weet niet, dit lijkt basic te zijn.
De prescaler is om de xtal te delen zodat je timer niet meer zo snel rondjes telt.
De snelste tijd die je nodig hebt is 64msec / 256 = 250 usec, want 1/ 250 usec = 4000 Hz.
Dus als je xtal 4MHz is en prescaler 256, dan zit je op 64msec, alleen timer2 moet wel een 8bit timer zijn, zodat elke timertick 250 usec wordt. (256 * 250 usec = 64 msec)

Paarlen voor de zwijnen :(

MMSoft: reken nou eens de frequentie van de PWM module uit met een period waarde van 2, 100 en 255. En trek dan de conclusie of het wel of niet kan (0 tot 4000 Hz) met de hardware PWM in de PIC.

Ik weet niet of RES periode en frequentie door elkaar haalt of de TMR2 module in de PIC niet kent (of beide), maar het kan dus niet met de hardware PWM module.

Is er geen PIC met een fast PWM aan boord?
Een AVR kan bijv. een PWM van 250kHz eruit gooien met de fast PWM functie, zou toch denken dat er ook een PIC is die dit aan boord heeft?

http://www.winpicprog.co.uk/pic_tutorial8.htm

Hier staat een verhaal. Lijkt erop dat de PIC geen fast PWM heeft. Dan zelf een routine schrijven, eigenlijk is het geen PWM wat je nodig hebt, maar een blokgolf.

Jammer dat de hardware PWM hiervoor niet geschikt is.
Dan zit er niets anders op dan een softwarematige PWM/Blokgolf

Ik voorzie wel 1 probleem, de software PWM loopt continu. Als nu de AD converter bezig gaat, dat dit invloed heeft op de PWM !

Op 29 november 2005 13:56:25 schreef MMSoft:
Jammer dat de hardware PWM hiervoor niet geschikt is.
Dan zit er niets anders op dan een softwarematige PWM/Blokgolf

Ik voorzie wel 1 probleem, de software PWM loopt continu. Als nu de AD converter bezig gaat, dat dit invloed heeft op de PWM !

Zolang die conversietijd minder dan 125 usec duurt kan het, dan kan je de ADC precies uitlezen tussen de flanken door.