STM32 Blue Pill. В помощь чайнику.

woodlist
Offline
Зарегистрирован: 28.10.2018

Привет, сообщество!

Нужно порешать в подпрограмме следующую задачу. Надо подсчитать в микросекундах или в системных тиках и возвращать период входящего меандра, начало отсчета по любому поступающему впервые фронту. Программа должна компилироватся в среде Arduino IDE. Предпочтительный входной порт-PA2. PulseIn оператор не сгодился, так как входные частоты большие, порядка 300 кГц. Меандр действует всегда, так что обвязатся жестко по прерыванию нельзя, а только по обращении к подпрограмме.

За ранее благодарю.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

woodlist пишет:

Нужно порешать в подпрограмме следующую задачу. Надо подсчитать ....

Порешай, я в принципе не против.  Думаю, другие тоже.  А вопросы появятся, задавай, не стесняйса. 

nik182
Offline
Зарегистрирован: 04.05.2015

А чем отличается программа от прерывания? Почему ему обвязаться нельзя. Мне кажется наоборот на таких частотах только прерыванием можно чтото померить с приемлимой точностью. 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Обвязаться нельзя жестко - можно задохнуться, а мягко можно. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Выдерни код из генератора DIMAX и будет тебе счастье

b707
Offline
Зарегистрирован: 26.05.2017

woodlist пишет:

Привет, сообщество!

Нужно порешать в подпрограмме следующую задачу.

За ранее благодарю.

Выглядит как заказ разработки скетча. Подобные запросы размещаются в разделе "Ищу исполнителя"

bwn
Offline
Зарегистрирован: 25.08.2014

b707 пишет:

woodlist пишет:

Привет, сообщество!

Нужно порешать в подпрограмме следующую задачу.

За ранее благодарю.

Выглядит как заказ разработки скетча. Подобные запросы размещаются в разделе "Ищу исполнителя"

Там они за денюжку, а здесь на миссионерских началах. 

То ТС, ознакомьтесь с этим. Особое внимание, на пункты 4, 5.

woodlist
Offline
Зарегистрирован: 28.10.2018

Те, кто ищут заказы на возмездных началах, тех попрошу перейти на соответствующий раздел. А кто не против 5-6 строчек кода выложить по "миссионерски", тех прошу помочь. А остроумных прошу поразмяться где нибудь встороне.

woodlist
Offline
Зарегистрирован: 28.10.2018

А где можно найти программу DIMAX?

b707
Offline
Зарегистрирован: 26.05.2017

woodlist пишет:

А где можно найти программу DIMAX?

в разделе "проекты"

ЗЫ - советую воздержаться от указаний, кому на форуме куда идти. Это ведь вы сюда в гости пришли, а не мы к вам в гостинную ввалились

woodlist
Offline
Зарегистрирован: 28.10.2018

b707 пишет:

woodlist пишет:

А где можно найти программу DIMAX?

в разделе "проекты"

ЗЫ - советую воздержаться от указаний, кому на форуме куда идти. Это ведь вы сюда в гости пришли, а не мы к вам в гостинную ввалились

За указание по проектам спасибо. А про то, что я "ввалился", так это не культурно сказано. Тему создал я. Справку с кадастра предъявить не смогу, но по логике я тут хозяин, а Вы-гость.

bwn
Offline
Зарегистрирован: 25.08.2014

woodlist пишет:

 А про то, что я "ввалился", так это не культурно сказано. Тему создал я. Справку с кадастра предъявить не смогу, но по логике я тут хозяин, а Вы-гость.

Вы таки мою ссылку почитайте. А то создали вы, а закроем мы. Так то.

woodlist
Offline
Зарегистрирован: 28.10.2018

Не думал, что кому то в кайф мешать одним помогать другим. Вам то с которой стороны не приглягуласть моя просьба к экспертному сообществу? Не тяжелая ли жизнь, с возрастающими платежами ЖКХ и непомерными процентами по банковским кредитам? Вот странные люди...

bwn
Offline
Зарегистрирован: 25.08.2014

Да потому, что никому это неинтересно. Типа, от скуки пойти соседу огород вскопать? И звучит это у вас не просьбой, а требованием. Отшень разные весчи. ИМХО.
Хотите глума, продолжайте в том же духе.

woodlist
Offline
Зарегистрирован: 28.10.2018

bwn пишет:

Да потому, что никому это неинтересно. Типа, от скуки пойти соседу огород вскопать? И звучит это у вас не просьбой, а требованием. Отшень разные весчи. ИМХО.
Хотите глума, продолжайте в том же духе.

Вам не интересно, так пройдите мимо. Я же поперек вашей дорожке ничего не выкладовал?

woodlist
Offline
Зарегистрирован: 28.10.2018

Вам бы очки поменять... Слова "прошу" и "за ранее благодарю" не попались в глаза?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

woodlist пишет:

