О сайте Группа в контакте RSS Годограф Volksturm Импульсные металлоискатели IB металлоискатели Пинпоинтеры Другие схемы Заказать Конструкции металлоискателей Полезные ссылки

Схемы металлоискателей MD4U

Сборка, настройка, обсуждение, теория и практика построения металлоискателей.
Текущее время: Вс: 25 авг 2019 1:58

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему
 [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: STM32 Mеталлоискатель
СообщениеДобавлено: Вс: 11 авг 2019 23:35 
Не в сети

Зарегистрирован: Чт: 18 апр 2019 12:37
Сообщения: 4
Привет друзья

Я давно начал работать над проектом металлоискателя со схемой STM32 и радиомодулем nrf51822-04. Я хотел бы попросить вас о помощи в разработке кода для моего проекта. Буду признателен, если кто-нибудь из вас посоветует мне, как измерить сдвиг фазы и отобразить его на последовательном порту в форме VDI а также посоветует мне отладку, я новичок в программировании и совет мне очень поможет. Я прилагаю схему и несколько фотографий моего проекта.


У вас нет необходимых прав для просмотра вложений в этом сообщении.


Вернуться к началу
 Профиль  
 


Вы можете отключить эти сообщения.
 Заголовок сообщения: Re: STM32 Mеталлоискатель
СообщениеДобавлено: Пн: 12 авг 2019 0:04 
Не в сети

Зарегистрирован: Чт: 24 дек 2015 18:18
Сообщения: 77
для начала нужно бы определиться сдвиг фазы чего хотите измерить
отладку можно посоветовать использовать SWO, PB3 вроде как свободен


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 Mеталлоискатель
СообщениеДобавлено: Пн: 12 авг 2019 0:13 
Не в сети

Зарегистрирован: Чт: 18 апр 2019 12:37
Сообщения: 4
Да, я знаю, мне просто нужно знать, как это сделать, мне нужен базовый код, который бы работал. Я написал код, основанный на этом принципе, но нет возможности отладить почву.

https://github.com/dc42/arduino/blob/master/MetalDetector/MetalDetector.ino


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 Mеталлоискатель
СообщениеДобавлено: Пн: 12 авг 2019 0:22 
Не в сети

Зарегистрирован: Чт: 18 апр 2019 12:37
Сообщения: 4
Вот тестовый код, который хорошо работает в воздухе, но при применении к земле он перестает работать, потому что я не знаю, как отлаживать почву.

https://www.youtube.com/watch?v=1R7Nce4q9Yo


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 Mеталлоискатель
СообщениеДобавлено: Ср: 14 авг 2019 18:21 
Не в сети

Зарегистрирован: Чт: 18 апр 2019 12:37
Сообщения: 4
Привет у меня есть эта часть кода, которая посылает квадратный сигнал Tx 10 кГц и выполняет 8 измерений, которые затем делятся на 4 фазы по 90 градусов. Я хочу спросить, как преобразовать эти результаты в VDI и отладить почву ? Код написан на Arduino с ядром https://github.com/rogerclarkmelbourne/Arduino_STM32 вот код, который отправляет полученное измерение в последовательный порт.

Код:
#include <STM32ADC.h>
STM32ADC myADC(ADC1);
uint8 RxPin = PA6;
const int TxPin = PA4;
const int maxSamples = 1;
uint16_t dataPoints[maxSamples];

#define SerialMode Serial

int frequency = 10000; // frequency (Hz)
int prescaler = 4;
double freq;
 
int Calibrate = 1;

int16_t bins[4];                 // bins used to accumulate ADC readings, one for each of the 4 phases
uint16_t numSamples = 0;
const uint16_t numSamplesToAverage = 64;

volatile int16_t averages[4];         // when we've accumulated enough readings in the bins, the ISR copies them to here and starts again
volatile uint32_t ticks = 0;         // system tick counter for timekeeping
volatile bool sampleReady = false;  // indicates that the averages array has been updated

int16_t calib[4];                // values (set during calibration) that we subtract from the averages

int interruptCounter = 0;
volatile uint8_t lastctr;
volatile uint16_t misses = 0;    // this counts how many times the ISR has been executed too late. Should remain at zero if everything is working properly.

void Tx_Rx_Isr(void) {

  ++ticks;
  interruptCounter++;
  uint8_t ctr = interruptCounter;

  if (ctr == 2) {
      digitalWrite(TxPin, 0);
  }
  if (ctr == 6) {
      digitalWrite(TxPin, 1);
  }

  if (ctr != ((lastctr + 1) & 8))
  {
  ++misses;
  }
  lastctr = ctr;
  int16_t *p = &bins[ctr -1 & 3];
  if (ctr < 5)
  {
  *p += dataPoints[0];
  //if (*p > 16000) *p = 16000;
  }
  else
  {
  *p -= dataPoints[0];
  //if (*p < -16000) *p = -16000;
  }

  if (ctr == 8)
  {
    ++numSamples;
    if (numSamples == numSamplesToAverage)
    {
      numSamples = 0;
      if (!sampleReady)      // if previous sample has been consumed
      {
       memcpy((void*)averages, bins, sizeof(averages));
       sampleReady = true;
      }
      memset(bins, 0, sizeof(bins));
    }
    interruptCounter = 0;
  }   
}

void setup()
{
  SerialMode.begin(57600);

  pinMode(TxPin, OUTPUT);     

  myADC.calibrate(); 
  myADC.setSampleRate(ADC_SMPR_1_5);//set the Sample Rate
  myADC.setPins(&RxPin, 1);           //set how many and which pins to convert.
  myADC.setContinuous();            //set the ADC in continuous mode.
  myADC.setDMA(dataPoints, 1, (DMA_MINC_MODE | DMA_CIRC_MODE), NULL); 
  myADC.startConversion();     
 
  Timer1.setPrescaleFactor(prescaler);
  freq = (72000000/2/prescaler)/frequency/4;
  Timer1.setOverflow(freq);
  Timer1.attachCompare1Interrupt(Tx_Rx_Isr);

  while (!sampleReady) {}    // discard the first sample
  misses = 0;
  sampleReady = false;
}

void loop() {
   while (!sampleReady) {}
   uint32_t oldTicks = ticks;

   if(1 == Calibrate){
   calib[0] = averages[0];
   calib[1] = averages[1];
   calib[2] = averages[2];
   calib[3] = averages[3];
   
   sampleReady = false;
   Calibrate = 0;
   }
   else
   { 
   averages[0] -= calib[0];
   averages[1] -= calib[1];
   averages[2] -= calib[2];
   averages[3] -= calib[3];
   sampleReady = false;

   SerialMode.print("Average 1: ");
   SerialMode.println(averages[0]);
   SerialMode.print("Average 2: ");
   SerialMode.println(averages[1]);
   SerialMode.print("Average 3: ");
   SerialMode.println(averages[2]);
   SerialMode.print("Average 4: ");
   SerialMode.println(averages[3]);
   SerialMode.println(); 

   }
   while (ticks - oldTicks < 8000)
  {
}
}


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти: