Jump to content

Search the Community

Showing results for tags 'ad9850'.

More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


  • News
    • Announcements
    • Suggestions
    • New users say Hi!
  • Spotlight!
    • Sponsor Spotlight
    • Sponsor Giveaways
  • Energia
    • Energia - MSP
    • Energia - TivaC/CC3XXX
    • Energia - C2000
    • Energia Libraries
  • MSP Technical Forums
    • General
    • Compilers and IDEs
    • Development Kits
    • Programmers and Debuggers
    • Code vault
    • Projects
    • Booster Packs
    • Energia
  • Tiva-C, Hercules, CCXXXX ARM Technical Forums
    • General
    • SensorTag
    • Tiva-C, Hercules, CC3XXX Launchpad Booster Packs
    • Code Vault
    • Projects
    • Compilers and IDEs
    • Development Kits and Custom Boards
  • Beagle ARM Cortex A8 Technical Forums
    • General
    • Code Snippets and Scripts
    • Cases, Capes and Plugin Boards
    • Projects
  • General Electronics Forum
    • General Electronics
    • Other Microcontrollers
  • Connect
    • Embedded Systems/Test Equipment Deals
    • Buy, Trade and Sell
    • The 43oh Store
    • Community Projects
    • Fireside Chat
  • C2000 Technical Forums
    • General
    • Development Kits
    • Code Vault
    • Projects
    • BoosterPacks


There are no results to display.

Find results in...

Find results that contain...

Date Created

  • Start


Last Updated

  • Start


Filter by number of...


  • Start



Website URL





