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 нашел в конференциях.