Перейти к содержанию

Динамическая индикация STM32


Рекомендуемые сообщения

Помогите! Не пойму, почему не работает код. Хотя он был рабочий, пока я что-то не "оптимизировал"...

// Общие выводы индикатора
#define D0 GPIO_Pin_14
#define D1 GPIO_Pin_13
#define D2 GPIO_Pin_12
#define ALL_CATOD ( D0 | D1 | D2 )

// К какой ноге какой сегмент подключен
#define SEG_A GPIO_Pin_0
#define SEG_B GPIO_Pin_1
#define SEG_C GPIO_Pin_2
#define SEG_D GPIO_Pin_3
#define SEG_E GPIO_Pin_4
#define SEG_F GPIO_Pin_5
#define SEG_G GPIO_Pin_6

//Собираем цифры из сегментов
#define DIG0 ( SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F )
#define DIG1 ( SEG_B | SEG_C )
#define DIG2 ( SEG_A | SEG_B | SEG_G | SEG_E | SEG_D )
#define DIG3 ( SEG_A | SEG_B | SEG_G | SEG_C | SEG_D )
#define DIG4 ( SEG_F | SEG_G | SEG_B | SEG_C)
#define DIG5 ( SEG_A | SEG_F | SEG_G | SEG_C | SEG_D )
#define DIG6 ( SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G )
#define DIG7 ( SEG_A | SEG_B | SEG_C )
#define DIG8 ( SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
#define DIG9 ( SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G)
#define ALL_SEG (DIG8 )

void GPIO_Configuration(void)
{
   GPIO_InitTypeDef GPIO_InitStructure;
   /* GPIOA Configuration:TIM3 Channel1, 2, 3 and 4 as alternate function push-pull */
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOB, &GPIO_InitStructure);

   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
   GPIO_InitStructure.GPIO_Pin = ALL_SEG | ALL_CATOD;
   GPIO_Init(GPIOA, &GPIO_InitStructure);

}

void show_temp(void) {

   u16 tmp; // Содержит копию counter (из него по очереди исключаются последние цифры)
   u8 digit; // В эту переменную поочередно записываются цифры из которых состоит число counter
   u16 catods[] = { D0, D1, D2 };
   u8 digitsp[] = { DIG0, DIG1, DIG2, DIG3, DIG4, DIG5, DIG6, DIG7, DIG8,   DIG9 };
   u8 i;

   tmp = measureT;

   for (i = 0; i < 3; i++) {
      if (tmp > 0) {
         //Вытаскиваем первую справа цифру из числа counter
         digit = tmp % 10;
         tmp = tmp / 10;
         //Выключаем все разряды. 1 на катоды
         GPIOA->ODR |= ALL_CATOD;
         //Включаем i разряд индикатора
         GPIOA->ODR &= ~catods[i];
         //Выводим цифру в i разряд
         GPIOA->ODR &= ~DIG8; //Выключаем все сегменты
         GPIOA->ODR |= digitsp[digit]; //Зажигаем нужные
         //Небольшая задержка. Пусть цифра погорит некоторое время
         delay_ms(1000);
      }
   }
}

Большую задержку поставил, чтобы глазом было видно результат. Число 123 отображается: сначало 33, потом 22, потом 111. Почему загорается несколько разрядов, хотя GPIOA->ODR &= ~catods;?

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Только что, Alex сказал:

А что это "что-то" ? Или мы должны догадаться ?

Да, я не пойму сам. Был проект, в котором я учился выводить на индикатор произвольные числа - работал. Перенес код в другой проект не работает, загружаю предыдущий тоже нет...

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Я наверное, никогда в своей жизни не узнаю почему я потратил пол дня на эту проблему... Сейчас, в порыве отчаяние "перекинул" общие катода с того же порта А на порт С:

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin = ALL_SEG;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = ALL_CATOD;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

И о чудо ЗАРАБОТАЛО! Но как такое может происходить... Может быть это связано с какими-то альтернативными функциями ног? Хотя ШИМ и АЦП у меня запущен на порте В.

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Схема? Катоды управляются полевиками? Может, порт работает только в одну сторону, отключаясь оставляет заряд на полевике и тот держит ток...

