Генерация треугольной волны

Тема в разделе "ESP8266, ESP32", создана пользователем Arduiner001, 18 ноя 2017.

  1. Arduiner001

    Arduiner001 Гик

    Привет всем!

    Дан таймер, который вызывает прерывание SAMPLE_RATE раз в секунду. Есть переменные p2 и fq, которые обозначают амплитуду (0-255) и частоту соответственно. Алгоритм записывает текущее значение в переменную sample, которая затем выводится на ЦАП. Необходимо реализовать генератор треугольной волны. Разрешается хранить промежуточные значения в переменных ph, p1, p3 и p4. Все переменные типа uint16_t.

    Способы, которые я попробовал:
    Код (C++):
    if (ph >= SAMPLE_RATE / fq / p2) {
      if (p4 == 1) {
        p3 = ph++;
        if (ph >= p2) {
          p4 = 0;
        }
      } else {
        p3 = ph--;
        if (ph == 65535) {
          p4 = 0;
        }
      }
      p3 = ph;
    }
    sample = p3;
    Код (C++):
    sample = abs((ph++ % (SAMPLE_RATE / fq)) - p2);
    Заранее спасибо.
     
  2. Arduiner001

    Arduiner001 Гик

    Проблема была в том, что abs() иногда почему-то выдаёт отрицательные значения (:confused:). Второй способ работает.
     
  3. Unixon

    Unixon Оракул Модератор

    Отрицательные значения дает не abs(), а неправильное приведение типов. Если вы большой uint засунете в int такого же размера, он станет отрицательным, поскольку старший бит отвечает за знак.
     
  4. DIYMan

    DIYMan Guest

    О как! Изречение вида "иногда Солнце крутится вокруг Земли", не меньше ;) По существу: abs не при чём, переполнение - при чём.