Timer2

vvadim
Offline
Зарегистрирован: 23.05.2012

Подскажите пожалуйста, какя частота получается на втором таймере при такой записи (запутался я в этой теме)

 TCCR2A = (1<<WGM21);    
 TCCR2B = (1<<CS20);    
 OCR2A = 0x80; 
 TIMSK2 = (1<<OCIE2A); 

 

maksim
Offline
Зарегистрирован: 12.02.2012

Частота чего? Какая частота кварца?

Частота прерываний при кварце 16 МГц = 16000000/1*(1+128) = 124031 Гц

vvadim
Offline
Зарегистрирован: 23.05.2012

Да, для прерываний.

Спасибо.

vvadim
Offline
Зарегистрирован: 23.05.2012

Нашёл в сети код для управления шаговиком через переполнение таймера 2.
Работает хорошо.

Вопрос - получится ли подключить аналогичным образом ещё один шаговик например через твймер 1


#include "OneButton.h"
OneButton button(15, true);

#define EN_PIN     19     
#define STEP_PIN   9       
#define DIR_PIN    8  
#define tic 0x927C0
volatile uint16_t count; 
volatile unsigned long speed;
volatile bool run;
bool start;
float rpm;

void setup()
{
  button.attachClick(Click);
  pinMode(STEP_PIN , OUTPUT);		
  pinMode(DIR_PIN , OUTPUT);
  pinMode(EN_PIN , OUTPUT);
  digitalWrite(DIR_PIN , HIGH);  
  rpm = 200;
  run=false;
  start=false; 
  TCCR2A = (1<<WGM21);    
  TCCR2B = (1<<CS20);    
  OCR2A = 0x80; 
  TIMSK2 = (1<<OCIE2A); 
}

void loop()
{ 
  button.tick();
  speed = tic/rpm;
  if (start) accelerate();
  set_pins();
}

ISR (TIMER2_COMPA_vect)
{   
  if (count>0) 
  {
    count--;
    OCR2A = 0x80;
  }
  else 
  {
    digitalWrite(STEP_PIN , HIGH);
    count = speed >> 7;
    OCR2A = speed % 0x80;     
    digitalWrite(STEP_PIN , LOW);	  
  }            				  
}

void Click()
{
  if (!run) start = true;
  else      run = false;
  decelerate();
} 
void accelerate()
{
  run = true;
  set_pins();
  int i;
  for(i = 1; i < rpm; i ++)
  {
    speed = tic/(i);
    delay(10);    
  }
  start = false;
}

void decelerate()
{
  int i;
  for(i = rpm; i > 10; i --)
  {
    speed = tic/i;
    delay(3);     
  }
  run = false;
}

void set_pins()
{
  if(run)   digitalWrite(EN_PIN , LOW);
  else      digitalWrite(EN_PIN , HIGH); 
}