И вообще, не нравятся мне такое краткие записи логических преобразований, неужели их нельзя развернуть по-нормальному, чтобы было видно что происходит?

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока (материалы вебинара)

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Только что, Alexeyslav сказал:

Схема? Катоды управляются полевиками? Может, порт работает только в одну сторону, отключаясь оставляет заряд на полевике и тот держит ток...

И вообще, не нравятся мне такое краткие записи логических преобразований, неужели их нельзя развернуть по-нормальному, чтобы было видно что происходит?

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

Не понял, что вы называете "кратким описание логических преобразований", я в программировании МК еще совсем в начале пути и не очень понимаю, как должно быть по "нормальному"? Пишу где-то методом тыка, где то подглядываю у других)

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Только что, snn_krs сказал:

А тактирование порта А включено ?

RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );

Да, конечно. Аноды на порте А.

Методом "перетыкивания ножек" удалось сузить круг подозреваемых до 13 и 14 ног порта А, на остальных ногах нормально все.

Ох, ты еж! Кажется, я понял где "собака зарыта".

image.png.3f6e5be8c3774196e6860790a14d648b.png

на 13 и 14 ногах сидит ST-Link!

Я правильно понял?

Ссылка на комментарий
Поделиться на другие сайты

Напрямую? Мне всегда казалось что у STM32 слишком слабые выходы чтобы подключать к ним светодиодные индикаторы. Ну, какой-то ток они выдержат... но он значительно меньше чем у других контроллеров.

Под краткой записью я имею ввиду выражения вроде "ODR &= ~catods" - настоящая головоломка когда начинаешь читать и пытаться вникнуть в суть выполняемой функции. Символов вроде меньше, но очевидность стремится к нулю. Такое ощущение что эти выражения придумали программисты-машинисты которым побыстрей бы выдать код на скорости 200 симв/мин. Не понимаю, чем неугодна оказалась классическая математическая запись выражений?

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

11 час назад, Alexeyslav сказал:

Напрямую? Мне всегда казалось что у STM32 слишком слабые выходы чтобы подключать к ним светодиодные индикаторы. Ну, какой-то ток они выдержат... но он значительно меньше чем у других контроллеров.

Под краткой записью я имею ввиду выражения вроде "ODR &= ~catods" - настоящая головоломка когда начинаешь читать и пытаться вникнуть в суть выполняемой функции. Символов вроде меньше, но очевидность стремится к нулю. Такое ощущение что эти выражения придумали программисты-машинисты которым побыстрей бы выдать код на скорости 200 симв/мин. Не понимаю, чем неугодна оказалась классическая математическая запись выражений?

Да, тема подключения индикатора уже обсуждалась в другой ветке. Я по незнанию сначала подключил - все работало. Потом начал читать теорию и был удивлен: должно все сгореть)))) Но я упустил момент динамической индикации: разряды вкл поочередно на короткое время - в итоге ток получается не большой. Плюс современные индикаторы(светодиоды) требуют все меньший ток. Хотя, теперь бы сделал на "ключах".

Я в институте учил Delphi. Работаю "программистом" 1С - для меня битовые операции вообще сложная тема))) Но везде применяется именно сокращенный вид присваивания. Вот и пытаюсь привыкнуть.

Изменено пользователем karomag
Ссылка на комментарий
Поделиться на другие сайты

Импульсный ток так и остаётся высоким. То что средний ток будет меньше практически ничего не значит - это отодвинет лишь тепловой пробой, а превышение максимальных параметров выхода всё ещё остаётся. Сейчас оно работает, а через 500 часов наработки сгорит к чертям порт и делов-то. А, кстати, а что будет с током если выведешь все 8-ки на индикатор?

