Вечер добрый.. Помогите решить проблему, на днях сгорел стабилизатор Forte SDC-5000VA , как показало вскрытие вышел из строя контроллер samsung s3f9454 и ключи на двигатель. как я понял контроллер выполняет функцию 2 канального rms вольтметра. может у кого есть наработки .. буду благодарен, очень надо.. очень большие скачки в сети до 260 , уже телек сгорел.. с ресом бороться невозможно, спасаюсь стабилизатором.
нашел исходник на с 3х фазный мож кто поможет переделать под баском
1. АЦП на частоте 125 кГц цифрует сигнал. Обработчик прерывания Считает суммы отсчетов и их кол-во:
// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
dword adc_data, temp;
// Read the AD conversion result
adc_data=ADCW&0xFFFE;
if(isU)
{ // U
temp=adc_data; //*adc_data;
sqr_summU+=temp;
countU++;
} // if
else
{ // I
temp=adc_data; //*adc_data;
sqr_summI+=temp;
countI++;
} // else
} // adc_isr
2. Главная программа меряет по очереди ток и напряжение:
.............
// Измерение напряжения
isU=1;
sqr_summU=0;
countU=0;
ADMUX&=0xFE; // ADC0 - канал напряжения
// Запуск АЦП
ADCSRA|=0x40; // ADCSC - Start ADC
startMs=ms;
// ожидание 21 мс (20мс - период 50 Гц)
while (abs (ms-startMs)<21);
// стоп АЦП
ADCSRA&=0xBF; // 10111111 = BF
.............
для тока также, только переменные другие. Переменная ms глобальная - TC1 по прерыванию считает миллисекунды.
3. Когда оба померяли, вычисляем
// Расчет напряжения
// Среднеквадратическое
// Urms=sqrt(sum(u(i)^2)/N); u(i) - мгновенные отсчеты (с АЦП), i=1..N
f_sqr_summU = ((float)sqr_summU)/countU; // ср. арифм.
// f_sqr_summ=sqrt(f_sqr_summ); // Urms (отсчеты АЦП)
// Uацп=ADC*Vref/1024=ADC*0.005
U = f_sqr_summU*0.005;
// Uвх=Urms*109.52
U*=109.52;
// Расчет тока
// Среднеквадратическое
// Urms=sqrt(sum(u(i)^2)/N); u(i) - мгновенные отсчеты (с АЦП), i=1..N
f_sqr_summI = ((float)sqr_summI)/countI; // ср. арифм.
// f_sqr_summ=sqrt(f_sqr_summ); // Urms (отсчеты АЦП)
// Uацп=ADC*Vref/1024=ADC*0.005
I = f_sqr_summI*0.005;
// Iн=500*Uацп/148,86 =Uацп*3.359
I*=3.359;
// S - Полная мощность
S_temp=((dword)I*U);
S=S_temp;
}Отредактировано Yuriy.pv (2011-12-03 18:36:26)