LMIC (порт Arduino LMIC LORAWAN) не работает должным образом

йотнод
Пт 13 апреля 2018 г. 14:46
Я репостирую свои проблемы:

Всем здравствуйте,

Я пытаюсь получить Lorawan Library LMIC/Arduino Port (https: // github.com/matthijskooijman/arduino-lmic) работать с чертежом. Я установил STM32duino из Guithub ( https: // github.com/stm32duino/arduino_core_stm32 ) в соответствии с инструкциями. Модуль Lora, который я имею, основан на Semtech SX127X (различные чипы в семействе SX1272/76/78 в зависимости от частотной поддержки, но по существу работают одинаково)

Я установил библиотеку из Manager Arduino Boards Manager (из меню «Отведи вниз», v1.5+arduino-2), который компилируется для BluePill (Generic STM32F103 от eBay). Другие версии не компилируются, а различные ошибки, такие как Stdout и т. Д..


Теперь, подходя к моей проблеме, я думаю, что есть проблема с прерывами. Если я запускаю примеры ABP/OTAA, хотя они правильно компилируются, я ничего не делаю в серийном мониторе, кроме S, и это просто ничего не делает. Если я нажму сброс, напечатан другой S.

При расследовании немного дальше, в файле HAL.CPP (https: // github.com/matthijskooijman/ard ... л.CPP#L184 ) я прокомментировал NoEversrupts (); В строке 184. Теперь я вижу следующее:

Starting message packet queued and then it just hangs from there..There is # define line to increase debug level to 2 in src/lmic/conifg.h follwing lines get printed in that case: CODE: SELECT ALL Starting RXMODE_RSSI 148945: engineUpdate, opmode=0x8 149130: Scheduled job 0x20000aa8, cb 0x800298b ASAP Packet queued 156224: Running job 0x20000aa8, cb 0x800298b, deadline 0 156541 : EV_JOINING 176874: engineUpdate, opmode=0xc 177059: Uplink join pending 177214: Airtime available at 502627 (previously determined) 177546: Uplink delayed until 502627 177746: Scheduled job 0x20000aa8, cb 0x8002991 at 502502 502502: Running job 0x20000aa8, cb 0x8002991, deadline 502502 502846: engineUpdate, opmode=0xc 503030: Uplink join pending 503186: Airtime available at 502627 (previously determined) 503518: Ready for uplink 503711: Updating info for TX at 503030, airtime will be 3856. Setting available time for band 0 to 4359030 504475: TXMODE, freq=433175000, len=23, SF=7, BW=125, CR=4/5, IH=0

Стивестронг
Пт 13 апреля 2018 г., 17:14
Если вы видели это: https: // www.TheThingsnetwork.org/labs/s ... Duino-Unde
Затем в разделе «Программное обеспечение» (ссылка с левой стороны) вы получаете ссылку на: Наконец, вам понадобится библиотека Arduino LMIC, адаптированная для STM32:

https: // github.com/tomtor/arduino-lmic

йотнод
Пт 13 апреля 2018 г., 20:43
Конечно, я пишу это только потому, что это не сработало для меня! Проблема связана с обработкой прерываний.

Мне удалось отправить пакеты, которые получены от шлюза приложения TTN, но узел датчика не получает никакого подтверждения вниз по течению...Итак, после отправки его один раз, узел просто сидит холостое время...Чтобы заставить его работать, мне пришлось прокомментировать noErughrupts (); в Хэл.CPP ( https: // github.com/matthijskooijman/ard ... л.CPP#L184 ) и тогда в радио 660 есть одна утверждение.C при чтении некоторого реестра статуса узла LORA..Тогда я также выступил на этой строке: https: // github.com/matthijskooijman/ard ... дио.C#L660 ASSERT( (readReg(RegOpMode) & OPMODE_MASK) == OPMODE_SLEEP );

Стивестронг
Пт 13 апреля 2018 г., 21:19
Поскольку вы используете официальное ядро ​​STM, я думаю, что Фредерик может дать вам дополнительную поддержку.

йотнод
Пт 13 апреля 2018 г. 22:35
Как мне найти его? Но я думаю, что эта проблема не ограничена только официальным ядром...

Стивестронг
SAT 14 апреля 2018 г., 6:17
[йотнод - Пт 13 апреля 2018 г. 22:35] - Но я думаю, что эта проблема не ограничена только официальным ядром...
Этого недостаточно, чтобы "думать". Пока вы используете только ядро ​​STM, эта проблема принадлежит здесь.
Фредерик (@fpistm) может поддержать вас, зависит от его времени.
Если вы попытаетесь иметь проблемы с ядром Libmaple (Roger's arduino_stm32), то это была бы другая история.

fpistm
SAT 14 апреля 2018 г. 6:20 утра
Я на этом форуме ;)
Поскольку он тестируется с ядром Роджера, используя АД, я думаю, что вы должны использовать его вместо ядра STM. BP лучше поддерживается ядро ​​Роджера.
В любом случае, должно быть возможно, работая с STM Core, но, честно говоря, я пропускаю время, чтобы расследовать это. У меня все больше и больше основной функции для просмотра и слияния без разговоров о библиотеках STM32DUIN.
В любом случае, если вы хотите продолжать расследовать эту LIB, используя ядро ​​STM, я постараюсь ответить вам.

йотнод
SAT 14 апреля 2018 г. 10:10
@fpistm спасибо за ответ. Если у вас есть время, пожалуйста, посмотрите на эту проблему, потому что я думаю, если она собирает «из ящика», это также поможет многим другим. Я описал свои проблемы в предыдущих постах. Из того, что я могу понять, эта библиотека написана в C, которая, вероятно, не очень «похожа» на многие другие библиотеки Arduino..Anway, я просто еще один любитель, пробую руку на доске STM32. К сожалению, я весьма ограничен своими способностями программирования и более глубокими знаниями внутренних работ для STM32. Для этой библиотеки я могу отправить пакет. я думаю, что некоторые проблемы с временем ISR есть. и некоторый сбой модема LORA Modem. Этот чип aithinker ra01/ra02 (SX1278) довольно дешевый, но побочный эффект заключается в том, что время должно управлять микроконтроллером. Так что я думаю, что это приводит к какой -то проблеме..

йотнод
SAT 14 апреля 2018 г. 10:56 утра
Извините за тупой вопрос, но я установил Roger Clark STM32Core, но я не вижу никаких последовательных выводов ни в USB -кабеле, ни в внешнем USB->Сериал подключен к PA9,10 (TX, RX)....

Пыль
SAT 14 апреля 2018 12:55
Я протестировал LMIC на BluePill + RFM95 несколько дней назад с Generic 103 Core, и не было проблем. Без лишней связи я не проверял это. Наверное, дважды проверьте свои соединения и конфигурацию SPI, Radio Reset и DIO0-2?

йотнод
SAT 14 апреля 2018 г., 18:33
Я установил Roger Clark Core. Я заменил сериал.печатные операторы с serial1.Печать, и теперь я вижу O/P на серийном мониторе. Код Tomtor компилирует и работает OK. Ранее он давал некоторые проблемы с компиляторами, я удалил все в % в % и перезапустил Arduino, кажется, сейчас работает сейчас...Может быть, он использовал какую -то предварительную библиотеку из предыдущей сборки для STM32Duino...все еще иногда дает ошибку линкера что -то о проводке.H не могу воспроизвести это прямо сейчас, потому что он сейчас компилируется. опубликует, если я снова получу ошибку!

Спасибо всем за помощь. И, кстати, почему два ядра для чертежа. Уже существует огромная путаница из -за нескольких версий этой библиотеки и нескольких версий этого ядра. Если мы посмотрим на различные перестановки/комбинации, это уже огромная путаница....

любые ссылки, где различия между ними даются?

йотнод
Солнце 15 апреля 2018 г., 7:27 утра
Спасибо всем за указатели, мне удалось получить данные о приложениях TTN со следующими модификациями на примере Tomtor
https: // Gist.GitHub.com/tomtor/c754355f ... 5F236D990E :

в первую очередь:

SPI называется SPI.begin () и, следовательно, все другие следующие операции SPI. Теперь мы должны изменить библиотеку LMIC (в настоящее время я использую здесь библиотеку Tomtor: https: // github.com/tomtor/arduino-lmic

в Хэл.CPP, мы должны прокомментировать строки, где прерывания отключены https: // github.com/tomtor/arduino-lmic/ ... л.CPP#2212
https: // github.com/tomtor/arduino-lmic/ ... л.CPP#L228
Затем различные вызовы не определены, я прокомментировал их, как adc_enable/adc_disable input_analog libmaple/power.H Libmaple/SCB.H я также отключил #Define Sleep.

В модифицированной форме эскиз выглядит так:

https: // github.com/iotlearnerner0level/ttn ... Томтор.Ино

Я вижу данные на консоли TTN, но только один раз после сброса...

Теперь я хочу добавить OLED для отображения сообщений и т. Д., Пожалуйста, проведите, как это сделать. Если я заменю все вызовы на сериал.println, это просто висит ничего не делая..

@fpistm ваши комментарии высоко ценится..

fpistm
Солнце 15 апреля 2018 г. 9:01
Просто быстрая мысль:
Похоже, что в случае arduino_arch_stm32f1 (ядро Роджера arduino_stm32) IRQ не отключены.
https: // github.com/tomtor/arduino-lmic/ ... л.CPP#L196
#ifdef ARDUINO_ARCH_STM32F1 // // Not clear why we need to disable interrupts when we are just polling // the GPIO pins. Anyway, disabling interrupts prevents the output of the // UART in hal_failed(), so we don't disable IRQs for the STM32 which appears // to work just fine //

йотнод
Солнце 15 апреля 2018 г. 11:59
@ fpistm спасибо за вашу ценную информацию. в ядре STM32Duino ( https: // github.com/stm32duino/arduino_core_stm32/), мне пришлось заменить линии в эскизе и использовал только SPI.begin () иначе это дает ошибку. В ядре Роджера эскиз Томтора работает без каких -либо модификаций для SPI.
#if defined (ARDUINO_ARCH_STM32F1) || defined (ARDUINO_ARCH_STM32)

Стивестронг
Солнце 15 апреля 2018 12:06
[йотнод - Солнце 15 апреля 2018 г. 11:59] - Кроме того, я не понимаю, почему есть два ядра для STM32/Arduino?
История: ViewTopic.PHP?F = 42&t = 97

йотнод
Сб 21 апреля 2018 г., 6:14
Всем здравствуйте!

Мне каким -то образом удалось выполнить узел с периодическими обновлениями на STM32Duino (https: // github.com/stm32duino/arduino_core_stm32) Ядро в настоящее время только ABP дает мне TX_COMPLETE, что сейчас возникает некоторая проблема с активацией OTAA. Я настроил свою учетную запись TTN для «Декодирования» давления, температуры и высоты BMP180..

Я экспериментирую с батареями, поэтому я заинтересован в отправке напряжений VCC..Я пытался следовать примеру отсюда: ViewTopic.PHP?t = 707 Но это не сработает, предупреждения компилятора. Любые предложения?

Кроме того, я хотел бы, чтобы BluePill заснул, как мне настроить его на «официальном» ядре STM32Duino с HAL или API, любые примеры?

Эскиз, с которым я работаю, в настоящее время находится в этой форме: https: // github.com/iotlearnerner0level/ttn ... v3ol.Ино

Спасибо.

fpistm
Сб 21 апреля 2018 г. 8:19
На следующей неделе (ы) библиотека низкой мощности STM32 будет доступна
https: // github.com/stm32duino/stm32lowpower

В настоящее время я его просматриваю, и библиотека RTC STM32, используемая для LP.

Ахулл
Сб 21 апреля 2018 г., 11:31
[fpistm - Сб 21 апреля 2018 г. 8:19] - На следующей неделе (ы) библиотека низкой мощности STM32 будет доступна
https: // github.com/stm32duino/stm32lowpower

В настоящее время я его просматриваю, и библиотека RTC STM32, используемая для LP.
Вы дразните, в этом git repo нет ничего : D Я надеялся, что наполовину протестированный код просмотр.

fpistm
Сб 21 апреля 2018 г. 13:07
[Ахулл - Сб 21 апреля 2018 г. 11:31] - Вы дразните, в этом git repo нет ничего : D Я надеялся, что наполовину протестированный код просмотр.
Есть 1 PR 😉 В настоящее время я просматриваю библиотеку RTC, требуемую LP One.

йотнод
Сб 21 апреля 2018 г., 20:16
Хорошо, тогда я некоторое время откладываю сон!

Кроме того, я хочу прочитать VCC или VIN напряжение, поданное на микроконтроллер....Является ли это возможным? Я думаю, что STM32 имеет некоторую встроенную схему, а АЦП канала 1 может быть перенастроен, чтобы прочитать, что...но не знаю, как это сделать?

Rogerclark
Сб 21 апреля 2018 г., 21:07
Это’S будет быстрее, если вы просто Google для ответов

Эн.глин. Google для

STM32DUINO ADC VCC

Получает вам мгновенный результат.

Примечание. Большинство сообщений на этом форуме предназначены для Libmaple Core, а не HAL Core.

Но основные принципы одинаковы.

Если вам нужны ответы на вопросы о том, как использовать HAL, чтобы делать конкретные вещи, например,.. Управляйте входом в АЦП, вам было бы лучше отправлять в собственное официальное сообщество STMS, так как вряд ли кто -либо на этом форуме использует HAL

йотнод
Солнце 22 апреля 2018 г., 6:45
[Rogerclark - Сб 21 апреля 2018 г., 21:07] - Это’S будет быстрее, если вы просто Google для ответов

Эн.глин. Google для

STM32DUINO ADC VCC

Получает вам мгновенный результат.

Примечание. Большинство сообщений на этом форуме предназначены для Libmaple Core, а не HAL Core.

Но основные принципы одинаковы.

Если вам нужны ответы на вопросы о том, как использовать HAL, чтобы делать конкретные вещи, например,.. Управляйте входом в АЦП, вам было бы лучше отправлять в собственное официальное сообщество STMS, так как вряд ли кто -либо на этом форуме использует HAL
Конечно, я попробовал Google, но это не сработало, только тогда я опубликовал его на форуме...Я думал, для этого форумы для! Кроме того...Очевидно, это не так!!

В любом случае, я думаю, что лучше подождать еще немного времени, так как HAL Core находится в стадии разработки с новыми функциями..

Rogerclark
Солнце 22 апреля 2018 г., 7:56 утра
Этот форум был создан за несколько лет до того, как STM создала свое ядро.

Люди публикуют о ядре STM, но это, вероятно, 5% постов, и вряд ли любой из тех постов, связанных с HAL.

Сообщение, которое возвращает Google, будет содержать допустимые данные об управлении АЦП на уровне регистра, что вы могли бы сделать в ядре STM так же, как в ядре Libmaple.
Имена Libmaple использует для регистров, основанные на собственных документах STM.

йотнод
Солнце 22 апреля 2018 г. 8:50 вечера
ОК, Роджер, что :)

Для следующего кода: int readVInt() { adc_reg_map *regs = ADC1->regs; regs->CR2 |= ADC_CR2_TSVREFE; // enable VREFINT and temp sensor regs->SMPR1 = (ADC_SMPR1_SMP17); // sample rate for VREFINT ADC channel int vref = 1210 * 4096 / adc_read(ADC1, 17); // ADC sample to millivolts regs->CR2 &= ~ADC_CR2_TSVREFE; // disable VREFINT and temp sensor return vref; }

fpistm
Пн 23 апреля 2018 г., 5:12
STM Core использует CMSIS, поэтому способ доступа к регистрам отличается.


https: // github.com/stm32duino/arduino_c ... 3х6.H#1702

https: // github.com/stm32duino/arduino_c ... 3х6.H#L157

Итак, вместо: adc_reg_map *regs = ADC1->regs; regs->CR2 |= ADC_CR2_TSVREFE; // enable VREFINT and temp sensor regs->SMPR1 = (ADC_SMPR1_SMP17); // sample rate for VREFINT ADC channel

Rogerclark
Пн 23 апреля 2018 г., 5:18
Привет, Фредерик

Я думал, что ядро ​​STM использовала HAL... Но я предполагал, что CMSIS быстрее и проще для некоторых вещей ?

fpistm
Пн 23 апреля 2018 г., 5:45
[Rogerclark - Пн 23 апреля 2018 г. 5:18] - Привет, Фредерик

Я думал, что ядро ​​STM использовала HAL... Но я предполагал, что CMSIS быстрее и проще для некоторых вещей ?
STM HAL и LL основаны на CMSIS. Таким образом, вы также можете напрямую использовать CMSIS ;) (Ll сделайте это на самом деле)

Rogerclark
Пн 23 апреля 2018 г., 5:48
ХОРОШО

Спасибо.

йотнод
Пн 23 апреля 2018 г. 18:31
[fpistm - Пн 23 апреля 2018 г. 5:12] - STM Core использует CMSIS, поэтому способ доступа к регистрам отличается.


https: // github.com/stm32duino/arduino_c ... 3х6.H#1702

https: // github.com/stm32duino/arduino_c ... 3х6.H#L157

Итак, вместо: adc_reg_map *regs = ADC1->regs; regs->CR2 |= ADC_CR2_TSVREFE; // enable VREFINT and temp sensor regs->SMPR1 = (ADC_SMPR1_SMP17); // sample rate for VREFINT ADC channel

fpistm
Пн 23 апреля 2018 г., 19:17
Это звуко логично, так как АЦП не инициализируется. ;)
Часы, Прескалер, конв,...
В настоящее время основной ADC INIT только тогда, когда он используется благодаря анализации.

йотнод
Пн 23 апреля 2018 г., 21:01
[fpistm - Пн 23 апреля 2018 г., 19:17] - Это звуко логично, так как АЦП не инициализируется. ;)
Часы, Прескалер, конв,...
В настоящее время основной ADC INIT только тогда, когда он используется благодаря анализации.
Вот наступает глупый вопрос, куда мне поместить анализа. Если я вставлю в настройку (), Pinmode (17, вход), за которым следует анализа (17); это все же... Пожалуйста, терпите меня, я просто еще один любитель...Не понимайте внутренней работы и последовательности инициализации..

fpistm
Вт 24 апреля 2018 г. 5:09
Это будет справляться, когда у меня будет время расширить функции ADC. Проблема открыта в этом.
Конфигурация, сделанная для анализа, не может быть использована для этого.
Если вы действительно хотите сделать это, вам придется правильно настроить ADC1 перед использованием его во время настройки ().
Вы можете проверить, как это делается в примере Cube FW.

Стивестронг
Вт 24 апреля 2018 г. 6:31
Вы можете найти эту тему интересной: ViewTopic.PHP?f = 14&t = 2207&hilit = stm32adc.

йотнод
Вт 24 апреля 2018 г., 17:34
Я думаю, мне придется дождаться официальной поддержки Arduino для последовательности инициализации ADC. Целая смысл в Ардуино заключался в том, чтобы избежать реестра, и красота использования стольких библиотек, сделанных. Но сейчас я не в состоянии перевести следующий код в Arduino:
/** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** ** This notice applies to any and all portions of this file * that are not between comment pairs USER CODE BEGIN and * USER CODE END. Other portions of this file, whether * inserted by the user or by software development tools * are owned by their respective copyright owners. * * COPYRIGHT(c) 2018 STMicroelectronics * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. Neither the name of STMicroelectronics nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "stm32f1xx_hal.h" /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* Private variables ---------------------------------------------------------*/ ADC_HandleTypeDef hadc1; /* USER CODE BEGIN PV */ /* Private variables ---------------------------------------------------------*/ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_ADC1_Init(void); /* USER CODE BEGIN PFP */ /* Private function prototypes -----------------------------------------------*/ /* USER CODE END PFP */ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ /** * @brief The application entry point. * * @retval None */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration----------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_ADC1_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; RCC_PeriphCLKInitTypeDef PeriphClkInit; /**Initializes the CPU, AHB and APB busses clocks */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = 16; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } /**Initializes the CPU, AHB and APB busses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC; PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV2; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } /**Configure the Systick interrupt time */ HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); /**Configure the Systick */ HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); /* SysTick_IRQn interrupt configuration */ HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); } /* ADC1 init function */ static void MX_ADC1_Init(void) { ADC_ChannelConfTypeDef sConfig; /**Common config */ hadc1.Instance = ADC1; hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; hadc1.Init.ContinuousConvMode = DISABLE; hadc1.Init.DiscontinuousConvMode = DISABLE; hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc1.Init.NbrOfConversion = 1; if (HAL_ADC_Init(&hadc1) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } /**Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_VREFINT; sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } } /* USER CODE BEGIN 4 */ /* USER CODE END 4 */ /** * @brief This function is executed in case of error occurrence. * @param file: The file name as string. * @param line: The line in file as a number. * @retval None */ void _Error_Handler(char *file, int line) { /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ while(1) { } /* USER CODE END Error_Handler_Debug */ } #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval None */ void assert_failed(uint8_t* file, uint32_t line) { /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */ } #endif /* USE_FULL_ASSERT */ /** * @} */ /** * @} */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

fpistm
Вт 24 апреля 2018 г., 8:32 вечера
Я сделаю быстрый тест и вернусь завтра

йотнод
Вт 24 апреля 2018 г., 20:58
Хорошо, большое спасибо! было бы здорово, если бы также включен внутренний датчик температуры : D

еще раз спасибо!

fpistm
Вт 24 апреля 2018 г., 21:39
Это будет только на уровне эскиза. Правильное решение будет поставляться с библиотекой АЦП, когда у меня будет время сделать это или участник

fpistm
Ср 25 апреля 2018 г. 10:00 утра
Вы можете попробовать это: uint16_t adc_read(uint32_t channel) { ADC_HandleTypeDef AdcHandle = {}; ADC_ChannelConfTypeDef AdcChannelConf = {}; __IO uint16_t uhADCxConvertedValue = 0; AdcHandle.Instance = ADC1; AdcHandle.State = HAL_ADC_STATE_RESET; AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT; /* Right-alignment for converted data */ AdcHandle.Init.ScanConvMode = DISABLE; /* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */ AdcHandle.Init.ContinuousConvMode = DISABLE; /* Continuous mode disabled to have only 1 conversion at each conversion trig */ AdcHandle.Init.DiscontinuousConvMode = DISABLE; /* Parameter discarded because sequencer is disabled */ AdcHandle.Init.ExternalTrigConv = ADC_SOFTWARE_START; /* Software start to trig the 1st conversion manually, without external event */ AdcHandle.Init.NbrOfConversion = 1; /* Specifies the number of ranks that will be converted within the regular group sequencer. */ AdcHandle.Init.NbrOfDiscConversion = 0; /* Parameter discarded because sequencer is disabled */ if (HAL_ADC_Init(&AdcHandle) != HAL_OK) { return 0; } AdcChannelConf.Channel = channel; /* Specifies the channel to configure into ADC */ AdcChannelConf.Rank = ADC_REGULAR_RANK_1; /* Specifies the rank in the regular group sequencer */ AdcChannelConf.SamplingTime = ADC_SAMPLETIME_13CYCLES_5; /* Sampling time value to be set for the selected channel */ /*##-2- Configure ADC regular channel ######################################*/ if (HAL_ADC_ConfigChannel(&AdcHandle, &AdcChannelConf) != HAL_OK) { /* Channel Configuration Error */ return 0; } /*##-2.1- Calibrate ADC then Start the conversion process ####################*/ if (HAL_ADCEx_Calibration_Start(&AdcHandle) != HAL_OK) { /* ADC Calibration Error */ return 0; } /*##-3- Start the conversion process ####################*/ if (HAL_ADC_Start(&AdcHandle) != HAL_OK) { /* Start Conversation Error */ return 0; } /*##-4- Wait for the end of conversion #####################################*/ /* For simplicity reasons, this example is just waiting till the end of the conversion, but application may perform other tasks while conversion operation is ongoing. */ if (HAL_ADC_PollForConversion(&AdcHandle, 10) != HAL_OK) { /* End Of Conversion flag not set on time */ return 0; } /* Check if the continous conversion of regular channel is finished */ if ((HAL_ADC_GetState(&AdcHandle) & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC) { /*##-5- Get the converted value of regular channel ########################*/ uhADCxConvertedValue = HAL_ADC_GetValue(&AdcHandle); } if (HAL_ADC_Stop(&AdcHandle) != HAL_OK) { /* Stop Conversation Error */ return 0; } if(HAL_ADC_DeInit(&AdcHandle) != HAL_OK) { return 0; } return uhADCxConvertedValue; } void setup() { Serial.begin(115000); analogRead(A0); // Workaround to init g_current_pin used in HAL_ADC_MspInit } void loop() { float Vdd = readVdd(); Serial.print("Vdd= "); Serial.print(Vdd); Serial.print(" V Temp= "); Serial.print(readTempSensor(Vdd)); Serial.println(" °C"); delay(500); } static float readVdd() { return (1.20 * 4096.0 / adc_read(ADC_CHANNEL_VREFINT)); // ADC sample to V //return (1200 * 4096 / adc_read(ADC_CHANNEL_VREFINT)); // ADC sample to mV } static float readTempSensor(float Vdd) { return ((1.43 - (Vdd / 4096.0 * adc_read(ADC_CHANNEL_TEMPSENSOR))) / 0.0043 + 25.0); }

йотнод
Ср 25 апреля 2018 г. 10:04
Спасибо! Работая ОК над Bluepill (64K). Тем не менее, я должен сказать, что при использовании многих других библиотек, предел памяти достигается довольно быстро:
Vdd= 3.20 V Temp= 43.22 °C Vdd= 3.20 V Temp= 43.58 °C Vdd= 3.20 V Temp= 43.22 °C Vdd= 3.20 V Temp= 43.58 °C Vdd= 3.20 V Temp= 43.95 °C Vdd= 3.20 V Temp= 43.58 °C Vdd= 3.20 V Temp= 43.95 °C Vdd= 3.20 V Temp= 43.40 °C

fpistm
Ср 25 апреля 2018 12:07
Это всего лишь обходной путь. Чистый путь будет доступен благодаря библиотеке ADC и, вероятно, с ограниченным использованием HAL, но, если это возможно, использует LL.

йотнод
Ср 25 апреля 2018 12:21
[fpistm - Ср 25 апреля 2018 г. 12:07 вечера] - Это всего лишь обходной путь. Чистый путь будет доступен благодаря библиотеке ADC и, вероятно, с ограниченным использованием HAL, но, если это возможно, использует LL.
Все еще большое спасибо. Потому что я хочу сохранить узел TTN с питанием от батареи. Вместо того, чтобы прикрепить счетчик емкости аккумулятора, теперь я могу напрямую увидеть чтение VCC в консоли TTN. Я отправил все данные о полезной нагрузке TTN в Google Firebase, используя его API REST. Так что мне даже не нужно открывать консоли TTN.

В будущем я планирует добавить что -то вроде https: // www.aliexpress.com/item/ultra-s ... 23174.HTML Чтобы преобразовать солнечную энергию и подавать его в PIN-код 5 В, а также одновременно подключить различные батареи, такие как 4xnimh, 2 параллельная Lipo 18650, 2-й серии 18650 и т. Д. Я уже экспериментировал с 4xnicd (около 5 часов), 4xnimh (примерно 10 часов), 1x18650 (около 10 часов), 2 параллельного 18650 (примерно 15 часов), 2-й серии 18650 (6V-8.4 В, подаваемая на 5 В, напрямую) примерно 20 часов вместе с OLED, SX1278 LORA RA01 модемом, а потребление Electrical Parater Tester - 80 мА со всем.

Когда спящий режим станет доступным, это будет очень полезно в этих сценариях. Я медленно добавлю пыль https: // www.aliexpress.com/item/gp2y101 ... 51689.HTML или BME280 и т.д...У меня другой проект, чтобы добавить измеритель мощности велосипеда, как этот: https: // www.YouTube.com/watch?v = zzng135o4zq Измеритель ветра (простой двигатель с вентилятором) и т. Д....

Я также ищу шлюз Lora на основе SIM -карты, такой как одноканальный шлюз ESP, но для интернета используется модуль GSM (или 3G), такой как Aithinker A6 SIM800 и т. Д. В этом случае я просто добавлю достаточную солнечную энергию и скрываю ее в разных местах :) за то, чтобы сделать шлюзы Lora!

Прямо сейчас у меня не так много времени, но я надеюсь, что однажды это станет реальностью!


Но сегодня я очень счастлив, потому что мой узел TTN стал довольно портативным с мониторингом VCC!

Rogerclark
Ср 25 апреля 2018 г., 21:52
Немного не по теме, но обычно это’S не лучшая идея для использования конвертера с солнечной панелью для преобразования напряжения.

Я сделал несколько тестов на небольшой солнечной панели, чтобы зарядить ячейку липо через контроллер заряда и использовал регулятор LDO для преобразования ее выхода в 3.3В.

В Интернете есть различные сообщения о изменении контроллера заряда USB, чтобы ограничить ток заряда, чтобы соответствовать размеру солнечной панели, заменив один резистор на контроллере заряда .

Как правило, лучший совет - использовать большую солнечную панель, чем вы думаете, вам нужно.
Это’S дешевле купить 2 или 3 дешево “1 Вт” Панели, чем возиться с оптимизацией извлечения мощности с одной панели

йотнод
Чт 26 апреля 2018 г., 6:13
[Rogerclark - Ср 25 апреля 2018 г., 21:52] - Немного не по теме, но обычно это’S не лучшая идея для использования конвертера с солнечной панелью для преобразования напряжения.

Я сделал несколько тестов на небольшой солнечной панели, чтобы зарядить ячейку липо через контроллер заряда и использовал регулятор LDO для преобразования ее выхода в 3.3В.

В Интернете есть различные сообщения о изменении контроллера заряда USB, чтобы ограничить ток заряда, чтобы соответствовать размеру солнечной панели, заменив один резистор на контроллере заряда .

Как правило, лучший совет - использовать большую солнечную панель, чем вы думаете, вам нужно.
Это’S дешевле купить 2 или 3 дешево “1 Вт” Панели, чем возиться с оптимизацией извлечения мощности с одной панели
Спасибо за предложения. У меня есть несколько «довольно больших» солнечных панелей при 12 В и 24 В o/P. Напряжение открытой цепи довольно высокое, чем рейтинг. Например, 24V панели имеют 32 В, если я правильно его измерил. Чтобы получить устройство с низким напряжением, такое как микроконтроллеры, 2-ступенчатые выглядит безопаснее, однако это может нарушить предел регулятора второго напряжения. Чтобы зарядить 1xlipo, TP4056 - хороший вариант. Однако не уверен насчет 4xnimh (дает около 5.4V, когда NIMH полностью заряжен) для регулятора напряжения Lipo Bluepill, кажется, работает нормально. на самом деле, они работают в порядке даже до 8.4V и даже для случая, когда Lipo истощен ниже 3.5 В. Но мой тест на электрический параметр умирает ниже 4 В, так что не могу много сказать.

Однако для более низкой солнечной энергии я еще не тестировал. попробую через месяц или два, когда у меня будет немного больше времени. Этот видео сериал для Solar для небольших устройств весьма полезен: https: // www.YouTube.com/watch?v = fflu7ps ... 98QK_75G-M

Спасибо.

Rogerclark
Чт 26 апреля 2018 г., 6:28
ХОРОШО

Я думал, что вы можете питать его из маленькой PV -ячейки 6 В (что довольно распространено)

Re: Использование внутреннего регулятора BP
Я думаю, что это дешево и, вероятно, принимает ток, даже когда АД в режиме спят.

Вам, вероятно, понадобится отдельный внешний LDO.

Я забыл, какие из них я использую, но я запускаю NRF51822 BLE MCU на липо 220 мАч через LDO в течение нескольких месяцев, даже без солнечного корма в липо, и он все еще работает.

Я сомневаюсь, что это будет случай, если бы я использовал регулятор из чертежа

йотнод
Чт 26 апреля 2018 г., 7:09
У меня есть мало проектов, где мне понадобится солнечная энергия 6 В, как в случае велосипедного счетчика мощности. Я бы попробовал ht7333, наконец.3V, а не PIN 5V VIN. Конечно, для больших панелей моя цель - запустить доску Bluepill в ночное время, когда солнечная энергия недоступна. В любом случае, я сделал несколько проектов с ESP8266, и STM32 намного лучше для силового сценария. ESP8266 Просто «висит», если напряжения данных не будут. Вещи станут интересными, когда библиотека низкой мощности станет доступной, тогда я могу попробовать это: https: // www.TheThingsnetwork.org/labs/s ... Duino-Unde Если сделано несколько небольших проектов с использованием NRF51822 с использованием ядра Sandeep Mistry, я все еще экспериментирую...Хотя там не очень удобно.

Некоторые периферические, такие как SSD1306, также «висят» при более низких напряжениях, чем 3.3В. Очевидно, что есть много возможностей.
Прямо сейчас у меня нет знаний & Время изменить ядро, помимо создания много путаницы.

Rogerclark
Чт 26 апреля 2018 г., 7:14 утра
Не беспокойся

Для NRF51822 я обычно использую официальный SDK /API, а не ядро ​​Сандипа, так как мне нужно было делать некоторые сложные вещи, не поддерживаемые его ядром.

йотнод
Чт 26 апреля 2018 г., 16:45
На случай, если кто -то заинтересован/после этого, на основе кода FPISTM, устройство сообщает данные, пока напряжение батареи не станет чем -то выше 2 В!! Это здорово! Кроме того, радиостанция также работает, потому что я подключил Lora (Aithinker RA02/SX1278) с VCC 3V Bluepill. К сожалению, OLED (SSD1306 128x64) не работает так низко, и BMP180 (который я подключил к булавкам GPIO), похоже, также работает как минимум до 2.160 В, как сообщается в чипе:
(время, вероятно, GMT/UTC)
Из интеграции хранилища TTN: Response Body [ { "altitude": 173, "chipTemp": 45.51, "device_id": "lora-gateway-node-ra01", "pressure": 992, "raw": "DMYD4ACtCPcRxw==", "temperature": 32.7, "time": "2018-04-26T15:08:31.886672246Z", "voltage": 2.295 }, { "altitude": 173, "chipTemp": 49.07, "device_id": "lora-gateway-node-ra01", "pressure": 992, "raw": "DMYD4ACtCJwTKw==", "temperature": 32.7, "time": "2018-04-26T15:09:43.815344082Z", "voltage": 2.204 }, { "altitude": 173, "chipTemp": 48.57, "device_id": "lora-gateway-node-ra01", "pressure": 992, "raw": "DMYD4ACtCK8S+Q==", "temperature": 32.7, "time": "2018-04-26T15:09:48.870310385Z", "voltage": 2.223 }, { "altitude": 173, "chipTemp": 47.48, "device_id": "lora-gateway-node-ra01", "pressure": 992, "raw": "DMYD4ACtCKwSjA==", "temperature": 32.7, "time": "2018-04-26T15:09:59.018495216Z", "voltage": 2.22 }, { "altitude": 173, "chipTemp": 48.14, "device_id": "lora-gateway-node-ra01", "pressure": 992, "raw": "DMYD4ACtCKASzg==", "temperature": 32.7, "time": "2018-04-26T15:10:09.111891725Z", "voltage": 2.208 }, { "altitude": 172, "chipTemp": 47.36, "device_id": "lora-gateway-node-ra01", "pressure": 992, "raw": "DMYD4ACsCL0SgA==", "temperature": 32.7, "time": "2018-04-26T15:10:14.443139847Z", "voltage": 2.237 }, { "altitude": 172, "chipTemp": 48.53, "device_id": "lora-gateway-node-ra01", "pressure": 992, "raw": "DMYD4ACsCJYS9Q==", "temperature": 32.7, "time": "2018-04-26T15:10:21.023027081Z", "voltage": 2.198 }, { "altitude": 173, "chipTemp": 48.65, "device_id": "lora-gateway-node-ra01", "pressure": 992, "raw": "DMYD4ACtCI0TAQ==", "temperature": 32.7, "time": "2018-04-26T15:10:27.35627427Z", "voltage": 2.189 }, { "altitude": 172, "chipTemp": 49.24, "device_id": "lora-gateway-node-ra01", "pressure": 992, "raw": "DMYD4ACsCIYTPA==", "temperature": 32.7, "time": "2018-04-26T15:10:33.76306509Z", "voltage": 2.182 }, { "altitude": 173, "chipTemp": 48.93, "device_id": "lora-gateway-node-ra01", "pressure": 992, "raw": "DMYD4ACtCIETHQ==", "temperature": 32.7, "time": "2018-04-26T15:10:39.810258704Z", "voltage": 2.177 }, { "altitude": 173, "chipTemp": 49.44, "device_id": "lora-gateway-node-ra01", "pressure": 992, "raw": "DMYD4ACtCHcTUA==", "temperature": 32.7, "time": "2018-04-26T15:10:45.594316777Z", "voltage": 2.167 }, { "altitude": 112, "chipTemp": 50.59, "device_id": "lora-gateway-node-ra01", "pressure": 999, "raw": "BQAD5wBwCGoTww==", "temperature": 12.8, "time": "2018-04-26T15:10:54.261388134Z", "voltage": 2.154 }, { "altitude": 112, "chipTemp": 50.82, "device_id": "lora-gateway-node-ra01", "pressure": 999, "raw": "BQAD5wBwCFkT2g==", "temperature": 12.8, "time": "2018-04-26T15:11:02.42113182Z", "voltage": 2.137 }, { "altitude": 112, "chipTemp": 50.96, "device_id": "lora-gateway-node-ra01", "pressure": 999, "raw": "BQAD5wBwCE0T6A==", "temperature": 12.8, "time": "2018-04-26T15:11:10.264988356Z", "voltage": 2.125 }, { "altitude": 112, "chipTemp": 51.08, "device_id": "lora-gateway-node-ra01", "pressure": 999, "raw": "BQAD5wBwCEQT9A==", "temperature": 12.8, "time": "2018-04-26T15:11:17.896079546Z", "voltage": 2.116 }, { "altitude": 112, "chipTemp": 51.41, "device_id": "lora-gateway-node-ra01", "pressure": 999, "raw": "BQAD5wBwCD0UFQ==", "temperature": 12.8, "time": "2018-04-26T15:11:25.272545344Z", "voltage": 2.109 }, { "altitude": 112, "chipTemp": 50.77, "device_id": "lora-gateway-node-ra01", "pressure": 999, "raw": "BQAD5wBwCDgT1Q==", "temperature": 12.8, "time": "2018-04-26T15:11:32.674394192Z", "voltage": 2.104 }, { "altitude": 112, "chipTemp": 52, "device_id": "lora-gateway-node-ra01", "pressure": 999, "raw": "BQAD5wBwCCIUUA==", "temperature": 12.8, "time": "2018-04-26T15:11:41.797026116Z", "voltage": 2.082 }, { "altitude": 172, "chipTemp": 52.94, "device_id": "lora-gateway-node-ra01", "pressure": 992, "raw": "DMYD4ACsCA8Urg==", "temperature": 32.7, "time": "2018-04-26T15:11:47.370536356Z", "voltage": 2.063 }, { "altitude": 172, "chipTemp": 52.39, "device_id": "lora-gateway-node-ra01", "pressure": 992, "raw": "DMYD4ACsCAwUdw==", "temperature": 32.7, "time": "2018-04-26T15:11:52.945451005Z", "voltage": 2.06 }, { "altitude": 172, "chipTemp": 52.48, "device_id": "lora-gateway-node-ra01", "pressure": 992, "raw": "DMYD4ACsCAUUgA==", "temperature": 32.7, "time": "2018-04-26T15:11:58.259530726Z", "voltage": 2.053 }, { "altitude": 173, "chipTemp": 52.8, "device_id": "lora-gateway-node-ra01", "pressure": 992, "raw": "DMYD4ACtB/8UoA==", "temperature": 32.7, "time": "2018-04-26T15:12:03.329723118Z", "voltage": 2.047 }, { "altitude": 172, "chipTemp": 52.65, "device_id": "lora-gateway-node-ra01", "pressure": 992, "raw": "DMYD4ACsB/gUkQ==", "temperature": 32.7, "time": "2018-04-26T15:12:08.406844851Z", "voltage": 2.04 }, { "altitude": 172, "chipTemp": 53.55, "device_id": "lora-gateway-node-ra01", "pressure": 992, "raw": "DMYD4ACsB/AU6w==", "temperature": 32.7, "time": "2018-04-26T15:12:13.211109286Z", "voltage": 2.032 }, { "altitude": 172, "chipTemp": 53.27, "device_id": "lora-gateway-node-ra01", "pressure": 992, "raw": "DMYD4ACsB+sUzw==", "temperature": 32.7, "time": "2018-04-26T15:12:17.761658036Z", "voltage": 2.027 }, { "altitude": 172, "chipTemp": 54.03, "device_id": "lora-gateway-node-ra01", "pressure": 992, "raw": "DMYD4ACsB+UVGw==", "temperature": 32.7, "time": "2018-04-26T15:12:22.332773405Z", "voltage": 2.021 }, { "altitude": 172, "chipTemp": 54.47, "device_id": "lora-gateway-node-ra01", "pressure": 992, "raw": "DMYD4ACsB94VRw==", "temperature": 32.7, "time": "2018-04-26T15:12:26.623906536Z", "voltage": 2.014 }, { "altitude": 172, "chipTemp": 53.86, "device_id": "lora-gateway-node-ra01", "pressure": 992, "raw": "DMYD4ACsB9cVCg==", "temperature": 32.7, "time": "2018-04-26T15:12:30.66988373Z", "voltage": 2.007 }, { "altitude": 172, "chipTemp": 54.36, "device_id": "lora-gateway-node-ra01", "pressure": 992, "raw": "DMYD4ACsB9QVPA==", "temperature": 32.7, "time": "2018-04-26T15:12:34.728438098Z", "voltage": 2.004 }, { "altitude": 172, "chipTemp": 55.15, "device_id": "lora-gateway-node-ra01", "pressure": 992, "raw": "DLsD4ACsB8oViw==", "temperature": 32.59, "time": "2018-04-26T15:12:43.351249396Z", "voltage": 1.994 }, { "altitude": 169, "chipTemp": 42.37, "device_id": "lora-gateway-node-ra01", "pressure": 993, "raw": "DIkD4QCpDM4QjQ==", "temperature": 32.09, "time": "2018-04-26T15:48:49.328256588Z", "voltage": 3.278 }, { "altitude": 170, "chipTemp": 46.4, "device_id": "lora-gateway-node-ra01", "pressure": 993, "raw": "DIkD4QCqDMESIA==", "temperature": 32.09, "time": "2018-04-26T15:50:02.785980618Z", "voltage": 3.265 }, { "altitude": 169, "chipTemp": 45.49, "device_id": "lora-gateway-node-ra01", "pressure": 993, "raw": "DIkD4QCpDNMRxQ==", "temperature": 32.09, "time": "2018-04-26T15:51:17.9793614Z", "voltage": 3.283 }, { "altitude": 169, "chipTemp": 44.37, "device_id": "lora-gateway-node-ra01", "pressure": 992, "raw": "DJQD4ACpDNMRVQ==", "temperature": 32.2, "time": "2018-04-26T15:52:33.173748387Z", "voltage": 3.283 },

Cubemx -> Makefile Utility