Ну, сами по себе битовые операции то остаются только такая краткая их форма записи не очевидна и сбивает с толку. Где-то она уместна, но зачем пихать её во все щели, даже на линейный участок алгоритма где должна быть очевидность а не краткость записи(хотя вот не уверен что в нынешнем С вообще ещё можно использовать математическую запись). Это что-то вроде моды, очень заразно но не значит что так надо делать всегда и везде... Но это дело такое.

Изменено пользователем Alexeyslav

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

В 14.11.2017 в 01:23, Alexeyslav сказал:

Сейчас оно работает, а через 500 часов наработки сгорит к чертям порт и делов-то. А, кстати, а что будет с током если выведешь все 8-ки на индикатор?

Гипотетически все 8 не будут выводится. Но вы имеете, ввиду что ток будет слишком большим для всего МК?

Это первый проект на STM32. Были сомнения, что я вообще смогу его реализовать, поэтому сильно в дебри не лез... Вообще в планах, сделать индикацию на двух 74HC495. Слышал, что есть какие-то спец драйверы для семисегментников. Но мне кажется это гораздо сложнее.

Ссылка на комментарий
Поделиться на другие сайты

В 14.11.2017 в 01:23, Alexeyslav сказал:

Импульсный ток так и остаётся высоким. То что средний ток будет меньше практически ничего не значит - это отодвинет лишь тепловой пробой, а превышение максимальных параметров выхода всё ещё остаётся. Сейчас оно работает, а через 500 часов наработки сгорит к чертям порт и делов-то. А, кстати, а что будет с током если выведешь все 8-ки на индикатор?

Я на АТмеле-АВРах пробовал - если ток превышает предельный, падает напряжение которое нога выдает для единицы, для 5-вольтной логики у меня падало до 3,5 вольт. То есть начинает сказываться сопротивление транзистора (грубо говоря) ноги (пина)! Но все работало ни чего не сгорело!!!

Изменено пользователем ruhi

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

Ну да... и 60мВт тепла выделяется на выходном транзисторе порта, один может и ничего но если несколько нагрузить до предела уже может выйти из строя что-то. А вообще работа в предельном режиме сильно сокращает ресурс элемента, вплоть до нескольких минут работы. Забавно было смотреть как советский светодиод АЛ307 работает при 100мА... но он работал же! Недолго...

Цитата

Но вы имеете, ввиду что ток будет слишком большим для всего МК?

В даташите указан ток максимальный для одного пина, ограничен для группы(весь порт или по 8 бит) и для выводов питания всего контроллера отдельно. Причем надо смотреть какой именно ток ограничен - импульсный или в целом. Ну и обращать внимание на абсолютные ограничения - их нельзя превышать НИ В КОЕМ СЛУЧАЕ. Полупроводники конечно имеют запас, но работа в околопредельном режиме всегда сокращает ресурс полупроводника.

Ну вот у вас получилось 25мА, это ток который при "8" будет течь через один общий пин, вроде же это больше чем разрешённый? А если он на том же порту что и сегменты... как-то не очень выходит.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

14 часа назад, Alexeyslav сказал:

Ну вот у вас получилось 25мА, это ток который при "8" будет течь через один общий пин, вроде же это больше чем разрешённый? А если он на том же порту что и сегменты... как-то не очень выходит.

Это максимальный, насколько я понял из datasheet на МК на пин. Да общий пин на том же порте...

Ссылка на комментарий
Поделиться на другие сайты

Вот это как раз плохо. Может и поработает так какое-то время, а потом внезапно порт перестанет работать... При нагреве чипа(летом?) всё станет ещё хуже - нагрузочная способность порта уменьшится.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

В 12.11.2017 в 22:01, karomag сказал:

#define SEG_G GPIO_Pin_6

//Собираем цифры из сегментов

#define DIG0 ( SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F )

Вы сегменты с разрядами не перепутали часом? Сегмент это часть одной цифры, а разряд - номер цифры.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

В 21.11.2017 в 18:36, COKPOWEHEU сказал:

Вы сегменты с разрядами не перепутали часом? Сегмент это часть одной цифры, а разряд - номер цифры.

А с чего такой вопрос? Все так и есть.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...