Увеличить частоту при каждом нажатии кнопки на 100 Гц, используя регистр ввода

Частота должна увеличиваться на 100 Гц всякий раз, когда нажимается и затем отпускается внешняя кнопка на цифровом выводе 5 UNO. Мне кажется, я упустил что-то важное.

#define LEDPIN 3
float highTime;
float lowTime;
int freq;
float period; 

//uint16_t val2= pulseIn(4, HIGH);
      
ISR(TIMER1_COMPA_vect) { digitalWrite(LEDPIN, !digitalRead(LEDPIN)); }
void setup() {
Serial.begin(9600);
pinMode(LEDPIN, OUTPUT);
// инициализировать Таймер1 (16-разрядный таймер) с использованием сравнения выходных данных канала А.

TCR1A = 0; // установите весь регистр TCR1A равным 0
TCR1B = 0; // то же самое для TCR1B
TCNT1 = 0; // инициализировать значение счетчика равным 0
// set compare match register for 100 Hz increments
OCR1A = 9999; // = 16000000 / (8 * 100) - 1 (must be <65536)
// turn on CTC mode
TCCR1B |= (1 << WGM12);
// Set CS12, CS11 and CS10 bits for 8 prescaler
 TCCR1B |= (0 << CS12) | (1 << CS11) | (0 << CS10);

// enable timer compare interrupt
TIMSK1 |= (1 << OCIE1A);
sei(); // allow interrupts
interrupts(); // enable global interrupts:
}
void loop() {

highTime =(pulseIn(4, HIGH));
lowTime=(pulseIn(4, LOW));
period = highTime+lowTime;
freq=1000000/period;       //частота получения с общим временем в микросекундах
Serial.print(freq);
delay(1000);


Serial.print("\n");

В принципе, я хочу включить приведенный выше код, который отображает "100" на последовательном мониторе с повышением частоты на 100 нажатием кнопки.

#define LEDPIN 3
const int buttonPin = 5;    // the number of the pushbutton pin

//uint16_t val2= pulseIn(4, HIGH);
// Variables will change:
int ledState = HIGH;         // the current state of the output pin
int buttonState;             // the current reading from the input pin
int lastButtonState = LOW;   // the previous reading from the input pin

// the following variables are unsigned longs because the time, measured in
// milliseconds, will quickly become a bigger number than can be stored in an int.
unsigned long lastDebounceTime = 0;  // the last time the output pin was toggled
unsigned long debounceDelay = 50;    // the debounce time; increase if the output flickers

ISR(TIMER1_COMPA_vect) { digitalWrite(LEDPIN, !digitalRead(LEDPIN)); }
void setup() {
  Serial.begin(9600);
  pinMode(LEDPIN, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  // initialize Timer1 (the 16-bit timer) using channel A output compare

  TCCR1B = 0; // same for TCCR1B
  TCNT1 = 0; // initialize counter value to 0
  // set compare match register for 100 Hz increments
  OCR1A = 9999; // = 16000000 / (8 * 100) - 1 (must be <65536)
  // turn on CTC mode
  TCCR1B |= (1 << WGM12);
  // Set CS12, CS11 and CS10 bits for 8 prescaler
  TCCR1B |= (0 << CS12) | (1 << CS11) | (0 << CS10);

  // enable timer compare interrupt
  TIMSK1 |= (1 << OCIE1A);
  sei(); // allow interrupts
  interrupts(); // enable global interrupts:

}
void loop() {
  int reading = digitalRead(buttonPin);
   // If the switch changed, due to noise or pressing:
  if (reading != lastButtonState) {
    // reset the debouncing timer
    lastDebounceTime = millis();
  }
  if (reading != lastButtonState) {
    // reset the debouncing timer
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    // whatever the reading is at, it's been there for longer than the debounce
    // delay, so take it as the actual current state:

    // if the button state has changed:
    if (reading != buttonState) {
      buttonState = reading;

      // only toggle the LED if the new button state is HIGH
      if (buttonState == HIGH) {
        ledState = !ledState;
      }
    }
    lastButtonState = reading;

    Serial.print(reading);
    delay(1000);
    Serial.print("\n");

  }
}

, 👍-1

Обсуждение

Возможно, было бы хорошей идеей объяснить, что происходит вместо увеличения частоты на 100 Гц, которого вы, похоже, ожидаете. Одна проблема для меня уже совершенно очевидна: в вашем "цикле ()" нет ничего, что меняет частоту. Просто какой-то код отмены и что-то, что изменяет переменную под названием "Состояние светодиода" (но ничего, что на самом деле изменяет состояние светодиода). Откуда у вас этот код?, @StarCat

Я предлагаю использовать библиотеку "Bounce2" для нажатия кнопок. Это облегчает обработку и выполняет все операции по дебютированию., @chrisl


1 ответ


0

Ваш ПИН ввода кнопки установлен в режим INPUT_PULLUP, так что ПИН всегда будет считываться ВЫСОКИМ, если вы его не заземлите. Ваша кнопка должна подключить вывод к заземлению, когда она нажата.

Если вы это сделаете, то PIN будет считываться ВЫСОКИМ, когда кнопка не нажата, и НИЗКИМ, когда кнопка нажата. В нижней части функции loop() вы нажимаете кнопку и переключаете светодиод с помощью:

  if (buttonState == HIGH) {
      ledState = !ledState;
  }

Но это переключает светодиод, когда кнопка отпущена. Это действительно то, что ты имел в виду?

,

В принципе, я хочу, чтобы частота увеличивалась на 100 каждый раз, когда я нажимаю кнопку, @ram patel

Я вижу два скетча в вашем вопросе. Я смотрел на второй. Как они связаны и какой из них вы пытаетесь отладить?, @JRobert

Извините за путаницу, в основном я должен объединить и отредактировать 1-й код с помощью кнопки "Отменить код" из функции библиотеки. Первый код просто отображает "100" Гц, а второй код, который у меня есть, использует мой первый код до 100 Гц при каждом нажатии кнопки., @ram patel

Тогда я полагаю, что вы хотите использовать второй код, но отмените тест buttonState - вместо этого проверьте его на НИЗКИЙ уровень. Внутри блока "если", где вы переключаете светодиод, находится место для ввода кода, увеличивающего частоту., @JRobert

Я все еще новичок в этом деле. Не могли бы вы, пожалуйста, объяснить по частям, что мне нужно изменить?, @ram patel

Что вам нужно изменить? Возьмите новый/чистый проект Arduino и сначала надежно прочитайте нажатие кнопки. Затем вы используете функцию "тон()" вместо ручной настройки регистров. Создайте его самостоятельно (на основе примеров), чтобы вы понимали, почему/какой код существует, вместо того, чтобы копировать его из Интернета., @Paul

Мне действительно кажется, что ты пытаешься научиться делать слишком много вещей одновременно. Научитесь управлять кнопкой до тех пор, пока вы не убедитесь, что все сделали правильно, и не поймете ее. Затем проделайте то же самое с частотой - научитесь устанавливать или изменять ее шагами, возможно, с интервалом в 1 секунду, используя функцию задержки() для измерения 1 секунды. Затем примените то, что вы знаете, к скетчу, который следит за кнопкой и изменяет частоту, в обоих заданиях используется код, который вы уже написали (без задержки (), конечно). Гораздо проще выучить фрагменты один за другим, прежде чем вы начнете складывать их вместе., @JRobert