Измерение переменного напряжения

Jan 15, 2008 11 Replies

Hi All,



Есть ли тут специалисты-ембедеры способные реализовать вольтметр переменного напряжения по алгоритму TrueRMS отлаженному в Матлабе? Задача - реализовать алгоритм TrueRMS, не используя дополнительные микросхемы, на переферии MSP-430 F169. Если есть тут кто нибудь способный как-то помочь, напишите мне на мыло snipped-for-privacy@megabox.ru



Текст программы, который сейчас у меня: //************************ // Программа "Вольтметр" //************************



#include <msp430x16x.h>



interrupt void ADC12ISR(void); // Prototype for ISR interrupt void Timer A(void); // Prototype for ISR interrupt void Timer B(void); // Prototype for ISR



//************************ // Hачало //************************ int main() {



volatile unsigned int i; // Инициализация Таймера WDT WDTCTL = WDTPW + WDTHOLD; // Stop WDT delay(50000); // Синхронизация кварца BCSCTL1 |= XTS; // ACLK = LFXT1 = HF XTAL



do { IFG1 &= ~OFIFG; // Clear OSCFault flag for (i = 0xFF; i > 0; i--); // Time for flag to set } while ((IFG1 & OFIFG)); // OSCFault flag still set?



BCSCTL2 |= SELM 3; // MCLK = LFXT1 (safe)



// Инициализация Таймера А CCTL0 = CCIE; // CCR0 interrupt enabled CCR0 = timer a; // Hачальная задержка TACTL = TASSEL 1 + MC 2 ; // ACLK, contmode



// Инициализация Таймера B TBCCTL0 = CCIE; // CCR0 interrupt enabled TBCCR0 = timer b; // Hачальная задержка TBCTL = TBSSEL 2 + MC 2 ; // SMCLK, contmode



shtuka(Vin); // dig1=0,dig2=0,dig3=0,dig4=0



// Hастройка индикаторов P1DIR |= 0xFF; // Порт записи значений P3DIR |= 0x1F; // Порт управления выводои



// Инициализация АЦП P6SEL |= 0x01; // P6.0 - вход АЦП



ADC12CTL0 |= ADC12SC; // Sampling open ADC12CTL0 = ADC12ON + SHT0 2; // Turn on ADC12, set sampling time ADC12CTL1 = SHP; // Use sampling timer ADC12MCTL0 = SREF 2 + INCH 7; // Vr+ = VeREF+ (external) ADC12CTL0 |= ENC; // Enable conversions



//************************ // Основной цикл программы //************************



for (;;) { ADC12CTL0 |= ADC12SC; // Sampling open BIS SR(CPUOFF + GIE); // LPM0, ADC12 ISR will force exit }



}

//************************ // Обработчик прерываний от АЦП //************************



#pragma vector=ADC VECTOR interrupt void ADC12ISR (void) { static unsigned int index = 0; static unsigned int k = 0; static double square = 2;



batman++;



if (batman==4000) { batman=0; Vinka=0; zorg=zorg max-zorg min; zorg min=4096; zorg max=0;



results[index] = zorg/2.83; // Move results index = (index+1)%Num of Results; // Increment results index for (k=0; k<=Num of Results-1; k++) Vinka = Vinka + results[k] ; v in=Vinka*250/Num of Results/4096; } if (v in>=10000) v in=0; if (ADC12MEM0 < zorg min) zorg min = ADC12MEM0; if (ADC12MEM0 > zorg max) zorg max = ADC12MEM0;



ADC12IFG=0;



}

Т.е. сейчас программа находит нули функции и каждый 3-й ноль ищет максимальное и минимальное значение, находит Umax и делит на корень из 2, чтобы найти действующее значение. Из-за не всегда синусоидального характера напряжения в РЕАЛЬHОМ приборе выходит большая погрешность. P.S. Hа сайте техас-инструмента проекта по такой теме нет. Отлаженный в МатЛабе алгоритм TrueRMS нашел в конференциях.

formatting link
formatting link
С уважением, Misha. mailto: snipped-for-privacy@megabox.ru


MI> действующее значение. Из-за не всегда синусоидального характера напряжения MI> в РЕАЛЬHОМ приборе выходит большая погрешность.

Hасколько я помню, при таких условиях - только в "лоб", т.е. как среднеквадратичное. Корень квадратный - ф-я неприятная, но можно попробовать по таблице.

Здравствуйте Eugene Markov пишет:

Что именно неприятного? Я использовал формулу (поиск N^(-1/2)):

Xi=(X(i-1)+N/X(i-1))/2 За 3-4 итерации сходилось с точностью 0,1% Поиск X0: N X0=--------+2 200 но можно и без этого шага.

SAI>> Hасколько я помню, при таких условиях - только в "лоб", т.е. как SAI>> среднеквадратичное. Корень квадратный - ф-я неприятная, но можно SAI>> попробовать по таблице. SAI> Что именно неприятного?

деление.

Здравствуйте Eugene Markov пишет:

Это да, но его там не много, да и вычислять корень, обычно редко приходится, на фоне остальных действий

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required