Go Down

Topic: Issues with samping a sine wave (Read 2013 times) previous topic - next topic


I'm a starter with arduino. I tried to sample a 200 Hz sine wave or a square wave from the function generator and get the pulses from an analog output. Ideally, if it is a square wave, I would get the exactly the same pusles from the output. But the pulses I got varied in pulse widths, in other words, the duty cycle was not constantly 50% as the input. I assume there must be problems with sampling rate and PWM frequency. Can anyone help please?

Here's the code I get from the "Analog serial in out" example.
const int analogInPin = A0;  // Analog input pin that the function generator is attached to
const int analogOutPin = 9; // Analog output pin that the LED is attached to

int sensorValue = 0;        // value read from the pot
int outputValue = 0;        // value output to the PWM (analog out)

void setup() {
  // initialize serial communications at 9600 bps:

void loop() {
  // read the analog in value:
  sensorValue = analogRead(analogInPin);           
  // map it to the range of the analog out:
  outputValue = map(sensorValue, 0, 1023, 0, 255); 
  // change the analog out value:
  analogWrite(analogOutPin, outputValue);           

  // print the results to the serial monitor:
  Serial.print("sensor = " );                       
  Serial.print("\t output = ");     

  // wait 2 milliseconds before the next loop
  // for the analog-to-digital converter to settle
  // after the last reading:


You're sampling rate is too low, you're sampling at about 2.5 times faster than the input signal, if you draw a square signal on paper and then place dots on it where sampling is done, you'll grasp what's happening.
Don't forget to offset your input so it's always positive, arduinos don't like negative voltages.

I would do the serial print only once per second or you'll fill the buffer.
And increase the sampling rate to 2KHz and make sure the sampling interval is always the same (by calling micros() or using a timer)

Ideally you should use a low pass filter to remove frequencies above 200Hz but this can wait.


Also the analogWrite outputs PWM not a DC value.

So it is never going to look like the input signal.

Go Up