И снова о таймере
- Войдите на сайт для отправки комментариев
Пт, 11/06/2021 - 19:16
У меня вопрос:
Можно ли сделать делитель на таймере для Arduino UNO для входной частоты и поделенную частоту выдать на выход? Может кто нибудь посоветовать ссылку на проекты, где это реализовано?
Например на выв.5 подаем частоту 100кгц. Делитель делаем равным 12 и на выв.3 получаем частоту 8 кгц.
чисто теоретически - выбираем для таймера тактирование с внешнего входа, запускам режим по совпадению, в регистр сравнения пишем половину делителя (в вашем примере 8/2 = 4) и по совпадению инвертим уровень нужного выхода
Правда сомневаюсь. что Уно такое умеет
Timer/Counter2 на ATMega328 со внешним тактированием.
Вар1: В прерывании считаем фронты входной частоты и инвертируем выходной пин. При 100 килогерцах другими тяжелыми задачами не занимаемся.
Вар2: Лепим рядом счетчик на 561*/CD40*.
У первого таймера тактирование от внешнего входа -штатный режим (битыCS10..CS12) + режим CTC и вуаля.
По 1 варианту: Прерывание уже занято. Максимальная частота по измерению прерывания 250 кгц. и уже работает. Таймер 1 уже тоже занят. Остается свободным только таймер 2 или внешний счетчик (555ИЕ8 с задаваемым коэф. деления). Хочу повысить максимальную частоту для прерывания. Например на вход счетчика подаем 2500 кгц на таймере его делим на 10 и подаем на вход прерывания.
Пока делаю пробный вариант на 1 таймере СТС режим для встроенного кварца. Это вариант работает.
01
//---Частота генератора 64000 Гц.----------------------------------------------//
02
void
setup
() {
//
03
pinMode(9, OUTPUT);
//
04
//---Настройка таймера 1-------------------------------------------------------//
05
TCCR1A = 1<<COM1A0;
// Переключение пина 9 по сравнению //
06
TCCR1B = 0;
//
07
TCNT1 = 0;
//
08
OCR1A=124;
//отсчитать 125 входных импульсов до сравнения //
09
TCCR1B = (0 << CS12)|(0 << CS11)|(1 << CS10)|(1<<WGM12);
//прескалер=1.CTC mode //
10
}
//
11
void
loop
()
//
12
{}
//
13
//-----------------------------------------------------------------------------//
Вот вариант для 2 таймера вроде все тоже самое , но не работает.
01
//---Частота генератора 64000 Гц.----------------------------------------------//
02
void
setup
() {
//
03
pinMode(11, OUTPUT);
//
04
pinMode(3, OUTPUT);
//
05
pinMode(9, OUTPUT);
//
06
//---Настройка таймера 2-------------------------------------------------------//
07
TCCR2A = 0;
// обнуляю регистр //
08
TCCR2B = 0;
// обнуляю регистр //
09
TCNT2 = 0;
//ensures counter value starting from zero //
10
OCR2A = 250;
//compare match register for timer2 //
11
TCCR2A = (1<<WGM21);
// Configure timer 2 for CTC mode //
12
TCCR2B = (0<<CS22) |(0<<CS21)| (1<<CS20);
// prescaler 1 //
13
//---Настройка таймера 1-------------------------------------------------------//
14
TCCR1A = 1<<COM1A0;
// //
15
TCCR1B = 0;
//
16
TCNT1 = 0;
//
17
OCR1A=124;
//отсчитать 125 входных импульсов до сравнения //
18
TCCR1B = (0 << CS12)|(0 << CS11)|(1 << CS10)|(1<<WGM12);
//прескалер=1.CTC mode //
19
}
//
20
void
loop
()
//
21
{}
//
22
//-----------------------------------------------------------------------------//
Buldakov, во-первых не ясно как приведённые примеры соотносятся с задачей. В задаче надо делить внешний сигнал -а тут вы делите внутреннюю частоту тактирования. Во втором примере вы результат сравнения никуда не выводите (не активны биты Compare Match Output)
По 1 варианту: Прерывание уже занято.
Вроде с внутреннего генератора получилось. Выходной сигнал на выв.11
01
//---Частота генератора 64000 Гц.----------------------------------------------//
02
void
setup
() {
//
03
pinMode(11, OUTPUT);
//
04
//---Настройка таймера 2-------------------------------------------------------//
05
TCCR2A = 0;
// обнуляю регистр //
06
TCCR2B = 0;
// обнуляю регистр //
07
TCNT2 = 0;
//ensures counter value starting from zero //
08
OCR2A = 124;
//отсчитать 125 входных импульсов до сравнения //
09
TCCR2A = (0<<COM2A1)|(1<<COM2A0);
// //
10
TCCR2A|= (1<<WGM21);
// Configure timer 2 for CTC mode //
11
TCCR2B = (0<<CS22) |(0<<CS21)| (1<<CS20);
// prescaler 1 //
12
//-----------------------------------------------------------------------------//
13
}
//
14
void
loop
()
//
15
{}
//
16
//-----------------------------------------------------------------------------//
Теперь буду пробовать запустить таймер от внешнего генератора. Как я понял
Бит EXCLK (6) регистра ASSR разрешает использование внешнего тактового сигнала от кварцевого резонатора 32 кГц при записи в него 1.
Бит AS2 (5) регистра ASSR управляет способом тактирования (1 - от внешнего резонатора 32 кГц, подключенного к TOSC1 (9 ножка) / 0 - от внутреннего генератора CLK).
http://avrprog.blogspot.com/2013/03/t2-8.html
Вопрос решился. Входная частота подается на выв. 9. Только жалко что таймер не может делить входную частоту меньше чем в в 2 раза и время выполнения кода зависит от измеряемой частоты. Поэтому перехожу на внешний делитель с логикой и 555ИЕ8 +555ИЕ10. Частотка при этом будет измеряться от 1 гц до 20 мгц для советских счетчиков и до 80мгц для импортных. Зато радиолюбители освоят изготовление и травление печатных плат в качестве добавки к Arduino Uno. Буду делать частотомер, как проще и удобнее для себя. А если кому то будет сложно, то это не ко мне.
01
//---Частота генератора деленная на125 выход выв.11----------------------------//
02
void
setup
() {
//
03
pinMode(11, OUTPUT);
//
04
//---Настройка таймера 2-------------------------------------------------------//
05
TCCR2A = 0;
// обнуляю регистр //
06
TCCR2B = 0;
// обнуляю регистр //
07
ASSR = 0;
// обнуляю регистр //
08
TCNT2 = 0;
//ensures counter value starting from zero //
09
TIMSK2 = (1<<TOIE2);
//прерывание по переполнению таймера 2 //
10
OCR2A = 124;
//отсчитать 125 входных импульсов до сравнения //
11
TCCR2A = (0<<COM2A1)|(1<<COM2A0);
// //
12
TCCR2A|= (1<<WGM21);
// Configure timer 2 for CTC mode //
13
TCCR2B = (0<<CS22) |(0<<CS21)| (1<<CS20);
// prescaler 1 //
14
ASSR = (1<<EXCLK)|(1<<AS2);
//
15
//-----------------------------------------------------------------------------//
16
}
//
17
void
loop
()
//
18
{}
//
19
//-----------------------------------------------------------------------------//