Jump to content

gonya707

Members
  • Content Count

    19
  • Joined

  • Last visited

  • Days Won

    4

gonya707 last won the day on December 7 2013

gonya707 had the most liked content!

About gonya707

  • Rank
    Member

Contact Methods

  • Website URL
    http://grsynth.com

Profile Information

  • Gender
    Male
  • Location
    Madrid Spain

Recent Profile Visitors

267 profile views
  1. gonya707

    HAPPY NEW YEAR!!!

    Happy new year everybody
  2. 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.
  3. 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.
  4. gonya707

    Using Hardware PWM on Tiva Launchpad

    @@brownfox Using PMW on Energia should be easier. Just try something like this as an example: #define FREQ 50000 //Hz #define PIN PD_0 //pin D0 void setup(){ analogFrequency(FREQ); } void loop(){ int i=0; analogWrite(PIN, i); i = (i + 1) % 256; delay(30); }
  5. gonya707

    Using Hardware PWM on Tiva Launchpad

    Hi @@brownfox I think you have to include PART_TM4C123GH6PM here, in the project properties, under predefined symbols: In your case use PART_TM4C123GH6PM instead of the LM4F120. Happy Christmas
  6. gonya707

    Serial.println won't work in setup

    Probably you are opening the serial monitor console after the mcu send the message. Just open the window and then push the RESET button to repeat all the code. If I recall correctly Arduino boards reset the status when you open the serial monitor, but energia doesn't.
  7. gonya707

    Stellaris Drum Machine

    @ Stellaris (I don't have a Tiva ) I though they were almost the same, I mean, is there any critical feature that makes coding for Stellaris not compatible for Tiva?
  8. gonya707

    Stellaris Drum Machine

    How come I didn't see this before? I'm already working on the MIDI support for this, and probably I'll make a drum version of my MIDI sequencer. Thank you for this useful resource.
  9. gonya707

    MicroPython

    It is an interesting project indeed, too bad the time for funding is gone, I would certainly donate some. I don't know anyone saying python is a bad language, so this will be a great excuse to getting started to learning it.
  10. Hello DARSHAN. Did you add DEBUG on the pre-defined symbols? In case you didn't, go to the project properties Build -> ARM Compiler -> Advanced options -> Predefined symbols and add: DEBUG Inside the Pre-Define NAME box. If this does'nt work, there is probably something more wrong in your project, be sure to check all the steps on the Stellaris Workbook for the Lab 5 Project (Page 91).
  11. I don't see much point on buying that Arduino board. For a few bucks more you can buy a tiva board which specs are greatly better. Also, where did this LGT88A8 processor come from? Google results only show me the same indiegogo webpage. -I don't want to start an Arduino vs. other boards war, but that's just what I think.- Anyway thanks for the link.
  12. gonya707

    LM4F120H5QR: Use UART1/2

    I guess you have tried already but, it should be something like this. UART2 RX and TX are pinned to D6 and D7 respectively, so: // Enable the peripherals used by this example. SysCtlPeripheralEnable(SYSCTL_PERIPH_UART2); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); // Set GPIO D6 and D7 as UART pins. GPIOPinConfigure(GPIO_PD6_U2RX); GPIOPinConfigure(GPIO_PD7_U2TX); GPIOPinTypeUART(GPIO_PORTB_BASE, GPIO_PIN_6 | GPIO_PIN_7); UARTConfigSetExpClk(UART2_BASE, SysCtlClockGet(), 115200, (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE)); //enable interrupts ... Also, Is there any special reason you need to use the ROM_* functions?
  13. 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
  14. gonya707

    AD9850 Library (DDS function generator)

    Thank you @@bluehash.
  15. 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
×