А где можно найти программу DIMAX?

Здесь!

woodlist
Offline
Зарегистрирован: 28.10.2018

ua6em пишет:

woodlist пишет:

А где можно найти программу DIMAX?

Здесь!

Низкий Вам поклон от меня!

b707
Offline
Зарегистрирован: 26.05.2017

woodlist пишет:

 "за ранее благодарю" не попались в глаза?

попались, глаза режет. Словарик русского языка купите

woodlist
Offline
Зарегистрирован: 28.10.2018

b707 пишет:

woodlist пишет:

 "за ранее благодарю" не попались в глаза?

попались, глаза режет. Словарик русского языка купите

Русский не родной мне язык. Вот потеште меня, разъяснитесь на армянском столько, сколько я на русском.

 

b707
Offline
Зарегистрирован: 26.05.2017

woodlist пишет:

Русский не родной мне язык. Вот потеште меня, разъяснитесь на армянском столько, сколько я на русском.

 

ну тогда извиняйте. Я б и слова не сказал. если б вы сами не стали в эти слова тыкать.

"Заранее" пишется слитно.

woodlist
Offline
Зарегистрирован: 28.10.2018

b707 пишет:

woodlist пишет:

Русский не родной мне язык. Вот потеште меня, разъяснитесь на армянском столько, сколько я на русском.

 

ну тогда извиняйте. Я б и слова не сказал. если б вы сами не стали в эти слова тыкать.

"Заранее" пишется слитно.

Учту, спасибо.

woodlist
Offline
Зарегистрирован: 28.10.2018

А какие еще порты есть, работающие по прерываниям, кроме РВ8, как в программе Dimax?

b707
Offline
Зарегистрирован: 26.05.2017

woodlist пишет:

А какие еще порты есть, работающие по прерываниям, кроме РВ8, как в программе Dimax?

в СТМ32 по-моему любой пин может генерить прерывание, но общее число прерываний ограничено

woodlist
Offline
Зарегистрирован: 28.10.2018
float measurevolt() {
 tryout = 0; counter = 0;
 tryagain: attachInterrupt(voltPin, donothing, FALLING);
 if (tryout == 0) counter = micros();
 tryout++;
 if (tryout < 2) goto tryagain;
 else {
  counter = micros() - counter;
  detachInterrupt(voltPin);
  Volt = counter;
  return Volt;
 }
}

void donothing() {
}

 

woodlist
Offline
Зарегистрирован: 28.10.2018

Вот какой код я написал. Пока в деле не прогонял, но надеюсь, что сработает.

nik182
Offline
Зарегистрирован: 04.05.2015

Число прерываний неограничено. Есть индивидуальные, есть групповые , но в любом случае можно обслужить все. 

woodlist
Offline
Зарегистрирован: 28.10.2018

woodlist пишет:

Вот какой код я написал. Пока в деле не прогонял, но надеюсь, что сработает.

Хорошая статья, доходчиво разъяснено.

https://www.allaboutcircuits.com/technical-articles/using-interrupts-on-arduino/

ssss
Offline
Зарегистрирован: 01.07.2016

В СТМ32 это делается ваще всё хардварно на таймере... по прерыванию только данные забрать... Как там в ардуино не знаю... но гугль в помощь... тема довольно избитая...

woodlist
Offline
Зарегистрирован: 28.10.2018
int measurevolt() {
  if (voltflag == LOW) {
    attachInterrupt(voltPin, dosomething, CHANGE);
     }
  else return volttime;
}
void dosomething() {
  if (tryout == 0) counter = micros();
  tryout++;
  if (tryout < 2) {
    voltflag = HIGH;
  }
  else {
    detachInterrupt(voltPin);
    volttime = micros() - counter;
    tryout = 0;
    voltflag = LOW;
  }
}

Обновил код, но все таки поведение не стабильное. Генератором служит Nano, подключенный к 5В толерантному порту. По 20 микросенд пульс и пауза от генератора, а на приъемной стороне на СТМ измерение показывет от 4 до 54 елиниц. Но в обшем СТМ реагирует на изменение чесел в НАНО, обрыв связи четко показывает 0.

woodlist
Offline
Зарегистрирован: 28.10.2018

Вопрос про программную обработку входящего импульса успешно решена.

int v0_HZ = 155500; // Частота в Герцах при 0 Вольт
int v30_HZ = 136650; //// Частота в Герцах при 30 Вольт
// Расчет постоянных k и b в функции y = k*x + b
float kk = (12.9 / ((float)v30_HZ - (float)v0_HZ));
float bb = (12.9 * (1 + (float)v30_HZ / ((float)v0_HZ - (float)v30_HZ)));
void setup()
{
  Serial.begin(115200);
  pinMode(PA6, INPUT_PULLUP); // Ножка, куда подается частота от преобразователя вольт-частота
  // Инициализация таймера
  Timer3.pause();
  Timer3.setPrescaleFactor(1); // один "тик" равен 1/72 микросекунде
  Timer3.setInputCaptureMode(TIMER_CH1, TIMER_IC_INPUT_DEFAULT);
  Timer3.setInputCaptureMode(TIMER_CH2, TIMER_IC_INPUT_SWITCH);
  Timer3.setPolarity(TIMER_CH2, 1);
  Timer3.setSlaveFlags(TIMER_SMCR_TS_TI1FP1 | TIMER_SMCR_SMS_RESET);
  Timer3.refresh();
  Timer3.resume();
}

