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

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
?t=1348
formatting link
С уважением, Misha. mailto: snipped-for-privacy@megabox.ru

Reply to
Misha Ivanov
Loading thread data ...

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

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

Reply to
Eugene Markov

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

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

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

Reply to
Shapovalov Alexey Ivanovich

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

деление.

Reply to
Eugene Markov

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

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

Reply to
Shapovalov Alexey Ivanovich

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.