Jump to content

    

Haamu

Участник
  • Content Count

    88
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Haamu

  • Rank
    Частый гость
  1. Приветствую, коллеги. Стоит задача измерения переменного напряжения 380В (трехфазное сетевое напряжение) микроконтрллером (для последующего расчета амплитуды, частоты и прочего). Ориентировочная частота выборки порядка 10кГц. Подскажите, пожалуйста схему преобразования такого напряжения в напряжение с амплитудой в 1-1,5В относительно среднего значения в 1,5В (вобщем чтобы уложиться в диапозон работы АЦП микроконтроллера с опорой в 3В). При этом хотелось бы чтобы была гальваническая развязка и минимум элементов. Может есть какие-то готовые решения со специализированными микросхемами (но не особо дорогие).
  2. Совпадают слово в слово. Разве что в 407 еще ram1 есть. Все-таки посмотрел ассемблер и память, и стало более понятно. Нашел в startup файле 151го такую особенность: void Default_Reset_Handler(void) { /* Initialize data and bss */ // unsigned long *pulSrc, *pulDest; /* Copy the data segment initializers from flash to SRAM */ // pulSrc = &_sidata; // // for(pulDest = &_sdata; pulDest < &_edata; ) // { // *(pulDest++) = *(pulSrc++); // } // // /* Zero fill the bss segment. */ // for(pulDest = &_sbss; pulDest < &_ebss; ) // { // *(pulDest++) = 0; // } /* Setup the microcontroller system. */ SystemInit(); /* Call the application's entry point.*/ main(); } Из-за этого в начале SRAM находился какой-то мусор и в процессе работы функции malloc в один момент происходило деление на 0. Раскомментировал этот кусок. Мусор стал более системотизированным, но остался мусором (в сравнении с 407). Куда дальше копать? И еще заметил особенность. Во всех других ARMах и не только, при инициализации структуры таким вот образом: static type struct_name = {}; все поля структуры инициализируются нулями. А тут почему-то в них тоже какой-то мусор находится.
  3. Так в том то и дело, что специально для проверки создал пустой проект, в котором только одна вышеупомянутая строка. И именно на ней падает.
  4. Контроллер STM32L151RB, CoIDE. Создаю проект, добавляю из репозитория cmsis_boot и CMSIS_core. Собирается, отладка запускается без проблем. Добавляю строку: uint8_t * ptr = malloc(4); Не собирается, ругается что не определена функция _sbrk(). Добавляю из репозитория C Library. Собирается. Запускаю отладку. Дохожу до вызова malloc(), и программа падает в Default_Handler(). Если определить все обработчики ошибок, то сваливается в HardFault. Проделываю точно такую-же последовательность действий, но уже с STM32F407. Без проблем, память выделяется. Что я делаю не так? Или может какая-то особенность есть с динамическим выделением памяти у этих STM32L151? Если все-же я что-то не так делаю, буду очень благодарен, если кто-то поделится пустой заготовкой проекта в CoIDE, чтобы нормально память выделялась.
  5. stm32l152 eeprom

    Кто знает, подскажите, какая скорость чтения из этой EEPROM? На сколько я понял, для чтения никаких дополнительных операций не нужно, просто копируешь из одного места в памяти, в другое. Если использовать данные из EEPROM, нужно их перед этим копировать в SRAM, или можно прям оттуда использовать?
  6. А в случае, если все-же завести эти сигналы на нужные ноги контроллера, как тогда это можно настроить и какие сигнала на какие ноги заводить?
  7. Контроллер STM32L151. Стоит необходимость очень точного (до тика контроллера) измерения времени между некоторыми событиями. Последовательность событий такая: 1) Дергаю ногой 1, в этот момент надо начать отсчет времени. 2) В момент появления сигнала на ноге 2 нужно сохранить посчитанный временой интервал, дернуть ногой 3 и стартонуть отсчет второго интервала, при этом сделать это всё максимально синхронно! 3) В момент появления сигнала на ноге 4 сохранить второй временой интервал. На этом всё. Собственно вопрос в том, как так по хитрому настроить срабатывание таймеров, чтобы сделать всё этом максимально синхронно? Сразу уточню, что ноги подключена как попало, поэтому использовать их как внешний триггер не получится.
  8. Стоит задача позиционирования исполнительного механизма по энкодеру на двигателе. Скорость вращения двигателя порядка 1000-3000 об/мин. Контроллер - Atmega8/168/328/и т.п. Нужен не дорогой энкодер, с по-возможности более простым способом подключения. Если использовать инкрементальный энкодер, справится ли контроллер с такой скоростью вращения? И если контроллер справится, то сможет ли при этом выполнять остальные функции, или придется ставить отдельный контроллер на обработку энкодера, а основной будет его периодически опрашивать (получится типа абсолютного энкодера)? Или проще сразу поставить какой-нибудь абсолютный SSI энкодер? Но тут уже вопрос в стоимости, на много ли они дороже? Погуглив немного, так и не появилось понимания разницы в стоимости абсолютных и инкриментальных энкодеров, т.к. почти нигде не указывают цен...
  9. С инклудами, как выяснилось, проблема только с компилятором XC8. С XC32 такой проблемы нет. Остается главный вопрос. Почему-то не работают MPLAB X IDE версии 3.10 и 3.15. Кто-нибудь сталкивался с этим?
  10. Стоит MPLAB X 3.00. Работает как-то странно, например пишет, что не может найти стандартные инклуды (#include <stdint.h>), но при этом проект собирается без ошибок. Почему-то не хочет инициализировать структуры и массивы таким образом: sType sName = {}; Попробовал скачать и установить последний 3.10. Установил параллельно, не удаляя 3.00. 3.10 вообще работать отказывается, окно открывается, но абсолютно не кликабельное, будто картинка, при этом система сообщает, что программа работает. Закрывается только через диспетчер задач. В чем может быть проблема?
  11. Вот это уже больше похоже на правду. Спасибо.
  12. На сколько я понял, это немного не то. Под PORT2 - PORT7 там (в регистре 0x04) подразумеваются COL2 - COL7, настроенные на работу в режиме GPO.
  13. Вопрос по управлению ногами GPIO. К портам GPIO катодами подключены светодиоды. Если нстроить порт на выход (регистр 0x41), как потом этим портом управлять? То есть в какой регистр и что надо писать, чтобы включить/выключить светодиод?
  14. Разобрался с этим дисплеем. По вертикали всё просто, 0 - это ноль и так далее по одному пикселю. А вот по горизонтали всё очень хитро. Как и писал автор, начало дисплея приходится на столбец номер 28. Далее, каждый столбец соответствует четырем пикселям. Плюс к этому, цвет (яркость) пикселя задается одним из полубайтов передаваемых данных. То есть за один раз можно закрасить минимум 4 пикселя, передав 2 байта данных. Если кому будет интересно, могу сбросить кусок кода для пояснения.
  15. Кто-нибудь смог разобраться с подобным дисплеем? Не могу понять, как соотносятся адреса в памяти с положением пикселей на экране?