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

 
 
 
Reply to this topicStart new topic
> Померить переменный ток
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
Herz
сообщение Jan 25 2013, 06:33
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



Так не берите 500 периодов и будет быстрее.
Go to the top of the page
 
+Quote Post
1245
сообщение Jan 25 2013, 06:35
Сообщение #3


Участник
*

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



Цитата(Herz @ Jan 25 2013, 09:33) *
Так не берите 500 периодов и будет быстрее.


так тогда точность сильно падает и разброс большой становится(
Go to the top of the page
 
+Quote Post
hd44780
сообщение Jan 25 2013, 07:42
Сообщение #4


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

Группа: Свой
Сообщений: 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
1245
сообщение Jan 25 2013, 08:15
Сообщение #5


Участник
*

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



спасибо за совет, а чем Вам не нравятся проверка условий?

Бегу смотреть выходы датчика...
Go to the top of the page
 
+Quote Post
xemul
сообщение Jan 25 2013, 08:48
Сообщение #6



*****

Группа: Свой
Сообщений: 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
Сообщение #7


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

Группа: Свой
Сообщений: 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
1245
сообщение Jan 25 2013, 09:11
Сообщение #8


Участник
*

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



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

Меньше одного (полу)периода не получится.
Можно завести кольцевой буфер на число интервалов, складывать в него (ADC1->DR-3070)*(ADC1->DR-3070) и считать RMS по каждому новому измерению.


3070- значение измеренное)

вкладывал такую логику: период постоянный, таймер заводится на период, и пока таймер измеряет один период АЦП постоянно работает.
Т.е. измерений будет много).

Возможно неправильно настроен таймер. Может кто подскажет как его настроить на измерение промежутка 20мс ?
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jan 26 2013, 14:15
Сообщение #9


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

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



Цитата(1245 @ Jan 25 2013, 11:11) *
3070- значение измеренное)

Код
int GetRandomNumber()
{
        return 4; // Число получено подбрасыванием кубика
}
©пёрто в интернете.

Какой смысл замерять и заносить как число то, что можно учесть автоматически? (см. мой предыдущий ответ)
Ценой одного вычитания, одного умножения и одного деления на получение значения RMS (а не на один отсчет АЦП).
Все остальные вычисления, что на каждій отсчет АЦП, что на каждое значение rms — ровно как у Вас с магическим числом.


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

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

 


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


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