Добрый день, делаю на нано генератор шим в зависимости от напряжения по формуле параболы. На просторах интернета взял код генератора шим и приделал к нему задающую частоту от напряжения. Так вот пока я этого не сделал, генератор работает отлично, как только начинаю мерять напряжение на A0 то примерно каждые 130-150мс шим зависает в высоком либо низком уровне на пару тактов. Не могу понять в чем дело, неделю уже бьюсь. Чую что проблемма в измерении напряжения, может надо усреднять как то значения на A0 Код (C++): int x; float hz; float inpvolt; float freq; float a = 1.05; float b = 23; float c = -31; float d = 0; void setup() { Serial.begin(9600); pinMode (9,OUTPUT); // выход генератора TCCR1A=0; TCCR1B=0; } void loop() { static uint32_t reqfreq=0; //переменная запроса частоты x = AnalogRead(0); inpvolt = ((x+1)*5/1024.0); hz = a*(inpvolt*inpvolt*inpvolt)+b*(inpvolt*inpvolt)+(c*inpvolt)+d+inpvolt;//формула параболы reffreq = hz; uint32_t ocr=OCR1A; uint16_t divider=1; if (reqfreq==0 || reqfreq>F_CPU/2) { return; } ocr = (F_CPU / reqfreq /2 /divider); byte shifts[] = {3,3,2,2}; for(byte i = 0; i < 4; i++){ if (ocr > 65536) { divider <<= shifts[i]; ocr = F_CPU / reqfreq /2 /divider; }else { TCCR1B = (i+1)|(1<<WGM12); break; } } //Mode4 (CTC) OCR1A=ocr-1; TCCR1A=1<<COM1A0; freq= (float) F_CPU/2 / (OCR1A+1) /divider; }
alexzlo Во-первых - кривая называется парабОла. Во-вторых, у вас и не парабола вовсе, парабола - кривая второго порядка, а у вас третий. В третих - rkit прав, зачем вы экономите строчки и лепите на каждой 2-3 оператора , с вас за строчки деньги берут? Ну а по сути - приведите плиз ссылку, где описан метод измерения частоты по параболе, интересно почитать
формулу я написал по памяти она не совсем такая, на самом деле там парабола по квадратичной функции, коэффиценты от балды поставил показав что они могут быть как с запятой так и отрицательными. почитать не знаю где, мне дали формулу и сказали что по ней надо выдавать шим в зависимости от напряжения. код работает, но проскакивает зависание уровня сигнала. Код раскрыл.