реклама на сайте
подробности

 
 
> Померить переменный ток
1245
сообщение Jan 25 2013, 06:18
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 21-08-12
Пользователь №: 73 205



есть датчик тока ACS712 и контроллер STM32. Стоит задача померить переменный ток. Делаю так, но сильно долго получается:

Код
RCC->APB1ENR    |= 0x00000002;                                        
TIM3->PSC = 35;                            
TIM3->EGR    = 0x0001;


  TIM3->CR1 |= 0x00000001;                    //включить таймер
  ADC1->SQR3=0x0008;                        
  TIM3->CNT=0;
  while((TIM3->CNT<5550)==1)                        //один период
  {
   ADC1->CR2 |=0x00400000;                    //запуск преобразования
   while(((ADC1->SR)&0x0002)==0);            
   rms1+=(ADC1->DR-3070)*(ADC1->DR-3070);        
   c1++;                                    //счётчик числа преобразований
  }
  TIM3->CR1 &= ~0x00000001;                  //выключить таймер
  TIM3->CNT=0;                                
  curbuf1c+=sqrt(rms1/c1);                        
  v1++;
  c1=rms1=0;  
  if(v1>=500)                                                            //взять 500 периодов
  {
   current=curbuf1c/v1;
   v1=curbuf1c=0;
  }


можно ли как-то ускорить процесс измерения?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
hd44780
сообщение Jan 25 2013, 07:42
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



А Вы обычным вольтметром/осциллографом выход датчика смотрели? Может сам датчик подвирает... Или там помехи какие-то лезут, которые проще фильтром порезать, а не гасить их жутким кол-вом итераций.
Я токовым трансом переменку на ATMega16 мерял, мне и полсекунды (25 периодов) хватило. Частоту дискретизации, кажется 10кГц была... Фильтров никаких я не ставил. Осциллом глядел - синусоида абсолютно чистая идёт. Только операционник для смещения синусоиды на полдиапазона вверх и диодный ограничитель на входе АЦП. Но Вам этого вроде не надо, датчик всё это сам делает.

Вы проверяли, какая часть Вашего алгоритма самая прожорливая по времени?
И сколько времени выполняется Ваш код?
Цикл Ваш какой-то странный. А именно проверки условий.. И возведение в квадрат мне не нравится.. Не раз натыкался на чисто компиляторные глюки, когда простые с виду конструкции неправильно работают, потому что их компилятор как-то не так их уразумел.

Попробуйте так:
Код
while(TIM3->CNT<5550)                        //один период
  {
   ADC1->CR2 |=0x00400000;                    //запуск преобразования
   while ( !((ADC1->SR)&0x0002) );            
   temp = ADC1->DR-3070;
   rms1 += temp*temp;        
   c1++;                                    //счётчик числа преобразований
  }


Только переменную temp объявите.


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd August 2025 - 19:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.01405 секунд с 7
ELECTRONIX ©2004-2016