Views: 1471
Измерение частоты классически можно выполнить двумя способами.
Способ первый.
Необходимо за фиксированный промежуток времени подсчитать количество периодов измеряемой частоты. После этого необходимо количество импульсов разделить на время измерения. Точность измерения зависит от длительности измеряемого промежутка времени. Чем длиннее промежуток, тем точнее можно выполнить изменения.
Второй способ.
Это измерять длительность одного периода и вычислитель частоту. Точность измерения зависит от частоты тактовых импульсов, чем выше и стабильней частота тактовых импульсов тем выше разрешение и точнее измерения.
К каждом методе есть свои плюсы и свои минусы. Если необходимо высокая точно в первом это длительность измерения, если надо быстро измерять, то необходимо высокая тактовая частота.
Для измерения частоты (в нашем варианте частоты электросети), модифицируем нашу схему следующим образом.
Все эти измерения можно выполнить при помощи встроенного таймера. Так-как у нас таймер 1 и 2 занят формированием временных интервалом. Поэтому будем для измерения частоты использовать сборку на таймерах TMR4 и TMR5. Для входа сигнала будем использовать Т4СК.
Так как периферийные модули по умолчанию “никуда не подключен”, то первым делом необходимо настроить регистры конфигурации выбора периферийного модуля. Нам надо определиться к какой ножке микроконтроллера мы подключим его вход. У нас свободна 14 нога. Это функция RP5. Для подключения входа T4CK к ноге 14 на необходимо в регистра настройки входа RPINR4 загрузить значение 5.
Для настройки входа таймера обратимся к регистрам управления входами периферийных устройств.
| Название входа | Имя периферийного модуля | Регистр | Биты конфигурации |
| External Interrupt 1 | INT1 | RPINR0 | INTR1<4:0> |
| External Interrupt 2 | INT2 | RPINR1 | INTR2R<4:0> |
| Timer2 External Clock | T2CK | RPINR3 | T2CKR<4:0> |
| Timer3 External Clock | T3CK | RPINR3 | T3CKR<4:0> |
| Timer4 External Clock | T4CK | RPINR4 | T4CKR<4:0> |
| Timer5 External Clock | T5CK | RPINR4 | T5CKR<4:0> |
| Input Capture 1 | IC1 | RPINR7 | IC1R<4:0> |
| Input Capture 2 | IC2 | RPINR7 | IC2R<4:0> |
| Input Capture 3 | IC3 | RPINR8 | IC3R<4:0> |
| Input Capture 4 | IC4 | RPINR8 | IC4R<4:0> |
| Input Capture 5 | IC5 | RPINR9 | IC5R<4:0> |
| Output Compare Fault A | OCFA | RPINR11 | OCFAR<4:0> |
| Output Compare Fault B | OCFB | RPINR11 | OCFBR<4:0> |
| UART1 Receive | U1RX | RPINR18 | U1RXR<4:0> |
| UART1 Clear To Send | U1CTS | RPINR18 | U1CTSR<4:0> |
| UART2 Receive | U2RX | RPINR19 | U2RXR<4:0> |
| UART2 Clear To Send | U2CTS | RPINR19 | U2CTSR<4:0> |
| SPI1 Data Input | SDI1 | RPINR20 | SDI1R<4:0> |
| SPI1 Clock Input | SCK1IN | RPINR20 | SCK1R<4:0> |
| SPI1 Slave Select Input | SS1IN | RPINR21 | SS1R<4:0> |
| SPI2 Data Input | SDI2 | RPINR22 | SDI2R<4:0> |
| SPI2 Clock Input | SCK2IN | RPINR22 | SCK2R<4:0> |
| SPI2 Slave Select Input | SS2IN | RPINR23 | SS2R<4:0> |
Функции ввода
| Функция | Номер ножки | Код для записи в регистр |
| RP0 | 4 | 0 |
| RP1 | 5 | 1 |
| RP2 | 6 | 2 |
| RP3 | 7 | 3 |
| RP4 | 11 | 4 |
| RP5 | 14 | 5 |
| RP6 | 15 | 6 |
| RP7 | 16 | 7 |
| RP8 | 17 | 8 |
| RP9 | 18 | 9 |
| RP10 | 21 | 10 |
| RP11 | 22 | 11 |
| RP12 | 23 | 12 |
| RP13 | 24 | 13 |
| RP14 | 25 | 14 |
| RP15 | 26 | 15 |
Настройка входа таймера:
RPINR4bits.T4CKR=5; // настройка входа таймера 4 на вывод 14 микроконтроллера (RP5) TRISB = 0b0000000000100000; // разряды порта B на выход, кроме RB5
Конфигурирование таймеров: (будем настраивать для 32 битного режима):
Чтобы настроить Timer2/3 или Timer4/5 для 32-разрядной работы необходимо:
1. Установить T32 бит (T2CON <3> или T4CON <3> = 1).
2. Настроить предделителя для Timer2 или Timer4 битами TCKPS1: TCKPS0.
3. Настроить вход для тактовых импульсов и режимов работы с помощью TCS и TGATE бит. Если TCS установлен для внешней синхронизации, RPINRx (TxCK) должны быть настроены на доступные RPn вход.
4. Настроить период работы таймера загрузив регистр PR. PR3 (или PR5) будет содержат старшее слово, в то время как PR2 (или PR4) содержать младшие слово.
5. Если требуется прерывания, установить биты в регистрах T3IE или T5IE; использовать приоритет бит, T3IP2: T3IP0 или T5IP2: T5IP0, чтобы установить прерывание приоритет. Обратите внимание, что в то время как Timer2 или Timer4 управления таймера, прерывания появляется как Timer3 или Timer5 прерывания.
6. Установить TON бит (= 1).
//--------------------------------------------------------------------------- // настройка тамера TMR4 T4CON=0b1010000000001010; // |||||||||||||||+-- неиспользуемый // ||||||||||||||+--- TCS: 1 - внешний источник // |||||||||||||+---- неиспользуемый // ||||||||||||+----- T32: 0- 32 битный режим // ||||||||||++------ TCKPS1:TCKPS0: пределитель 00-1:1 // |||||||||+-------- TGATE: - отключен // |||++++++--------- неиспользуемые // ||+--------------- TSIDL: 1- врежиме Idle отключен // |+---------------- неиспользуемый // +----------------- TON: 1 - таймер включен PR2=0xFFFF; // период счета //---------------------------------------------------------------------------
Для работы нашей схемы нам необходимо на 14 ножку контроллера подключить подтягивающий резистор. За активацию подтягивающих резисторов отвечают регистры CNPU1 и CNPU2. Для нашего контроллера соответствие с выводами контроллера следующее:
| Регистр | Управляющий бит | Вывод контроллера |
| CNPU1 | CN0PUE | 12 |
| CNPU1 | CN1PUE | 11 |
| CNPU1 | CN2PUE | 2 |
| CNPU1 | CN2PUE | 3 |
| CNPU1 | CN3PUE | 4 |
| CNPU1 | CN4PUE | 5 |
| CNPU1 | CN5PUE | 6 |
| CNPU1 | CN6PUE | 7 |
| CNPU1 | CN7PUE | |
| CNPU1 | CN8PUE | |
| CNPU1 | CN9PUE | |
| CNPU1 | CN10PUE | |
| CNPU1 | CN11PUE | 26 |
| CNPU1 | CN12PUE | 25 |
| CNPU1 | CN13PUE | 24 |
| CNPU1 | CN14PUE | 23 |
| CNPU1 | CN15PUE | 22 |
| CNPU2 | CN16PUE | 21 |
| CNPU2 | CN17PUE | |
| CNPU2 | CN18PUE | |
| CNPU2 | CN19PUE | |
| CNPU2 | CN20PUE | |
| CNPU2 | CN21PUE | 18 |
| CNPU2 | CN22PUE | 17 |
| CNPU2 | CN23PUE | 16 |
| CNPU2 | CN24PUE | 15 |
| CNPU2 | CN25PUE | |
| CNPU2 | CN26PUE | |
| CNPU2 | CN27PUE | 14 |
| CNPU2 | CN28PUE | |
| CNPU2 | CN29PUE | 10 |
| CNPU2 | CN30PUE | 9 |
Для подключение подтягивающего резистора к ножке 14 , необходимо выполнить команду
CNPU2bits.CN27PUE=1; // подключить к 14 ножке подтягивающий резистор
Так как в нашем примере, мы используем внутренний тактовый генератор, то измерения соответственно будет менее точные если бы мы использовали кварцевую стабилизацию частоты. Для корректировки длительности, будем использовать регистр PR1.
Для измерения частоты, добавить в цикл прерывания от таймера Т1 две команды:
// измерение частоты
chastota=TMR4;
TMR4=0;
т.е. таймер Т1 формирует заданный нами интервал времени, по прерыванию таймера , мы считываемым значение таймера Т4, а затем обнуляем его.
Для индикации в главном цикле программы добавим
curcorG_LCD (30,0);
bin_dec(chastota ,0,0,0);
Stringp_LCD (" герц",0,1,1);
теперь внизу дисплея мы увидим измеряемую частоту в герцах. Если период измерения 1 секунда, то измерять будем с точностью до 1 Герца, для увеличение точности до 0,1 Герца или 0,01 герца, нам надо соответственно увеличить время измерения.
Фото для первого варианта, когда период измерения равен 1 секунде.
Но для контроля качества частоты в сети нам необходимо более высокая точность, поэтому увеличим период измерения до 10 секунд. Для это нам необходимо добавить делитель, программный, чтобы увеличить время измерения до 10 секунд.
// измерение частоты
if(++chetgerc>9)
{
chetgerc=0;
chastota=TMR4;
TMR4=0;
}
а для красоты, индикации десятых долей, включит индикацию запятой перед младшим разрядом.
curcorG_LCD (30,0);
bin_dec(chastota ,1,0,0);
Stringp_LCD (" герц",0,1,1);
10 секунд на измерение это уже много. А если необходимо измерять частоту с точностью до 0,01 Герца, так это надо ждать 100 СЕКУНД!!!, а эффект усреднения который может за это время внести свои погрешности. Вообще сделаем вывод, для оперативного контроля частоты электросети такой метод не эффективен. Хотя при написании этого урока, наблюдая за частотой сети, она колебалась от 50,04 – 50,31 Герца (в режиме измерения 100 секунд).
Испробуем второй метод измерения длительности периода (или импульса). Благо, что сам модуль микроконтроллера позволяет это делать.
продолжение следует…
Это может быть интересно
12-BIT A/D CONVERTER WITH THRESHOLD DETECT на примере PIC24FJ128GA204Views: 965 Введение. 12-битный модуль A/D Converter является усовершенствованной версией 10-битного модуля, предлагаемого на некоторых устройствах PIC24. Оба модуля являются преобразователями, в своих ядрах, с последовательным приближением (SAR), в окружении …
Стабилизатор тока на SN3350, часть 2Views: 1361 Если вам необходимо разработать устройство с применением мощных светодиодов, то никак не обойтись без применения стабилизатора тока. На настоящий момент стабилизаторы тока являются самым эффективным механизмом, для питания светодиода в течение всего …
Индикатор кода – RC-5 Protocol PhilipsViews: 1189 Индикатор кода – RC-5 Protocol Philips При конструировании дистанционного управления на инфракрасных лучах для контроля удобно иметь индикатор кодов передаваемых пультом. Плата ch-c3000 позволяет изготавливать устройства с возможностью …
PIC32MZ – Core Timer (библиотека)Views: 589 Переработанные файлы от Microchip, библиотека для работы с Core Timer.
Мониторинг температурыViews: 1489 Настоящий проект создан как обучающий с применением библиотек ds18b20 и LCDHD44780 и компилятора Microchip MPLAB XC8 C Compiler V1.12. Если необходимо иметь информацию по состоянию температуры в помещении или в здании, с количеством до 6 точек (16), то …
LATINO – открытый проект ch-светомузыкиViews: 1771 Проект построенный на некоторых принципах ch-светомузыка. Проект ознакомительный предназначен, для самостоятельного построения простого и эффективного светосинтезатора. Вывод осуществляется на ВОУ собранной на драйверах HL1606. Для этого была …
WiFi ESP8266 ESP-202 (ESP-12F)Views: 8020 Первое знакомство, сначала надо его купить… http://voron.ua/catalog/024404 Схема для подключения и тестирования По схеме ставим две кнопки, сброс и кнопку BT2, для перевода в режим обновления прошивки. Если надо сделать …
BMP280 – температура и атмосферное давление – учебный проектViews: 2292 Учебный проект на PIC32 и светодиодной панели P5 (2121)-168-6432-80 (32*64). Проект позволяет ознакомиться с простой графикой и с чтением давления и температуры с датчика BMP280. Для тестирования необходимо …
CAN – Controller Area NetworkViews: 1264 Controller Area Network (CAN) первоначально был создан немецким поставщиком автомобильных систем Робертом Бош в середины 1980-х для автомобильной промышленности как метод для обеспечения возможности надежной последовательной связи. Целью было сделать автомобили более надежными, …
Analog-to-Digital Converter with Computation Technical BriefViews: 1517 Аналого-цифровой преобразователь с вычислительным модулем. ВВЕДЕНИЕ Аналого-цифровой преобразователь (ADC) с вычислительным модулем (ADC2) в 8-разрядном микроконтроллере Microchip имеет встроенные вычислительные функции, которые обеспечивают функции пост-обработки, такие как передискретизация, …




