Можно ли получить задержку в 2 секунды с регистрами таймера в Arduino? - PullRequest
0 голосов
/ 25 апреля 2018

Я делаю один простой проект прямо сейчас.Мне нужно написать код, который меняет значение потенциометра через каждые секунды с помощью таймеров и регистров АЦП.Я использовал Timer0 для этой задачи, все в порядке, но вывод в Serial Monitor меняется так быстро, не за 2 секунды.Почему это так?

Мой код:

void setup()
{
  TCCR0A = 0; //reset the register
  TCCR0B = 0; //reset the register
  OCR0A = 0;  //reset  the register

  TCCR0A = (1 << COM0A1)|(0 << WGM01) | ( 0 << WGM00);
  TCCR0B = (1 << CS02)  |(1 << CS00); //1024 prescaler 

  ADCSRA = (1 << ADEN) | ( 1 << ADSC); 
  //enabling the ADC with shifting ADEN by 1
  ADMUX  = (1 << REFS0)| (1<<MUX0) | (0 << MUX1) | (1 << MUX2);
  //shifting REFS0 by 1 means setting it as AVCC
  //shifting MUX0 and MUX2 by 1 means setting A5 pin on

  Serial.begin(9600);

}

void loop() {

  int highval = ADCH; //Data Register High
  int lowwal = ADCL; //Data Register Low
  int sensval = analogRead(A5);

  uint8_t answer; 
  answer = ((highval) * 256 + lowwal) * 5 / 1023; 

  if(TCNT0 == 0xF1) {
        Serial.println(answer);
  }
  if(TCNT0 == 0x00) {
        Serial.println(answer);
  }

}

void timdel() {

  TCNT0 = 0xF1;     // 2 seconds 
}

1 Ответ

0 голосов
/ 25 апреля 2018

Arduinos обычно работает на тактовой частоте 16 МГц. У вас есть прескалер, установленный на 1024 и 8-битный таймер / счетчик0. Таким образом, он переполняется каждые 1/(16000000/1024/256), т.е. 16.384ms.

Но вы можете использовать 16-битный T / C 1. Вы можете получить время более 4 секунд. Однако я бы использовал режим CTC и соответствующий ему флаг (без прерываний).

...