9 Replies Latest reply on Apr 28, 2014 8:02 AM by peteroakes

    GPIO produce sine wave

    fergie.grizella

      Hi

      I need the Pi to generate a pulsing sine wave signal. I managed to generate wave signal from the GPIO pin but only square wave with High-Low waveform. So I am wondering if the GPIO can generate the sine wave signal that I need?

      Also I have been using the function GPIO.PWM(pin,frequency) i was using it to generate 20kHz signal but when I check the output on oscilloscope it was only 862 Hz is this the maximum frequency of the PWM function or is there something wrong with my pi.

       

      I read somewhere the using python Rpi.GPIO library I can output up to around 40 kHz, and I was able to actually output 50 kHz from it but don't know why the it wouldn't output 20 kHz using the GPIO.PWM ().

      Can anyone tell me why or suggest another method that I could use?

       

      Thank you!

        • Re: GPIO produce sine wave
          michaelkellett

          The Pi is very limited as a sine wave generator. What frequency of sinewave do you want to generate and what kind of pulsing. How much noise and distortion is acceptable. Depending on the answers it may be possible to generate the signal without extra hardware ot it may not.

           

          MK

          1 of 1 people found this helpful
            • Re: GPIO produce sine wave
              fergie.grizella

              I need to generate pulsing 20 kHz signal. Is it possible?  I never thought about the noise and distortion .

              one solution that  I was thinking was to convert the square wave to sine wave outside of the pi with integrator, someone told me about this. Thanks for replying!

                • Re: GPIO produce sine wave
                  michaelkellett

                  You still haven't defined the signal well enough to make a good suggestion.

                  How long are the pulses, what rise/fall time, must the pulse be synchronous with the carrier (the 20kHz) ?

                   

                  You can't turn a square wave into a sine wave with an integrator - you can with a low pass or bandpass filter but the modulation would need to be applied after the filter otherwise you will get very slow rise and fall times. This is going to be tricky with an RPi without extra hardware. You can buy very cheap little DDS synthesisers on ebay (like New AD9850 DDS Signal Generator Module 0-40MHz Test Equipment | eBay ) - this could generate the 20kHz OK, you could use a second one to generate the modulation signal.

                   

                  One way you could do it with a Pi is to add a DAC to an  I2S ouput and genrate suitable signals in software - this will need a  kernel driver which you may have to write yourself.

                   

                  If you could expalin what the signal is for and how much you want to spend I could be  abit more helpful.

                   

                  MK

                  1 of 1 people found this helpful
                    • Re: GPIO produce sine wave
                      Roger Wolff

                      On a similar note (to the I2S suggestion), the raspberry pi has an audio output. If it can reach 20kHz I don't know. (chances are of course that it'll do 48kHz, meaning that you have only just over two samples per period, which is similar to the square wave. On the other hand, the analog filtering will probably make it look more sine-wave-ish than a gpio port you toggle at 20kHz.

                • Re: GPIO produce sine wave
                  alinaeem

                  If you are able to generate square wave . If you use a capacitor in parallel , then you will get a sine wave because it will filter out all the high frequency components.

                   

                  Regards,

                  Ali

                    • Re: GPIO produce sine wave
                      Roger Wolff

                      an RC-filter (Resistor in seriers, capacitor to ground) will fiter out the higher frequencies. The square wave will look more like a sine wave, provided you chose the R and C appropriately. But it won't be a perfect sine wave.

                       

                      We've asked the Thread-Starter to be more specific as to what he needs. The RC might give an  accurate enough sine wave. Or maybe not.....

                    • Re: GPIO produce sine wave

                      GPIO.PWM calls the wiringPi library, where the PWM functionality is done in software, i.e. implemented with threads, loops and timers, and therefore this has some limitations. It's really designed to run in the low 100's of Hz, for example setting the brightness of a light or controlling motor speed.  At high frequencies (over 10kHz) the timers are performed with a tight loop, which means the CPU will be at 100% utilization. I don't think you'll get much precision in this situation.

                       

                      For high frequencies, I think I would be tempted to use a dedicated chip, like the AD9833. This chip has a SPI interface, so should be pretty simple to use with Pi, as it exposes the SDA/SCL pins on the GPIO interface (pins 3,5). This would offload all the hard work from the Pi CPU.

                      • Re: GPIO produce sine wave
                        Roger Wolff

                        How exposing the I2C signals on the GPIO header helps with interfacing with an SPI chip, I don't understand.... :-)

                         

                        But the SPI signals are there too. They are on five pins from of the 20-26 group.

                        • Re: GPIO produce sine wave
                          peteroakes

                          what ever method you choose you need to realize that in order to get a decent output waveform with minimal external circuitry you will need to output to a DAC or PWM controller at between 5-10* the frequency you want as output so if your looking to output 20Khz. At a minimum and with assistance with output filters you should follow the Nyquist rate which would specify 2* but that wont give a very clean output.

                           

                          btw, a simple RC low pass filter will not give a sine wave it will be more like this

                          RC_LPF_square_wave.gif

                          this may be good enough but far from Sine

                           

                          this is more like what you need

                          sqare to sine.gif

                           

                          details can be found here http://www.wenzel.com/documents/waveform.html

                          but beware this has a resonant frequency and will not work for a wide range of frequencies without varying the values.

                          1 of 1 people found this helpful