Found 6 results

  1. Fmilburn


    I was inspired a while back by the simplicity of the FFT application written by Shane Ormond and featured on the 43oh blog. It was easy to duplicate and I've made a few changes, additions, and such that seemed worth documenting. I didn't have a signal generator other than the 1kHz square wave on my oscilloscope and some clunky code that I wrote for a microcontroller so I ordered an inexpensive AD9850 and hooked it up to a FR6989 LP so I could use the LCD to display frequency. I've been pleased with the AD9850 and it is hard to beat it for the price. The sine wave is more than sufficient for my needs up to 40 MHz - I don't see any deviation from the scope. The code is here. This is a picture of the setup being tested on the oscilloscope and nailing it: I need to make a little boosterpack for this so it is a little handier to use. I made several modifications to Shane's code: Number of samples can be specified Bin readings are matched with corresponding frequency interval Frequency resolution of bins can be set Frequencies of up to 5 kHz or more can be measured I used a MSP-EXP432 for the most part but the code was also tested and works on the TM4C123. You really need an ARM to get this granularity. The code is here. To increase the sample size and allow measurement up to higher frequencies I used Energia's delayMicroseconds instead of millis. The right way to do this would be with timers and I hope to come back and address this at some point. To calibrate the bins to their actual frequencies I used a simple one step approach with a single pass that measures the deviation in the sampling time from expected to actual. Deviations occur due to the lag associated with Energia code and the actual time it takes to sample. Precision depends on the bin size and number of samples as well as inaccuracies in using delayMicroseconds. I posted the serial output into a spreadsheet to get some plots... 1000 Hz Square Wave 1000 Hz Sine Wave 5000 Hz Sine Wave My original goal was to create something that could process sound in the range of human hearing and this pretty much gets there. I need to clear my desk for another project but hopefully I get back to it some day or perhaps someone else will find it interesting and report back This is my list of potential improvements: use timer for sampling times add a microphone improve the graphical display / GUI It would be neat to get this working on an Educational BoosterPack.
  2. This project uses an inexpensive AD9850 board obtained off eBay to create a frequency generator boosterpack that is especially useful with the MSP-EXP430FR6989 LaunchPad. It features an encoder with a pushbutton to adjust frequency. In the photo below it is generating a 7000 Hz signal which agrees nicely with the oscilloscope. The schematic is simple: The encoder is a Bourns 652-PEC12R-4225F-S24. I tried various arrangements and value of resistors and capacitors for debouncing the encoder and switch. In the end I just added some capacitance as shown in the schematic. On the oscilloscope it looked pretty clean so I called it good enough. All the parts are through hole as seen in the photograph below: The fit is tight but fortunately all the materials were on hand when the PCB was being designed so I printed out a paper PCB outline and checked it before ordering. If I were making it again I would increase the size of the board a bit to allow larger/additional labels. Otherwise, everything works and it turned out fine. This is a picture of the unpopulated boards I received from Osh Park. While it should work with most LaunchPads I had the FR6989 in mind as I developed it - in particular I wanted to use the integrated LCD display. Accordingly, I was careful not to obscure the display or the reset button. The software was developed with Energia V17. Here is a photo of what it looks like in operation: The output from the AD9850 comes out the jumpers attached to the 90 degree male header pins marked with arrow A. The dark jumper wire is GND and the sine wave is coming out of the lighter wire on the right. Adjustments are made with the encoder knob marked by arrow B. Turning it adjusts the frequency up and down and the current value is output on the LCD as shown by the arrow C. The range is from zero to 32 MHz. Since fine adjustment is desired, as well as rapid adjustment, the push button on the encoder is used to change the coarseness of the adjustment. The magnitude is indicated by the battery indicator on the LCD as shown by arrow D. For example, in the photo three battery bars are showing which indicates that each adjustment/click of the encoder will change the output by 1000 Hz. When the encoder is pushed down it will cycle through in this case to 100 Hz adjustment (with two bars showing), 10 Hz (one bar), 1 Hz (no bars), and then up to 1 MHz (six bars), and so on. In practice, it adjusts pretty quickly with good resolution. One enhancement might be to have the software scroll the output value since as is it won't display full resolution due to the 6 digit screen. The Energia sketch can be found here. I have an extra PCB so if you are active in the 43oh forums and would like it then send me a personal message and I will mail it gratis.
  3. This is the Energia version of the library I shared here. You can find this function generator module easily in eBay for about $5 It has the same functions but this time the library features a object-oriented structure, which allows to manage several AD9850 modules at once. It works perfectly for both MSP430 and Stellarpad boards (tested), you just need to change the given pin numbers when you create the AD9858 class instance. class AD9850{ public: AD9850(int givenW_CLK, int givenFQ_UD, int givenDATA, int givenRESET); void init(); void doReset(); void osc(double Freq,double phase); void sweepUp(double minFreq, double maxFreq, double inc, int cyclesPerDelay); void sweepDown(double minFreq, double maxFreq, double inc, int cyclesPerDelay); void sweepLoop(double minFreq, double maxFreq, double inc, int cyclesPerDelay); void powerDown(); private: int W_CLK; int FQ_UD; int DATA; int RESET; }; This is a main code example for the Stellarpad: #include "ENERGIA_AD9850.h" void setup(){ pinMode(PE_5, OUTPUT); pinMode(PA_5, OUTPUT); pinMode(PA_6, OUTPUT); pinMode(PA_7, OUTPUT); AD9850 device(PE_5, PA_5, PA_6, PA_7); device.init(); device.doReset(); // min frequency = 1Hz, max frequency = 10000Hz // 1Hz steps, waiting 1000 Cycles between changing frequency. device.sweepLoop(1, 10000, 1, 1000); } void loop(){} //do nothing And the result will be something like this: You can download the codes attached to this post. Please unlock cpp and .h this time sorry for the inconvenience. You can temporally download them here. .cpp .h
  4. gonya707

    FM synthesizer

    This is a FM synthesizer made for the Stellarpad using the AD9850 function generator. The FM synthesis is teorethicaly the same as the all-known frequency modoulation used for radio communications, but in this case the frequencies are suited to stay at the audio range, i.e. from 20Hz to 20kHz. Basically The AD9850 is used as a sine wave generator, and the microcontroller create each cycle a sample of ANOTHER sine wave, this one goes from 5Hz to 100Hz more or less. We can modulate this two sinewaves, the AD signal being the carrier and the stellaris signal the baseband. The outcoming spectrum can be represented by the Bessel functions for each harmonic, making some interesting sounds for electronic music. Attaching two potentiometers we can control the baseband sine frequency and its amplitude, thus controlling the modulation index. This is a recording I made with this project (is there any way to display souncloud embed on the forum?): https://soundcloud.com/gonya707/fm-synthesizer-grsynth-com The first seconds were non-modulated waves and then I pressed a note (C3 if I recall correctly) and played with the potentiometers.. This is a simplfied schematic of the project. The complete schematic of each module can be found respectively here: AD9850 module: http://www.analog.com/static/imported-files/data_sheets/AD9850.pdf MIDI boosterpack by RobG: http://forum.43oh.com/topic/1773-midi-booster-pack/page-3#entry23763 And finally, this is the main code for this project: // // FM Synthesizer for Stellaris Launchpad and AD9850 // Coded by Gonzalo Recio // #include "inc/hw_types.h" #include "inc/hw_memmap.h" #include "driverlib/sysctl.h" #include "driverlib/gpio.h" #include "inc/hw_gpio.h" #include "inc/hw_sysctl.h" #include "driverlib/pin_map.h" #include "driverlib/uart.h" #include "inc/hw_ints.h" #include "driverlib/interrupt.h" #include "driverlib/adc.h" #include "math.h" #include "midi.h" #include "STELLARIS_AD9850.h" #define PI 3.141592 #define GPIO_PB0_U1RX 0x00010001 #define GPIO_PB1_U1TX 0x00010401 // Global variables unsigned long message; unsigned long note, velocity; int on=0, off=0; int flagON = 0, flagOFF = 0; unsigned short i = 0, z,y; float t = 0; float freq = 0; unsigned long ulADC0_Value[4]; int main(void){ //50MHz clock SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN); //enable UART for MIDI T/R SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); GPIOPinConfigure(GPIO_PB0_U1RX); //B0 receptor GPIOPinConfigure(GPIO_PB1_U1TX); //B1 transmitter GPIOPinTypeUART(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1); UARTConfigSetExpClk(UART1_BASE, SysCtlClockGet(), 31250, (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE) ); //enable AD9850 SysCtlPeripheralEnable(PORT_ENABLE); GPIOPinTypeGPIOOutput(PORT, W_CLK|FQ_UD|DATA|RESET); AD9850_Init(); AD9850_Reset(); //ADC0 config SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0); SysCtlADCSpeedSet(SYSCTL_ADCSPEED_125KSPS); ADCHardwareOversampleConfigure(ADC0_BASE, 4); ADCSequenceConfigure(ADC0_BASE, 1, ADC_TRIGGER_PROCESSOR, 0); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE); GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_4|GPIO_PIN_5); ADCSequenceStepConfigure(ADC0_BASE, 1 , 0 , ADC_CTL_CH8 ); ADCSequenceStepConfigure(ADC0_BASE, 1 , 1 , ADC_CTL_CH9 | ADC_CTL_IE | ADC_CTL_END); ADCSequenceEnable(ADC0_BASE, 1); ADCIntClear(ADC0_BASE, 1); //Begin the interrupt detection IntMasterEnable(); IntEnable(INT_UART1); UARTIntEnable(UART1_BASE, UART_INT_RX | UART_INT_RT); while(1){ if (on == off){ AD9850_PowerDown(); } else{ ADCProcessorTrigger(ADC0_BASE, 1 ); while(!ADCIntStatus(ADC0_BASE, 1 , false)){ } ADCIntClear(ADC0_BASE, 1 ); ADCSequenceDataGet(ADC0_BASE, 1 , ulADC0_Value); AD9850_Osc(freq + y*sin(t), 0); } z=(ulADC0_Value[0] / 4 ) + 1; y=(ulADC0_Value[1]); i=(i + 1) % z; //timescale between 0 and 2*pi t=((float)i / (float)z ) * 2 * PI; } } //uart1handler void UARTIntHandler(void){ IntDisable(INT_UART1); unsigned long ulStatus = UARTIntStatus(UART1_BASE, true); //get interrupt status. RX or RT? UARTIntClear(UART1_BASE, ulStatus); //clear the asserted interrupts while(UARTCharsAvail(UART1_BASE)){ //loop while there are chars message = UARTCharGetNonBlocking(UART1_BASE); if(flagON){ // if the last message was a note ON, then this message is on++; // the note code. if (note != message){ note = message; freq = code2Freq(note); } } else if(flagOFF){ off++; } flagON = isNoteOn(message); flagOFF = isNoteOff(message); } IntEnable(INT_UART1); } The codes for the AD9850 library were also made by me, you can find them in this other thread. The MIDI library used in this project is here midi.c, midi.h. I was also the author for this one. If you don't have a MIDI boosterpack I've made also a no-MIDI version, the on-board switches trigger two different notes. You still need to attach a potentiometer to E4 and E5 though. You can find this version HERE.
  5. Hi there. First of all I'm not sure if I should post this here or inside another section fo the forum, apologies if I made a mistake. Probably some of you already know this IC, the AD9850. Its a sine and square wave generator with output frequencies between 0Hz and...more than 60MHz! Due to its very low price (around $5 on eBay) and usefulness, it is definitively a module everybody should have if you can't afford a function generator. This library comes with several functions you might find useful: /* Starts AD9850 operation changing its value to "all zeros". * Refreshes previous status from the microcontroller.*/ void AD9850_Init(void); /* Reset operation for the AD9850. This function must be called before using AD9850_Osc * first time in the execution (check page 12 on datasheet) */ void AD9850_Reset(void); /* Sets the DDS sine and square oscillator to the detailed "frequency" and "phase" variables. * "frequency" will be turned into a 32 bit word, so the frequency will have a resolution of 0.0291 Hz * with a 125 MHz reference clock. "phase" will be a 5 bit word instead so the resolution is * 11.5 degrees, or pi/32 radians. */ void AD9850_Osc(double frequency, double phase); /* Enables power down mode. This method is used for a quick "all outputs" disable. * The effect is the same as AD9850_Osc(0,0), but it takes less clock cycles */ void AD9850_PowerDown(void); /* Performs a frequency sweep increased in "inc"Hz steps. The frequency order is from low to high * and resets to the lower frequency when maximum frequency is reached. */ void AD9850_Sweep_Up(double minFreq, double maxFreq, double inc, int cyclesPerDelay); /* Performs a frequency sweep decreased in "inc"Hz steps. The frequency order is from high to low * and resets to the higher frequency when minimum frequency is reached. */ void AD9850_Sweep_Down(double minFreq, double maxFreq, double inc, int cyclesPerDelay); /* Performs a frequency sweep increased in "inc"Hz steps. The frequency order is from low to high, * but it changes to from high to low when the maximum frequency is reached and so on. */ void AD9850_Sweep_Loop(double minFreq, double maxFreq, double inc, int cyclesPerDelay); Inside your main code you only need to include the library and init the module: //AD9850 config SysCtlPeripheralEnable(PORT_ENABLE); GPIOPinTypeGPIOOutput(PORT, W_CLK|FQ_UD|DATA|RESET); AD9850_Init(); AD9850_Reset(); //frequency = 10000Hz, phase = 0 rad AD9850_Osc(10000, 0); And that's it. You can download the codes attached to this post. I hope you find them useful. STELLARIS_AD9850.c STELLARIS_AD9850.h
  6. Hi, This will ring a bell to radioamateurs (HAM radio) but other may just ignore... I have posted to my blog a code for a simple VFO (Variable Frequency Oscillator) or better said an RF frequency generator using an AD9850 DDS chip. This code is simple and has no special trick but might give you inspiration. http://xv4y.radioclub.asia/2013/03/19/code-source-vfo-avec-dds-ad9850ad9851-et-launchpad-msp430/ The pins are "wired" for my WSPR agile beacon generator kit, but everything can be changed to your taste or needs. The text of the blog article is in french but has no additional information than the one in the source code (commented in english). The needed libraries are on my download page : http://xv4y.radioclub.asia/boutique/docs/ Regards, Yannick.