Timer2
- Войдите на сайт для отправки комментариев
Пнд, 20/04/2015 - 16:45
Подскажите пожалуйста, какя частота получается на втором таймере при такой записи (запутался я в этой теме)
TCCR2A = (1<<WGM21); TCCR2B = (1<<CS20); OCR2A = 0x80; TIMSK2 = (1<<OCIE2A);
Частота чего? Какая частота кварца?
Частота прерываний при кварце 16 МГц = 16000000/1*(1+128) = 124031 Гц
Да, для прерываний.
Спасибо.
Нашёл в сети код для управления шаговиком через переполнение таймера 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); }