В данном посте речь пойдет об одном из вариантов измерения действующего значения напряжения и частоты сети на 8-ми битном микроконтроллере PIC18. При желании, можно метод перенести на любой другой МК, вплоть до всеми любимых ARDUINO (если они поддерживают реализацию прерываний по таймеру с частотой 5-10 кГц).
Также, рассматриваемый метод позволяет измерять частоту сетевого напряжения без использования внешних дополнительных средств, таких как компараторы. Но, при этом приходится жертвовать либо временными ресурсами МК, либо точностью измерения частоты.
Почему важно измерять действующее значение, а не какое либо другое, например, средневыпрямленное? Большинство “китайских” электронных вольтметров измеряют сетевое напряжение по средневыпрямленному значению. Методика измерения следующая: за период сетевого напряжения делается выборка из N значений амплитуды напряжения, результаты суммируются (без знака), делятся на N (усредняются), после чего полученный результат умножается на коэффициент
![](https://habrastorage.org/r/w780q1/storage3/59d/9b0/63c/59d9b063c299b5398e2b5cae80f5f470.jpg)
Указанный коэффициент определяет зависимость действующего значения синусоидального (!) сигнала от средневыпрямленного.
Такая методика измерения проста, не требует много ресурсов микроконтроллера (как временных, так и ресурсов памяти). Основным недостатком такой методики измерения является большая ошибка измерения на несинусоидальных сигналах.
Как все знают, изменение сигнала сетевого напряжения подчиняется синусоидальному закону (вследствие применения синхронных генераторов на электростанции), с частотой изменения сигнала 50 Гц (60 Гц). Однако, на практике вследствие влияния сторонних факторов (в основном подключение к сети мощных нелинейных нагрузок), а также применения инверторов с квазисинусоидальным выходным напряжением (см. рисунок), синусоида напряжения либо значительно искажается, либо заменятся прямоугольными импульсами. В таких случаях указанный выше метод измерения даст очень большую погрешность (например, в квазисинусоидальных инверторах выходное напряжение, измеренное “китайским» вольтметром может быть равно 180-200В, в то время как действующее напряжение будет равно 220В ).
![](https://habrastorage.org/r/w1560/storage3/772/895/998/77289599897f8e2331a19e455d16b02e.png)
Например, напряжение у меня дома
![](https://habrastorage.org/r/w1560/storage3/e52/a10/7ad/e52a107aded893dd38add43d568ad437.png)
Почему важно измерять именно действующее значение напряжения (тока)? Потому что именно действующие (еще называют его эффективными) значения напряжения и тока определяют работу электрической системы (грубо говоря, электронагреватель выделяет тепло в прямой зависимости от действующих значений напряжения и тока сети).
Действующее значение измеряемой периодической величины рассчитывается по формуле
![](https://habrastorage.org/r/w780q1/storage3/0d4/483/1b0/0d44831b05a61ff14f727899023d3900.jpg)
Или после дискретизации получим
![](https://habrastorage.org/r/w780q1/storage3/ee3/dd6/536/ee3dd653613eafcc6dbbfe7c2103224f.jpg)
Т.е. нам нужно делать выборку ряда значений за период сетевого напряжения, просуммировать значения квадратов точек выборки, поделить на количество точек за период (при определении количества точек выборки не забываем про теорему Котельникова-Шеннона), и взять квадратный корень из полученного результата.
Вроде бы ничего сложного, если бы не но:
1) Каждый период точки выборки набираются заново, что увеличивает погрешность измерения;
2) В реальной сети, около нуля напряжения, могут встречаться как “нулевые полки”, так и повторные переходы через ноль напряжения, что значительно внесет погрешность в измерение.
С первым пунктом будем бороться измерением измерением суммы квадратов точек выборки за каждый полупериод, после чего суммируя n-ую сумму квадратов с (n+1)-й и откидывая (n-1)-ую.
Со вторым пунктом будем бороться введением зон нечувствительности по напряжению (введем границы напряжения перехода через ноль с положительной и отрицательной сторон) обычно 5-10 В в обе стороны, а также зон нечувствительности по частоте (ограничим допустимую частоту сигнала напряжения).
Таким образом, мы получим рассчитанное значение действующего значения сетевого напряжения за период на каждом полупериоде сетевого напряжения.
![](https://habrastorage.org/r/w780q1/storage3/51d/949/9d2/51d9499d2ee0312233cd65c70bace71b.jpg)
Частота напряжения вычисляется по формуле:
![](https://habrastorage.org/r/w780q1/storage3/8f8/e49/2a7/8f8e492a7683b049bdaacd8607e61f15.jpg)
где Fд — частота дискретизации (для удобства и увеличения точности измерения частоты выбрана равной 10 кГц (период выборки — 100 мкс)).
Теперь рассмотрим структурную схему измерительной части (в реальной схеме следует добавить фильтрующие и защитные элементы).
![](https://habrastorage.org/r/w1560/storage3/156/bdf/ac2/156bdfac28ba637656e679d161a71aad.png)
Внимание! В данном методе измерения не реализована гальваническая развязка микроконтроллера от сети. Гальваноразвязка реализуется на стороне цифрового интерфейса передачи данных от микроконтроллера.
На входе установлен дифференциальный операционный усилитель с делителем напряжения, опертым на половину опорного напряжения (2,048 В). Поскольку, для уменьшения размеров лучше применять маломощные резисторы, устанавливаем их минимум 3 шт. равными по сопротивлению — чтобы увеличить суммарное пробивное напряжения резисторов. При этом нужно подсчитать мощность потерь при максимальном входном напряжении (P=U^2/R) — чтобы не превышала допустимой мощности резисторов. Плечи дифференциального усилителя тоже делаем равными. Тогда, напряжение в точке 1 рассчитывается по формуле:
![](https://habrastorage.org/r/w780q1/storage3/da8/7f5/78e/da87f578ecdd25b3b3655f9270c9bd2b.jpg)
А напряжение в точке 1 будет иметь вид:
![](https://habrastorage.org/r/w780q1/storage3/eb2/421/7f0/eb24217f0ec111a48e2e8d0f3e9b5850.jpg)
Также, половина опорного напряжения подается на один из каналов АЦП. Это позволяет в постоянном режиме (например, один раз за период) определять положение уровня нуля измеряемого напряжения.
Т.е. мы обошлись операционным усилителем с однополярным питанием, и наш входной сигнал в точке 1 изменяется от 0 до Uоп. Такой способ дает достаточно точные результаты, по сравнению, например, с выпрямлением напряжения с помощью диодов.
Расчет делителя и коэффициента АЦП сводится к следующему:
![](https://habrastorage.org/r/w780q1/storage3/757/92f/60f/75792f60f50ba17cbe0c1fc003c72f4e.jpg)
где A и В — замеры АЦП (за вычетом измеренного значения нуля сигнала — AN1) для текущего и предыдущего полупериодов; N1, N2 — число замеров для текущего и предыдущего полупериодов; Nadс — разрядность АЦП; U'оп — опорное напряжение за вычетом зон нелинейности (нечувствительности) операционного усилителя (обычно 0,6 В).
Расчет делителя удобно проводить считая сигнал постоянным, приведенным к амплитуде синусоидального, а не синусоидальным. Тогда действующее значение сигнала равно амплитудному и равно значению каждого замера.
Например, нужно рассчитать делитель для измерения максимального значения 420В переменного тока:
![](https://habrastorage.org/r/w780q1/storage3/194/25e/703/19425e70339f2b39c59875160db9b432.jpg)
Сопротивление Ra выбирается в диапазоне от 500 кОм до 1500 кОм. По выбранному сопротивлению Ra рассчитывается Rb.
В итоге, алгоритм расчета действующего значения напряжения и частоты примет вид:
![](https://habrastorage.org/r/w1560/storage3/7c1/9c8/164/7c19c81641c0307ebe6236b396834839.png)
При этом часть затратных расчетов (деление, извлечение корня) можно перенести из прерывания в основную программу.
При расчете действующих значений на 8-ми битном МК целесообразно пользоваться целочисленными методами (с использованием масштабных коэффициентов) не прибегая к расчетам с плавающей запятой, а также упрощать по возможности арифметические операции (деление, изъятие квадратного корня и проч.). Это значительно экономит ресурсы МК.
Также, рассматриваемый метод позволяет измерять частоту сетевого напряжения без использования внешних дополнительных средств, таких как компараторы. Но, при этом приходится жертвовать либо временными ресурсами МК, либо точностью измерения частоты.
Почему важно измерять действующее значение, а не какое либо другое, например, средневыпрямленное? Большинство “китайских” электронных вольтметров измеряют сетевое напряжение по средневыпрямленному значению. Методика измерения следующая: за период сетевого напряжения делается выборка из N значений амплитуды напряжения, результаты суммируются (без знака), делятся на N (усредняются), после чего полученный результат умножается на коэффициент
![](https://habrastorage.org/storage3/59d/9b0/63c/59d9b063c299b5398e2b5cae80f5f470.jpg)
Указанный коэффициент определяет зависимость действующего значения синусоидального (!) сигнала от средневыпрямленного.
Такая методика измерения проста, не требует много ресурсов микроконтроллера (как временных, так и ресурсов памяти). Основным недостатком такой методики измерения является большая ошибка измерения на несинусоидальных сигналах.
Как все знают, изменение сигнала сетевого напряжения подчиняется синусоидальному закону (вследствие применения синхронных генераторов на электростанции), с частотой изменения сигнала 50 Гц (60 Гц). Однако, на практике вследствие влияния сторонних факторов (в основном подключение к сети мощных нелинейных нагрузок), а также применения инверторов с квазисинусоидальным выходным напряжением (см. рисунок), синусоида напряжения либо значительно искажается, либо заменятся прямоугольными импульсами. В таких случаях указанный выше метод измерения даст очень большую погрешность (например, в квазисинусоидальных инверторах выходное напряжение, измеренное “китайским» вольтметром может быть равно 180-200В, в то время как действующее напряжение будет равно 220В ).
![](https://habrastorage.org/storage3/772/895/998/77289599897f8e2331a19e455d16b02e.png)
Например, напряжение у меня дома
![](https://habrastorage.org/storage3/e52/a10/7ad/e52a107aded893dd38add43d568ad437.png)
Почему важно измерять именно действующее значение напряжения (тока)? Потому что именно действующие (еще называют его эффективными) значения напряжения и тока определяют работу электрической системы (грубо говоря, электронагреватель выделяет тепло в прямой зависимости от действующих значений напряжения и тока сети).
Действующее значение измеряемой периодической величины рассчитывается по формуле
![](https://habrastorage.org/storage3/0d4/483/1b0/0d44831b05a61ff14f727899023d3900.jpg)
Или после дискретизации получим
![](https://habrastorage.org/storage3/ee3/dd6/536/ee3dd653613eafcc6dbbfe7c2103224f.jpg)
Т.е. нам нужно делать выборку ряда значений за период сетевого напряжения, просуммировать значения квадратов точек выборки, поделить на количество точек за период (при определении количества точек выборки не забываем про теорему Котельникова-Шеннона), и взять квадратный корень из полученного результата.
Вроде бы ничего сложного, если бы не но:
1) Каждый период точки выборки набираются заново, что увеличивает погрешность измерения;
2) В реальной сети, около нуля напряжения, могут встречаться как “нулевые полки”, так и повторные переходы через ноль напряжения, что значительно внесет погрешность в измерение.
С первым пунктом будем бороться измерением измерением суммы квадратов точек выборки за каждый полупериод, после чего суммируя n-ую сумму квадратов с (n+1)-й и откидывая (n-1)-ую.
Со вторым пунктом будем бороться введением зон нечувствительности по напряжению (введем границы напряжения перехода через ноль с положительной и отрицательной сторон) обычно 5-10 В в обе стороны, а также зон нечувствительности по частоте (ограничим допустимую частоту сигнала напряжения).
Таким образом, мы получим рассчитанное значение действующего значения сетевого напряжения за период на каждом полупериоде сетевого напряжения.
![](https://habrastorage.org/storage3/51d/949/9d2/51d9499d2ee0312233cd65c70bace71b.jpg)
Частота напряжения вычисляется по формуле:
![](https://habrastorage.org/storage3/8f8/e49/2a7/8f8e492a7683b049bdaacd8607e61f15.jpg)
где Fд — частота дискретизации (для удобства и увеличения точности измерения частоты выбрана равной 10 кГц (период выборки — 100 мкс)).
Теперь рассмотрим структурную схему измерительной части (в реальной схеме следует добавить фильтрующие и защитные элементы).
![](https://habrastorage.org/storage3/156/bdf/ac2/156bdfac28ba637656e679d161a71aad.png)
Внимание! В данном методе измерения не реализована гальваническая развязка микроконтроллера от сети. Гальваноразвязка реализуется на стороне цифрового интерфейса передачи данных от микроконтроллера.
На входе установлен дифференциальный операционный усилитель с делителем напряжения, опертым на половину опорного напряжения (2,048 В). Поскольку, для уменьшения размеров лучше применять маломощные резисторы, устанавливаем их минимум 3 шт. равными по сопротивлению — чтобы увеличить суммарное пробивное напряжения резисторов. При этом нужно подсчитать мощность потерь при максимальном входном напряжении (P=U^2/R) — чтобы не превышала допустимой мощности резисторов. Плечи дифференциального усилителя тоже делаем равными. Тогда, напряжение в точке 1 рассчитывается по формуле:
![](https://habrastorage.org/storage3/da8/7f5/78e/da87f578ecdd25b3b3655f9270c9bd2b.jpg)
А напряжение в точке 1 будет иметь вид:
![](https://habrastorage.org/storage3/eb2/421/7f0/eb24217f0ec111a48e2e8d0f3e9b5850.jpg)
Также, половина опорного напряжения подается на один из каналов АЦП. Это позволяет в постоянном режиме (например, один раз за период) определять положение уровня нуля измеряемого напряжения.
Т.е. мы обошлись операционным усилителем с однополярным питанием, и наш входной сигнал в точке 1 изменяется от 0 до Uоп. Такой способ дает достаточно точные результаты, по сравнению, например, с выпрямлением напряжения с помощью диодов.
Расчет делителя и коэффициента АЦП сводится к следующему:
![](https://habrastorage.org/storage3/757/92f/60f/75792f60f50ba17cbe0c1fc003c72f4e.jpg)
где A и В — замеры АЦП (за вычетом измеренного значения нуля сигнала — AN1) для текущего и предыдущего полупериодов; N1, N2 — число замеров для текущего и предыдущего полупериодов; Nadс — разрядность АЦП; U'оп — опорное напряжение за вычетом зон нелинейности (нечувствительности) операционного усилителя (обычно 0,6 В).
Расчет делителя удобно проводить считая сигнал постоянным, приведенным к амплитуде синусоидального, а не синусоидальным. Тогда действующее значение сигнала равно амплитудному и равно значению каждого замера.
Например, нужно рассчитать делитель для измерения максимального значения 420В переменного тока:
![](https://habrastorage.org/storage3/194/25e/703/19425e70339f2b39c59875160db9b432.jpg)
Сопротивление Ra выбирается в диапазоне от 500 кОм до 1500 кОм. По выбранному сопротивлению Ra рассчитывается Rb.
В итоге, алгоритм расчета действующего значения напряжения и частоты примет вид:
![](https://habrastorage.org/storage3/7c1/9c8/164/7c19c81641c0307ebe6236b396834839.png)
При этом часть затратных расчетов (деление, извлечение корня) можно перенести из прерывания в основную программу.
При расчете действующих значений на 8-ми битном МК целесообразно пользоваться целочисленными методами (с использованием масштабных коэффициентов) не прибегая к расчетам с плавающей запятой, а также упрощать по возможности арифметические операции (деление, изъятие квадратного корня и проч.). Это значительно экономит ресурсы МК.