void loop()
{
  Serial.print("Вольт ");
  Serial.print(GetFreq());
  Serial.println(" В");
  delayMicroseconds(20);

}

float GetFreq() {
  // Функция, которая возвращает значение в Вольтах
  // Расчет производится в течении от 95 до 100 микросекунд
  unsigned int x = 0;
  if (Timer3.getInputCaptureFlag(TIMER_CH2))
  {
    Timer3.getCompare(TIMER_CH2);
  }
  if (Timer3.getInputCaptureFlag(TIMER_CH1))
  {
    x = (unsigned int)(72000000 / (Timer3.getCompare(TIMER_CH1) + 2));
  }
  return kk * (float)x + bb;
}

 

woodlist
Offline
Зарегистрирован: 28.10.2018

woodlist пишет:

Вопрос про программную обработку входящего импульса успешно решена.

int v0_HZ = 155500; // Частота в Герцах при 0 Вольт
int v30_HZ = 136650; //// Частота в Герцах при 30 Вольт
// Расчет постоянных k и b в функции y = k*x + b
float kk = (12.9 / ((float)v30_HZ - (float)v0_HZ));
float bb = (12.9 * (1 + (float)v30_HZ / ((float)v0_HZ - (float)v30_HZ)));
void setup()
{
  Serial.begin(115200);
  pinMode(PA6, INPUT_PULLUP); // Ножка, куда подается частота от преобразователя вольт-частота
  // Инициализация таймера
  Timer3.pause();
  Timer3.setPrescaleFactor(1); // один "тик" равен 1/72 микросекунде
  Timer3.setInputCaptureMode(TIMER_CH1, TIMER_IC_INPUT_DEFAULT);
  Timer3.setInputCaptureMode(TIMER_CH2, TIMER_IC_INPUT_SWITCH);
  Timer3.setPolarity(TIMER_CH2, 1);
  Timer3.setSlaveFlags(TIMER_SMCR_TS_TI1FP1 | TIMER_SMCR_SMS_RESET);
  Timer3.refresh();
  Timer3.resume();
}

void loop()
{
  Serial.print("Вольт ");
  Serial.print(GetFreq());
  Serial.println(" В");
  delayMicroseconds(20);

}

float GetFreq() {
  // Функция, которая возвращает значение в Вольтах
  // Расчет производится в течении от 95 до 100 микросекунд
  unsigned int x = 0;
  if (Timer3.getInputCaptureFlag(TIMER_CH2))
  {
    Timer3.getCompare(TIMER_CH2);
  }
  if (Timer3.getInputCaptureFlag(TIMER_CH1))
  {
    x = (unsigned int)(72000000 / (Timer3.getCompare(TIMER_CH1) + 2));
  }
  return kk * (float)x + bb;
}

 

Тут только один момент надо учитывать, что замер частоты генератора проводился на 12,9Вольт вместо 30В. Однако учитывая линейний характер Вольт/Частота зависимости, для получения функции напряжения по двум произвольным точкам, в данном случае 0 и 12,9 Вольт.

woodlist
Offline
Зарегистрирован: 28.10.2018

Терперь другая проблема встала. Генератор, управляемый напряжением, собранный на таймере NE555 не стабилно выдает частоту. Симуляция на Multisim14 также подтверждает дребезг частоты при управляющем напряжении, ниже половины питания.

Жаль, не найти вышедший из производства LM566.

Кто бы мог поткинуть не сложную схемную реализацию ГУН?

woodlist
Offline
Зарегистрирован: 28.10.2018

woodlist пишет:

Терперь другая проблема встала. Генератор, управляемый напряжением, собранный на таймере NE555 не стабилно выдает частоту. Симуляция на Multisim14 также подтверждает дребезг частоты при управляющем напряжении, ниже половины питания.

Жаль, не найти вышедший из производства LM566.

Кто бы мог поткинуть не сложную схемную реализацию ГУН?

Программная интерпретация напряжения плавает всего на 0,4Вольта, но это слишком великовато для данной задачи. Нужен настолько стабильное генерирование, чтоб разброс измерения напряжения не превышал 15 милиВольт.

woodlist
Offline
Зарегистрирован: 28.10.2018

Стоит попробывать https://obrazki.elektroda.pl/7997272900_1364637459.png

Конечно, сначало на симуляторе.