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

 
 
> Померить переменный ток
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
Ответов
xemul
сообщение Jan 25 2013, 08:48
Сообщение #2



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(1245 @ Jan 25 2013, 10:18) *
Стоит задача померить переменный ток.

По коду похоже, что даже RMS. Вот и начните с измерения длительности периода.
(если (по точности) Вам достаточно считать её константой, можете не измерять)
Потом разбейте период на достаточное (опять же по точности) число интервалов, настройте соответственно таймер,
по прерыванию таймера запускайте преобразование АЦП,
по прерыванию окончания преобразования 'rms1+=(ADC1->DR-3070)*(ADC1->DR-3070);' (если 3070 не название полироля для ручки грабель, а постоянное смещение на выходе датчика, то это значение нужно измерять/считать),
по счётчику преобразований == числу интервалов сохраняйте sqrt(rms1/(число интервалов)) в (кольцевой) буфер,
в свободное от прерываний время занимайтесь удобной формой фильтрации этого буфера.
Цитата
можно ли как-то ускорить процесс измерения?

Меньше одного (полу)периода не получится.
Можно завести кольцевой буфер на число интервалов, складывать в него (ADC1->DR-3070)*(ADC1->DR-3070) и считать RMS по каждому новому измерению.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jan 25 2013, 09:10
Сообщение #3


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(xemul @ Jan 25 2013, 10:48) *
по прерыванию окончания преобразования 'rms1+=(ADC1->DR-3070)*(ADC1->DR-3070);' (если 3070 не название полироля для ручки грабель, а постоянное смещение на выходе датчика, то это значение нужно измерять/считать),
(про полироль понравилось)
Можно считать, можно в явном виде не считать. Меньше вычислений.
В цикле:
Код
    val    = ADC1->DR;
    sum    += val;
    sum_sq += val*val;
В конце цикла
Код
    mean_square = (sum_sq - sum*sum / N) / N;
    // Т.е. тут "(название полироля) в квадрате" размазалось по коду для уменьшения операций
где N — количество отсчётов.
Если завести для val кольцевой буфер, в sum, sum_sq нужно каждый раз вычитать старое из буфера добавлять новое из АЦП, тогда по каждому отсчёту можно выдавать новое (sum_sq - sum*sum / N) / N; с минимумом вычислений.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 20th August 2025 - 09:26
Рейтинг@Mail.ru


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