Шим и измерение напряжения

Тема в разделе "Arduino & Shields", создана пользователем alexzlo, 17 окт 2017.

  1. alexzlo

    alexzlo Нерд

    Добрый день, делаю на нано генератор шим в зависимости от напряжения по формуле параболы.
    На просторах интернета взял код генератора шим и приделал к нему задающую частоту от напряжения. Так вот пока я этого не сделал, генератор работает отлично, как только начинаю мерять напряжение на 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;
    }
     
    Последнее редактирование: 17 окт 2017
  2. rkit

    rkit Гуру

    Слишком много строчек в коде, мне кажется. Попробуйте еще сжать чуть-чуть.
     
  3. b707

    b707 Гуру

    alexzlo Во-первых - кривая называется парабОла. Во-вторых, у вас и не парабола вовсе, парабола - кривая второго порядка, а у вас третий. В третих - rkit прав, зачем вы экономите строчки и лепите на каждой 2-3 оператора , с вас за строчки деньги берут? :)
    Ну а по сути - приведите плиз ссылку, где описан метод измерения частоты по параболе, интересно почитать
     
  4. alexzlo

    alexzlo Нерд

    формулу я написал по памяти она не совсем такая, на самом деле там парабола по квадратичной функции, коэффиценты от балды поставил показав что они могут быть как с запятой так и отрицательными.
    почитать не знаю где, мне дали формулу и сказали что по ней надо выдавать шим в зависимости от напряжения. код работает, но проскакивает зависание уровня сигнала. Код раскрыл.
     
    Последнее редактирование: 17 окт 2017
  5. alexzlo

    alexzlo Нерд

    Спасибо за помощь, помогли правильно выложить код на форум
     
  6. rkit

    rkit Гуру

    Это правильно, по-вашему?