Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
ru:avr:timers [2013/08/14 17:02] eduardtlmkru:avr:timers [2020/07/20 09:00] (current) – external edit 127.0.0.1
Line 1: Line 1:
 ====== Счётчики/Таймеры ====== ====== Счётчики/Таймеры ======
  
-Счётчики (англ. //counter//), в некотором смысле таймеры (англ. //timer//), являются одними из важнейших дополнительных функций микроконтроллеров. С их помощью можно регулировать процессы точно по времени, генерировать сигналы и считывать события. Рабочий принцип счётчика состоит в том, что он преобразовывает число входных тактов в бинарное значение при помощи цепочки триггеров. От длины цепочки зависит максимальное считываемое количество тактов, которое обозначается длинной двоичного кода. Счётчики микроконтроллера AVR 8- и 16-битные. Если счётчик достигает максимального значения (у 8-битных 255, 16-битных 65535), то при следующем такте происходит переполнение (англ. //overflow//) и счётчик обнуляется. Тактовый сигнал может приходить из рабочего такта микроконтроллера и в этом случае можно уменьшить его частоту при помощи делителя частоты (англ. prescaler). У некоторых AVR имеется отдельный внутренний генератор тактовых сигналов, частоту которого можно увеличить с помощью умножителя частоты. Счётчики различаются так же по возможностям применения и рабочим режимам.+Счётчики (англ. //counter//), в некотором смысле таймеры (англ. //timer//), являются одними из важнейших дополнительных функций микроконтроллеров. С их помощью можно регулировать процессы точно по времени, генерировать сигналы и считывать события. Рабочий принцип счётчика состоит в том, что он преобразовывает число входных тактов в бинарное значение при помощи цепочки триггеров. От длины цепочки зависит максимальное считываемое количество тактов, которое обозначается длинной двоичного кода. Счётчики микроконтроллера AVR 8- и 16-битные. Если счётчик достигает максимального значения (у 8-битных 255, 16-битных 65535), то при следующем такте происходит переполнение (англ. //overflow//) и счётчик обнуляется. Тактовый сигнал может приходить из рабочего такта микроконтроллера и в этом случае можно уменьшить его частоту при помощи делителя частоты (англ. //prescaler//). У некоторых AVR имеется отдельный внутренний генератор тактовых сигналов, частоту которого можно увеличить с помощью умножителя частоты. Счётчики различаются так же по возможностям применения и рабочим режимам.
  
 ===== Стандартный режим счётчика ===== ===== Стандартный режим счётчика =====
Line 24: Line 24:
 int main() int main()
 { {
- // Для того, чтобы первое прерывание переполнения произошло через 10 ms, + // Для того, чтобы первое прерывание переполнения произошло 
- // следует и здесь обнулить счётчик.+ // через 10 ms, следует и здесь обнулить счётчик.
  TCNT0 = 178;  TCNT0 = 178;
  
Line 56: Line 56:
 <box 100% round #EEEEEE|Пример> <box 100% round #EEEEEE|Пример>
  
-Vaja on 8 MHz taktsagedusel töötava ATmega128-ga mõõta välise 122 Hz - 100 kHz loogilise nelinurksignaali sagedust 1 Hz täpsusegaProgramm on tehtud 16-bitise loendur sündmuste püüdjaga.+Требуется при помощи работающего на тактовой частоте в 8 MHz  ATmega128 измерить частоту внешнего 122 Hz - 100 kHz логического прямоугольного сигнала с точностью в 1 Hz. Программа использует фиксатор событий 16-битного счётчика 1.
  
 <code c> <code c>
Line 63: Line 63:
 unsigned long frequency; unsigned long frequency;
  
-// Sündmuse toimumise katkestus+// Прерывание совершения событий
 ISR(TIMER1_CAPT_vect) ISR(TIMER1_CAPT_vect)
 { {
- // Loenduri nullimine+ // Обнуление счётчика
  TCNT1 = 0;  TCNT1 = 0;
  
- // Tulemus on ainult siis arvestatavkui + // Результат является истинным только в случае
- // loendur pole vahepeal üle täitunud+ // если счётчик не переполнялся
  if (!(TIFR & (1 << TOV1)))  if (!(TIFR & (1 << TOV1)))
  {  {
- // Sageduse arvutamine perioodi pöördväärtusest.+ // Расчёт частоты из обратной величины периода.
  frequency = (unsigned long)8000000 /  frequency = (unsigned long)8000000 /
              (unsigned long)ICR1;              (unsigned long)ICR1;
Line 79: Line 79:
  else  else
  {  {
- // Sagedus on vähem kui 122 Hz+ // Частота меньше, чем 122 Hz
  frequency = 0;  frequency = 0;
  
- // Loenduri ületäitumise lipukese nullimine+ // Обнуление флага при переполнении счётчика
  TIFR &= ~(1 << TOV1);  TIFR &= ~(1 << TOV1);
  }  }
Line 89: Line 89:
 int main() int main()
 { {
- // Tõusva frondi registreeriminesagedusjaguri tegur 1+ // Регистрация нарастающего фронтакоэффициент делителя частоты 1
  TCCR1B = (1 << ICES1) | (1 << CS10);  TCCR1B = (1 << ICES1) | (1 << CS10);
  
- // Sündmuse toimumise katkestuse lubamine+ // Разрешение прерывания совершения события
  TIMSK = (1 << TICIE1);  TIMSK = (1 << TICIE1);
  
- // Globaalne katkestuste lubamine+ // Разрешение глобальных прерываний
  sei();  sei();
  
- // Lõputu programmitsükkel+ // Бесконечный цикл программы
  while (1) continue;  while (1) continue;
 } }
 </code> </code>
  
-Programmis tekib välise signaali tõusva frondi ajal sündmuse katkestusKatkestuse jooksul kontrollitakseega loenduri ületäitumine pole toimunud - see saab juhtudakui signaali sagedus on alla 122 Hz (8 MHz / 2<sup>16</sup>), ja sel juhul ei kajasta loenduri väärtus reaalset perioodiSagedus arvutatakse 32-bitiste arvudega pöördväärtusena perioodistEsimese asjana aga nullitakse loendursest taimer töötab samal taktil mis protsessor ja iga instruktsiooni täitminemis toimub pärast välist sündmustlühendab mõõdetavat perioodi ning sellest tulenevalt rikub ka mõõtetulemustMaksimaalsele mõõdetavale sagedusele seab piiri katkestuse programmiosa tööaeg.+В программе происходит прерывание события во время нарастающего фронта внешнего сигналаВо время прерывания проверяетсяне произошло ли переполнение счётчика – это может случитьсяесли частота сигнала меньше 122 Hz (8 MHz / 2<sup>16</sup>), и в таком случае значение счётчика не отображает реальный периодЧастота высчитывается с помощью 32-битных чисел для получения обратной величиной периодаПервым делом обнуляется счётчик, так как таймер работает на том же такте, что и процессор и выполнение каждой инструкции, которая происходит после внешнего событияуменьшает измеряемый период и исходя из этогоискажает результат измеренияРабочее время отрезка программы прерывания ограничивает максимальную измеряемую частоту.
  
 </box> </box>
  
-Sündmuste püüdmist ning nende aja registreerimist saab teha ka tarkvaraliseltSaab kasutada väliseid või muid katkestusi ja nende tekkimise ajal lugeda loenduri väärtusRiistvaraline sündmuste püüdmine on siiski mõeldud eeskätt programmist sõltumatuks töötamiseks ja suhteliselt lühiajaliste (või tihedate) sündmuste mõõtmiseks.+Фиксацию событий и регистрацию их времени можно так же совершать программноМожно использовать внешние и другие прерывания и во время их возникновения считывать значение счётчикаАппаратная фиксация событий всё же, прежде всего, предназначена для работы вне зависимости от программы и для измерения достаточно кратковременных или частых событий.
  
-===== Signaali genereerimine =====+===== Генерирование сигнала =====
  
-Keerukamate loenduritega saab peale signaali pikkuse mõõtmise ka signaali tekitadaSelleks on loenduril väärtuse võrdlemise üksus (inglise keeles //output compare unit//ja võrdlustulemuse väljastusüksus (inglise keeles //compare match output unit//). Võrdlusüksusesse kuuluvad registrid sama bitilaiusega kui loendur ise ja nende registrite väärtusi võrreldakse loenduri väärtusega selle töö ajalHetkelmil loenduri väärtus saab võrdseks võrdlusüksuse registri väärtusegasaab tekitada katkestuse ja spetsiaalsete väljundviikude oleku muutuseValida on võrdusmomendil viigu kõrgeks muutumisemadalaks muutumise ja ümbermuutumise vahelVäljundviigu oleku muutused tekitavadki signaali.+С помощью более сложных счётчиков можно помимо измерения длинны сигнала так же создавать сигналыДля этого у счётчика есть компаратор (блок сравнения) значений (англ. //output compare unit//и блок вывода результатов сравнения (англ. //compare match output unit//). Регистры компаратора имеют ту же битовую ширину, что и сам счётчик и значения их регистров сравниваются со значениями счётчика во время его работыВ тот моменткогда значение регистра компаратора сравняется со значением счётчикаможно совершить прерывание и изменение состояния специальных выходных выводовВ момент сравнения вывод может быть установлен в высокоенизкое или обратное положениеИзменения состояния выходного вывода генерируют сигнал.
  
-Mõnedel signaali genereerimise režiimidel on määratav ka loenduri suurim väärtus - loenduri füüsiline suurus jääb küll samaks, kuid mängus on võrdlusregister, mille väärtust ületades loendur nullitakseSeda võimalust kasutades saab eespool toodud ülesandeid täpse ajalise katkestuse tekitamise kohta lahendadakuid mõeldud on see pigem signaali perioodi muutmiseksLisaks sellele on võimalik loendurit seadistada režiimikus see toimib nii juurde- kui mahalugemisel.+В некоторых режимах генерирования сигнала максимальное значение счётчика может быть измененоФизическая величина счётчика остаётся такой жено он обнуляется при превышении значения регистра сравненияИспользуя эту возможностьможно решить вышеприведённые задания, но это скорее предусмотрено для изменения периода сигнала. Так же счётчик можно настроить в режим прямого (увеличение) и обратного (уменьшение) счёта.
  
-Loendurid ja nende abil genereeritavate signaalide režiimid on ühed keerulisemad perifeeriamoodulid AVR-ilKõigist neist kirjutamine läheks pikaks ja enamasti pole nende kasutamisel kõike detailselt teadaSeetõttu on järgnevalt kirjeldatud vaid üht levinuimat PWM signaali robootikasÜlejäänut saab juba AVR dokumentatsioonist järgi uurida.+Счётчики, и генерируемые с их помощью режимы сигналов, являются одними из самых сложных периферических модулей в AVR. Их описание выходит за рамки данного текста, и в большинстве случаев нет необходимости знать все аспекты их использованияВ связи с этим, далее приведён только один из них, наиболее распространённый в роботике, сигнал ШИМ (широтно-импульсная модуляция)Информацию об остальных можно получить в документации к AVR.
  
-==== Pulsilaius-modulatsioon ====+==== Широтно-импульсная модуляция ====
  
-Pulsilaius-modulatsioon (inglise keeles //pulse width modulation//, lühend PWMon signaali tüüpmille sagedus ja ühtlasi ka perioodid on konstantne (enamasti), kuid mõlema poolperioodi pikkus on muutuvPWM signaale kasutatakse elektromehaanilisteoptiliste jmsseadmete juhtimiseks. Näiteks mudelismist tuntud servomootorite PWM signaal on 50 Hz sagedusega ja 1 ms kuni 2 ms pikkuse kõrge poolperioodiga.+ШИМ (англ. //pulse width modulation//– это тип сигналачастота и период (обычно), которого константен, но длинна полупериодов меняетсяСигналы ШИМ используются для управления электромеханическимиоптическими и другими приборамиНапример, сервомотор, известный в моделировании, использует сигнал ШИМ с частотой в 50 Hz и высокий полупериод длинной от 1 ms до 2 ms.
  
-<box 100% round #EEEEEE|Näide>+<box 100% round #EEEEEE|Пример>
  
-Vaja on 8 MHz taktsagedusel töötava ATmega128-ga genereerida kaks kiirusreguleeritavat servomootori signaaliViiguga PB5 (OC1A) tuleb genereerida pulsipikkus 1 ms ja viiguga PB6 (OC1B) pulsipikkus 2 ms.+Используя 8 MHz ATmega128, требуется сгенерировать два регулирующих скорость сигнала сервомотораВыводом PB5 (OC1A) следует сгенерировать длину пульса в 1 ms и выводом PB6 (OC1B) длину пульса в 2 ms.
  
 <code c> <code c>
Line 130: Line 130:
 int main() int main()
 { {
- // Viigud väljundiks+ // Установить выводы выходами
  DDRB |= (1 << PIN5) | (1 << PIN6);  DDRB |= (1 << PIN5) | (1 << PIN6);
  
- // Väljundid ja võrdusmomendil madalaks+ // Выходы и во время сравнения низкими
- // "Fast PWM" režiimsagedusjagur 8+ // режим "Fast PWM", делитель частоты 8
  TCCR1A = (1 << COM1A1) | (1 << COM1B1) | (1 << WGM11);  TCCR1A = (1 << COM1A1) | (1 << COM1B1) | (1 << WGM11);
  TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11);  TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11);
  
- // Suurim loenduri väärtusValem:+ // Наибольшее значение счётчикаФормула:
  //   TOP = 8 MHz / 8 / 50 Hz  //   TOP = 8 MHz / 8 / 50 Hz
  ICR1 = 20000;  ICR1 = 20000;
  
- // Esimese mootori poolperiood 1 ms, teisel 2 ms+ // Полупериод первого мотора 1 ms, второго 2 ms
  OCR1A = 1000;  OCR1A = 1000;
  OCR1B = 2000;  OCR1B = 2000;
  
- // Lõputu programmitsükkel+ // Бесконечный цикл программы
  while (1) continue;  while (1) continue;
 } }
ru/avr/timers.1376499741.txt.gz · Last modified: 2020/07/20 09:00 (external edit)
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0