Views: 2381
Измерение переменного напряжения, вычисление TrueRMS.
Этот урок обучения работе с АЦП будет предназначен для измерения параметров переменного тока, это актуально к нашим электросетям, где качество поставляемой электроэнергии является проблемой. За основу вычисления величины переменного напряжения возьмем информацию на сайте http://www.easycalculation.com. TrueRMS переменного тока, это количество передаваемой энергии которое в идеале соответствует такой же величине постоянного тока.
В нашей электросети сети стандарт 230 вольт, это в идеале 0,707 от амплитудного значения переменного тока в сети, т.е. если максимальное значение амплитуды умножить на 0,707, то мы получим наши 230 вольт. По такому принципу работают большинство вольтметров. В последнее время огибающая кривой не соответствует идеалу синусоиды, а по этому и количество передаваемой энергии далека от идеала. Наша задача определить реальное количество энергии передаваемое в нашей электросети с учетом всех (возможно измеренных) искажений.
Для измерения переменного напряжения, на нашу макетную плату необходимо добавить несколько компонентов. Для измерения необходимо будет применить трансформатор, для гальванической развязки.
Схема.
Для вычисление истинного напряжения TrueRMS необходимо выполнить сканирования одного периода напряжения сети. Т.е. необходимо произвести n- количество измерений. В идеале чем чаще мы сделаем выборки тем точнее будет расчет реального напряжения.
Для измерения истинного напряжения в сети нам необходимо произвести выборку одного периода, или провести выборку на протяжении длительности более одного периода, но я думаю, что точнее будет когда мы будем для измерения выбирать один период.
Для измерения нам скорости от RC генератора АЦП будет недостаточно, поэтому Первое, что сделаем переключимся на системный генератор. Нам необходимо будет определиться какое количество измерений нам необходимо сделать за один период. Первое – необходимо организовать формирования массива данных которые потом понадобятся для вычисления.
Необходимо определить, скорость преобразования. Скорость преобразования зависит от тактовой частоты. В нашем проекте тактовая 32 мГц. Это длительность 31,25 ns. Для преобразователя необходимо 12 TAD для конвертирования 10 данных. Длительность вычисляется по формуле TAD = TCY • (ADCS<7:0>+1). Где TCY = 2 * Tosc для нашего микроконтроллера. Tosc=32 мГц.
Для буфера измерений отведем буфер 125 измерений. Для тактовой частоты 32 мГц и измеряемой 50 Гц нам необходимо установить для битов ADCS7:ADCS0: – 63, длительность выборки SAMC4:SAMC0: 28.
Для вычислений можно использовать файл ME (подготавливается).
// настройка АЦП TRISA = 0b0000000000000001; // AN0 вход AD1PCFG=0b1111111111111110; // настроить AN0 на вход AD1CHS = 0x0000; // AN0 подключить к CH0 AD1CSSL = 0; AD1CON3 = 0b0001110000111111; // ||||||||++++++++-- ADCS7:ADCS0: 63 задание длительности TAD // |||+++++---------- SAMC4:SAMC0: 28 TAD время выборки // |++--------------- не используется // +----------------- 0-системный генартор AD1CON2 = 0b0000000000011110; // |||||||||||||||+-- ALTS:всегда использует MUX A входа // ||||||||||||||+--- BUFM: два буфера по 8 регистров // ||||||||||++++---- SMPI3:SMPI0: прерывание от каждого 8 измерения // |||||||||+-------- не используется // ||||||||+--------- BUFS: бит состояния // ||||||++---------- не используется // |||||+------------ CSCNA: сканирование входов выключено // |||++------------- не используется // +++--------------- VCFG2:VCFG0: опорное AVdd и AVss AD1CON1 = 0b1000000111100000; // |||||||||||||||+-- DONE: // ||||||||||||||+--- SAMP // |||||||||||||+---- ASAM // |||||||||||++----- не используется // ||||||||+++------- SSRC2:SSRC0: от внутреннего тактового RC генератора запуск // ||||||++---------- FORM1:FORM0: Целое (0000 00dd dddd dddd) // |||+++------------ не используется // ||+--------------- ADSIDL:Продолжить работу модуля в режиме ожидания // |+---------------- не используется // +----------------- ADON:1 - АЦП - включен
В функции прерывания от АЦП выполним процедуру считывания регистров буфера АЦП и загрузки в буфер данных
void __attribute__ ((__interrupt__, __auto_psv__)) _ADC1Interrupt(void) { IFS0bits.AD1IF = 0;// сбросить бит прерывания if(_BUFS)// определяем в какую часть буфера в настоящий момент пишит АЦП // 0- запись идет в группу ADC1BUF0 до ADC1BUF7 // 1- запись идет в группу ADC1BUF8 до ADC1BUFF { ADC16Ptr = &ADC1BUF0; // будем читать данные из ADC1BUF0 до ADC1BUF7 } else { ADC16Ptr = &ADC1BUF8; // будем читать данные из ADC1BUF8 до ADC1BUFF } for (countZag = 0; countZag < 8; countZag++) { if(++countec>=125) { countec=0; Bit.ZAG=1; } ADC1izm[countec] = *ADC16Ptr++; // загрузка из буфера } }
Проект вычисляет TrueRMS переменного тока, запоминает минимальное и максимальное напряжение за все время работы, выводит на индикатор амплитудное значение.
Сам механизм вычисления:
ADCValue=0; // возведение в квадрад for (count = 0; count < 125; count++) ADC1obra[count]=ADC1obra[count]*ADC1obra[count]; // загрузка из буфера // нахождение сyммы for (count = 0; count < 125; count++) ADCValue+=ADC1obra[count]; // вычисление среднего ADCValue=ADCValue/125; // извлечение корня ADCValue=sqrt(ADCValue);
Фото проекта.
На дисплей выводиться информация по минимаксам (минимальное и максимальное значение напряжения зафиксированное за время работы, а также максимальное амплитудное. Посредине внизу напряжение в сети измеренное методом TrueRMS.
Проект, среда разработки MPLAB® X v1.70, компилятор С MPLAB XC16 v1.11.