Am fost indus in eroare cu semnalul modulator de o anumita persoana...Se pare ca e doar o frecventa de aproximativ 7.82 hz....ar trebui sa fie de 7.83 hz...Am gasit un program pentru arduino ,si cu un filtru RC cu care reusesc sa reproduc acea unda sinusoidala,cu acel "rizuri"...
uint8_t pVal = 127;
const float pi2 = 6.28;
const int samples = 122.389;//100...prin modificarea acestei valori obtin 7.82...se pare ca de aici sunt "rizurile"...
int WavSamples[samples];
int count = 0;
void setup() {
pinMode(10, OUTPUT);
pinMode(4, OUTPUT);
setPwmFrequency(10, 1);
analogWrite(10, 127);
float in, out;
for (int i = 0; i < samples; i++) {
in = pi2 * (1 / (float)samples) * (float)i;
WavSamples = (int)(sin(in) * 127.5 + 127.5);
}
}
void loop() {
if (count > samples) count = 0;
bitBangPWM(WavSamples[count], 4);
count++;
}
void bitBangPWM(unsigned long on, int pin) {
int period = 1000;
on = map(on, 0, 255, 0, period);
unsigned long start = micros();
digitalWrite(pin, HIGH);
while ((start + on) > micros());
start = micros();
digitalWrite(pin, LOW);
while ((start + (period - on)) > micros());
}
void setPwmFrequency(int pin, int divisor) {
byte mode;
if (pin == 5 || pin == 6 || pin == 9 || pin == 10) {
switch (divisor) {
case 1: mode = 0x01; break;
case 8: mode = 0x02; break;
case 64: mode = 0x03; break;
case 256: mode = 0x04; break;
case 1024: mode = 0x05; break;
default: return;
}
if (pin == 5 || pin == 6) {
TCCR0B = TCCR0B & 0b11111000 | mode;
} else {
TCCR1B = TCCR1B & 0b11111000 | mode;
}
} else if (pin == 3 || pin == 11) {
switch (divisor) {
case 1: mode = 0x01; break;
case 8: mode = 0x02; break;
case 32: mode = 0x03; break;
case 64: mode = 0x04; break;
case 128: mode = 0x05; break;
case 256: mode = 0x06; break;
case 1024: mode = 0x07; break;
default: return;
}
TCCR2B = TCCR2B & 0b11111000 | mode;
}
}