Hi people,
as the title says, I'm trying to create a simple sine wave (5 V peak-peak, wave 0-5 V), using a low pass filter (RC) to create it from the PWM. Unfortunately, since I have no more accurate ways to visualize the output (aka an oscilloscope), I'm using the serial plotter (specified also because I have a quite old computer, in case the following problem is due to something about computer -maybe high resources consumption? Even if I don't think so-). I use an Arduino Uno rev. 3.
This is my code:
const int echopin = A2;
const int sinepin = 6;
int i;
int sine256[] = {
127,130,133,136,139,143,146,149,152,155,158,161,164,167,170,173,176,178,181,184,187,190,192,195,198,200,203,205,208,210,212,215,217,219,221,223,225,227,229,231,233,234,236,238,239,240,
242,243,244,245,247,248,249,249,250,251,252,252,253,253,253,254,254,254,254,254,254,254,253,253,253,252,252,251,250,249,249,248,247,245,244,243,242,240,239,238,236,234,233,231,229,227,225,223,
221,219,217,215,212,210,208,205,203,200,198,195,192,190,187,184,181,178,176,173,170,167,164,161,158,155,152,149,146,143,139,136,133,130,127,124,121,118,115,111,108,105,102,99,96,93,90,87,84,81,78,
76,73,70,67,64,62,59,56,54,51,49,46,44,42,39,37,35,33,31,29,27,25,23,21,20,18,16,15,14,12,11,10,9,7,6,5,5,4,3,2,2,1,1,1,0,0,0,0,0,0,0,1,1,1,2,2,3,4,5,5,6,7,9,10,11,12,14,15,16,18,20,21,23,25,27,29,31,
33,35,37,39,42,44,46,49,51,54,56,59,62,64,67,70,73,76,78,81,84,87,90,93,96,99,102,105,108,111,115,118,121,124};
void setup() {
TCCR0B = TCCR0B & B11111000 | B00000001;
Serial.begin(9600);
pinMode(sinepin, OUTPUT);
pinMode(echopin, INPUT);
}
void loop() {
i = 0;
for (i = 0; i < sizeof(sine256) - 1; i++) {
analogWrite(sinepin,sine256[i]);
//delay(1);
int V = analogRead(echopin);
Serial.println(V);
//float Vfloat = (V/1023.0)*5.0;
//Serial.println(Vfloat);
}
}
Quick notes about it:
- I increased the frequency of the PWM, leaving the serial at its standard speed. I don't know if this combination affects somehow the output
TCCR0B = TCCR0B & B11111000 | B00000001;
Serial.begin(9600)
- I know I used a quite long sinetable, I just wanted my output as smooth as possible (tried also with shorter arrays).
- Some parts (delay and some prints) in the loop part are commented. Don't think it changes something, it was just to test various conditions (slower wave, and the print just rescales the output to 0-5 V).
Important: A PNG image taken from the Serial Plotter should be attached to the post (if not, let me know because I'm still quite a newbie in using forums in general). In any case I'll also describe it: basically the wave works fine until the end of the period, and then it starts again after a short time in which the output seems more like a noise. Printing that for a longer period of time shows that the "noise part" substitutes part of the period of the wave, in some configuration (different R and C) it substitutes an entire period.
Honestly, I have no idea in what can be wrong in the hardware configuration, but trying different ways on how to solve this one thing that made me realize that something is going wrong in the code itself: I tried to double the sine256 array, meaning that I defined all the values for two periods, in this way
int sine256[] = {
127,130,133,136,139,143,146,149,152,155,158,161,164,167,170,173,176,178,181,184,187,190,192,195,198,200,203,205,208,210,212,215,217,219,221,223,225,227,229,231,233,234,236,238,239,240,
242,243,244,245,247,248,249,249,250,251,252,252,253,253,253,254,254,254,254,254,254,254,253,253,253,252,252,251,250,249,249,248,247,245,244,243,242,240,239,238,236,234,233,231,229,227,225,223,
221,219,217,215,212,210,208,205,203,200,198,195,192,190,187,184,181,178,176,173,170,167,164,161,158,155,152,149,146,143,139,136,133,130,127,124,121,118,115,111,108,105,102,99,96,93,90,87,84,81,78,
76,73,70,67,64,62,59,56,54,51,49,46,44,42,39,37,35,33,31,29,27,25,23,21,20,18,16,15,14,12,11,10,9,7,6,5,5,4,3,2,2,1,1,1,0,0,0,0,0,0,0,1,1,1,2,2,3,4,5,5,6,7,9,10,11,12,14,15,16,18,20,21,23,25,27,29,31,
33,35,37,39,42,44,46,49,51,54,56,59,62,64,67,70,73,76,78,81,84,87,90,93,96,99,102,105,108,111,115,118,121,124,127,130,133,136,139,143,146,149,152,155,158,161,164,167,170,173,176,178,181,184,187,190,192,195,198,200,203,205,208,210,212,215,217,219,221,223,225,227,229,231,233,234,236,238,239,240,
242,243,244,245,247,248,249,249,250,251,252,252,253,253,253,254,254,254,254,254,254,254,253,253,253,252,252,251,250,249,249,248,247,245,244,243,242,240,239,238,236,234,233,231,229,227,225,223,
221,219,217,215,212,210,208,205,203,200,198,195,192,190,187,184,181,178,176,173,170,167,164,161,158,155,152,149,146,143,139,136,133,130,127,124,121,118,115,111,108,105,102,99,96,93,90,87,84,81,78,
76,73,70,67,64,62,59,56,54,51,49,46,44,42,39,37,35,33,31,29,27,25,23,21,20,18,16,15,14,12,11,10,9,7,6,5,5,4,3,2,2,1,1,1,0,0,0,0,0,0,0,1,1,1,2,2,3,4,5,5,6,7,9,10,11,12,14,15,16,18,20,21,23,25,27,29,31,
33,35,37,39,42,44,46,49,51,54,56,59,62,64,67,70,73,76,78,81,84,87,90,93,96,99,102,105,108,111,115,118,121,124};
This made me think that the loop() function (or maybe just the for() loop) has some trouble when is starts again taking values from sine256[] (aka from the last value to the first again). I honestly don't understand why it does this and how to solve it, since it seems correct to me: it starts with i = 0, then executes the for() for every value of sine256[] and then it starts again, resetting i = 0 and doing the work again.
Do you see anything wrong with it? Thanks to everybody who will bright me up.